siesa-ui-kit 1.0.4 → 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 (541) hide show
  1. package/README.md +89 -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 +2401 -2445
  6. package/claude/prompts/component-template.md +121 -121
  7. package/claude/settings.local.json +61 -72
  8. package/docs/border-radius.md +1261 -1261
  9. package/docs/colors.md +832 -832
  10. package/docs/dark-mode-guide.md +1426 -1426
  11. package/docs/filters.md +1243 -1243
  12. package/docs/icons.md +1283 -1264
  13. package/docs/shadows.md +1377 -1377
  14. package/docs/spacing.md +1684 -1684
  15. package/docs/typography.md +1268 -1268
  16. package/package.json +83 -111
  17. package/postcss.config.cjs +6 -6
  18. package/src/App.css +42 -42
  19. package/src/App.tsx +8 -8
  20. package/src/ButtonTest.tsx +147 -147
  21. package/src/assets/fonts/README.md +261 -261
  22. package/src/components/Alert/Alert.stories.tsx +332 -332
  23. package/src/components/Alert/Alert.tsx +106 -106
  24. package/src/components/Alert/Alert.types.ts +54 -54
  25. package/src/components/Avatar/Avatar.stories.tsx +494 -494
  26. package/src/components/Avatar/Avatar.tsx +143 -143
  27. package/src/components/Avatar/Avatar.types.ts +53 -53
  28. package/src/components/Badge/Badge.stories.tsx +339 -339
  29. package/src/components/Badge/Badge.tsx +278 -278
  30. package/src/components/Badge/Badge.types.ts +58 -58
  31. package/src/components/Button/Button.stories.tsx +950 -950
  32. package/src/components/Button/Button.tsx +337 -337
  33. package/src/components/Button/Button.types.ts +180 -180
  34. package/src/components/Button/icons.tsx +87 -48
  35. package/src/components/Button/index.ts +3 -3
  36. package/src/components/Checkbox/Checkbox.stories.tsx +453 -453
  37. package/src/components/Checkbox/Checkbox.tsx +208 -208
  38. package/src/components/Checkbox/Checkbox.types.ts +61 -61
  39. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
  40. package/src/components/DescriptionList/DescriptionList.tsx +96 -96
  41. package/src/components/DescriptionList/DescriptionList.types.ts +29 -29
  42. package/src/components/Divider/Divider.stories.tsx +263 -263
  43. package/src/components/Divider/Divider.tsx +80 -80
  44. package/src/components/Divider/Divider.types.ts +24 -24
  45. package/src/components/Dropdown/Dropdown.stories.tsx +552 -552
  46. package/src/components/Dropdown/Dropdown.tsx +422 -422
  47. package/src/components/Dropdown/Dropdown.types.ts +146 -146
  48. package/src/components/Dropdown/README.md +266 -266
  49. package/src/components/Dropdown/icons.tsx +72 -72
  50. package/src/components/Dropdown/index.ts +8 -8
  51. package/src/components/Input/Input.stories.tsx +583 -583
  52. package/src/components/Input/Input.tsx +204 -204
  53. package/src/components/Input/Input.types.ts +80 -80
  54. package/src/components/Input/icons.tsx +145 -145
  55. package/src/components/Input/index.ts +2 -2
  56. package/src/components/LoginView/LoginView.stories.tsx +148 -148
  57. package/src/components/LoginView/LoginView.tsx +426 -426
  58. package/src/components/LoginView/LoginView.types.ts +52 -52
  59. package/src/components/LoginView/README.md +396 -396
  60. package/src/components/LoginView/icons.tsx +85 -85
  61. package/src/components/LoginView/index.ts +3 -3
  62. package/src/components/Navbar/Navbar.stories.tsx +810 -810
  63. package/src/components/Navbar/Navbar.tsx +755 -755
  64. package/src/components/Navbar/Navbar.types.ts +219 -219
  65. package/src/components/Navbar/README.md +279 -279
  66. package/src/components/Navbar/icons.tsx +102 -102
  67. package/src/components/Navbar/index.ts +8 -8
  68. package/src/components/NavigationBar/NavigationBar.stories.tsx +406 -406
  69. package/src/components/NavigationBar/NavigationBar.tsx +246 -246
  70. package/src/components/NavigationBar/NavigationBar.types.ts +74 -74
  71. package/src/components/NavigationBar/README.md +469 -469
  72. package/src/components/NavigationBar/index.ts +2 -2
  73. package/src/components/NavigationRail/NavigationRail.stories.tsx +417 -417
  74. package/src/components/NavigationRail/NavigationRail.tsx +418 -418
  75. package/src/components/NavigationRail/NavigationRail.types.ts +109 -109
  76. package/src/components/NavigationRail/README.md +224 -224
  77. package/src/components/NavigationRail/index.ts +2 -2
  78. package/src/components/Notification/Notification.stories.tsx +513 -513
  79. package/src/components/Notification/Notification.tsx +145 -145
  80. package/src/components/Notification/Notification.types.ts +142 -142
  81. package/src/components/Notification/README.md +409 -409
  82. package/src/components/Notification/index.ts +3 -3
  83. package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
  84. package/src/components/POSConvention/POSConvention.tsx +129 -129
  85. package/src/components/POSConvention/POSConvention.types.ts +38 -38
  86. package/src/components/POSConvention/README.md +123 -123
  87. package/src/components/POSConvention/icons.tsx +45 -45
  88. package/src/components/POSConvention/index.ts +3 -3
  89. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
  90. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
  91. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
  92. package/src/components/POSLocationButton/README.md +253 -253
  93. package/src/components/POSLocationButton/icons.tsx +120 -120
  94. package/src/components/POSLocationButton/index.ts +14 -14
  95. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
  96. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
  97. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
  98. package/src/components/POSNumberButton/README.md +321 -321
  99. package/src/components/POSNumberButton/index.ts +3 -3
  100. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
  101. package/src/components/POSProductButton/POSProductButton.tsx +152 -152
  102. package/src/components/POSProductButton/POSProductButton.types.ts +46 -46
  103. package/src/components/POSProductButton/README.md +269 -269
  104. package/src/components/POSProductButton/index.ts +2 -2
  105. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
  106. package/src/components/POSProductCard/POSProductCard.tsx +208 -208
  107. package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
  108. package/src/components/POSProductCard/README.md +179 -179
  109. package/src/components/POSProductCard/icons.tsx +26 -26
  110. package/src/components/POSProductCard/index.ts +2 -2
  111. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
  112. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
  113. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
  114. package/src/components/POSProductSidebarItems/README.md +198 -198
  115. package/src/components/POSProductSidebarItems/icons.tsx +21 -21
  116. package/src/components/POSProductSidebarItems/index.ts +3 -3
  117. package/src/components/POSTable/POSTable.stories.tsx +737 -737
  118. package/src/components/POSTable/POSTable.tsx +401 -401
  119. package/src/components/POSTable/POSTable.types.ts +83 -83
  120. package/src/components/POSTable/README.md +286 -286
  121. package/src/components/POSTable/index.ts +7 -7
  122. package/src/components/Pagination/Pagination.stories.tsx +555 -555
  123. package/src/components/Pagination/Pagination.tsx +286 -286
  124. package/src/components/Pagination/Pagination.types.ts +93 -93
  125. package/src/components/Pagination/README.md +298 -298
  126. package/src/components/Pagination/icons.tsx +47 -47
  127. package/src/components/Pagination/index.ts +3 -3
  128. package/src/components/Quantity/Quantity.stories.tsx +457 -457
  129. package/src/components/Quantity/Quantity.tsx +289 -289
  130. package/src/components/Quantity/Quantity.types.ts +70 -70
  131. package/src/components/Radio/Radio.stories.tsx +523 -523
  132. package/src/components/Radio/Radio.tsx +170 -170
  133. package/src/components/Radio/Radio.types.ts +122 -122
  134. package/src/components/Select/README.md +299 -299
  135. package/src/components/Select/Select.stories.tsx +673 -705
  136. package/src/components/Select/Select.tsx +454 -457
  137. package/src/components/Select/Select.types.ts +148 -148
  138. package/src/components/Select/icons.tsx +50 -25
  139. package/src/components/Select/index.ts +3 -3
  140. package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
  141. package/src/components/SignUpView/SignUpView.tsx +503 -503
  142. package/src/components/SignUpView/SignUpView.types.ts +58 -58
  143. package/src/components/SignUpView/icons.tsx +71 -71
  144. package/src/components/SignUpView/index.ts +3 -3
  145. package/src/components/Switch/README.md +112 -112
  146. package/src/components/Switch/Switch.stories.tsx +550 -550
  147. package/src/components/Switch/Switch.tsx +246 -246
  148. package/src/components/Switch/Switch.types.ts +67 -67
  149. package/src/components/Table/README.md +369 -369
  150. package/src/components/Table/Table.stories.tsx +805 -805
  151. package/src/components/Table/Table.tsx +688 -688
  152. package/src/components/Table/Table.types.ts +204 -204
  153. package/src/components/Table/index.ts +9 -9
  154. package/src/components/Tabs/README.md +201 -201
  155. package/src/components/Tabs/Tabs.stories.tsx +580 -580
  156. package/src/components/Tabs/Tabs.tsx +356 -356
  157. package/src/components/Tabs/Tabs.types.ts +127 -127
  158. package/src/components/Tabs/icons.tsx +129 -129
  159. package/src/components/Tabs/index.ts +11 -11
  160. package/src/components/Textarea/Textarea.stories.tsx +535 -535
  161. package/src/components/Textarea/Textarea.tsx +188 -188
  162. package/src/components/Textarea/Textarea.types.ts +54 -54
  163. package/src/context/ThemeContext.tsx +99 -99
  164. package/src/context/index.ts +1 -1
  165. package/src/index.css +29 -29
  166. package/src/index.ts +39 -133
  167. package/src/main.tsx +10 -10
  168. package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
  169. package/src/views/ProductsView/ProductsView.tsx +480 -480
  170. package/src/views/ProductsView/ProductsView.types.ts +238 -238
  171. package/src/views/ProductsView/README.md +312 -312
  172. package/src/views/ProductsView/icons.tsx +38 -38
  173. package/src/views/ProductsView/index.ts +8 -8
  174. package/src/views/RecoverPasswordView/README.md +269 -269
  175. package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +131 -131
  176. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
  177. package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +56 -56
  178. package/src/views/RecoverPasswordView/icons.tsx +17 -17
  179. package/src/views/RecoverPasswordView/index.ts +2 -2
  180. package/src/views/TableLayoutView/README.md +268 -268
  181. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
  182. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
  183. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
  184. package/src/views/TableLayoutView/icons.tsx +113 -113
  185. package/src/views/TableLayoutView/index.ts +6 -6
  186. package/storybook/main.ts +19 -19
  187. package/storybook/preview.tsx +84 -84
  188. package/storybook/vitest.setup.ts +6 -6
  189. package/tailwind.config.js +128 -128
  190. package/claude/prompts/siesa-ui-kit.md +0 -28
  191. package/dist/ButtonTest.d.ts +0 -6
  192. package/dist/ButtonTest.d.ts.map +0 -1
  193. package/dist/components/Alert/Alert.d.ts +0 -23
  194. package/dist/components/Alert/Alert.d.ts.map +0 -1
  195. package/dist/components/Alert/Alert.types.d.ts +0 -46
  196. package/dist/components/Alert/Alert.types.d.ts.map +0 -1
  197. package/dist/components/Avatar/Avatar.d.ts +0 -41
  198. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  199. package/dist/components/Avatar/Avatar.types.d.ts +0 -46
  200. package/dist/components/Avatar/Avatar.types.d.ts.map +0 -1
  201. package/dist/components/Badge/Badge.d.ts +0 -42
  202. package/dist/components/Badge/Badge.d.ts.map +0 -1
  203. package/dist/components/Badge/Badge.types.d.ts +0 -32
  204. package/dist/components/Badge/Badge.types.d.ts.map +0 -1
  205. package/dist/components/Button/Button.d.ts +0 -84
  206. package/dist/components/Button/Button.d.ts.map +0 -1
  207. package/dist/components/Button/Button.types.d.ts +0 -162
  208. package/dist/components/Button/Button.types.d.ts.map +0 -1
  209. package/dist/components/Button/icons.d.ts +0 -27
  210. package/dist/components/Button/icons.d.ts.map +0 -1
  211. package/dist/components/Button/index.d.ts +0 -4
  212. package/dist/components/Button/index.d.ts.map +0 -1
  213. package/dist/components/Checkbox/Checkbox.d.ts +0 -31
  214. package/dist/components/Checkbox/Checkbox.d.ts.map +0 -1
  215. package/dist/components/Checkbox/Checkbox.types.d.ts +0 -53
  216. package/dist/components/Checkbox/Checkbox.types.d.ts.map +0 -1
  217. package/dist/components/DescriptionList/DescriptionList.d.ts +0 -38
  218. package/dist/components/DescriptionList/DescriptionList.d.ts.map +0 -1
  219. package/dist/components/DescriptionList/DescriptionList.types.d.ts +0 -27
  220. package/dist/components/DescriptionList/DescriptionList.types.d.ts.map +0 -1
  221. package/dist/components/Divider/Divider.d.ts +0 -33
  222. package/dist/components/Divider/Divider.d.ts.map +0 -1
  223. package/dist/components/Divider/Divider.types.d.ts +0 -22
  224. package/dist/components/Divider/Divider.types.d.ts.map +0 -1
  225. package/dist/components/Dropdown/Dropdown.d.ts +0 -66
  226. package/dist/components/Dropdown/Dropdown.d.ts.map +0 -1
  227. package/dist/components/Dropdown/Dropdown.types.d.ts +0 -124
  228. package/dist/components/Dropdown/Dropdown.types.d.ts.map +0 -1
  229. package/dist/components/Dropdown/icons.d.ts +0 -10
  230. package/dist/components/Dropdown/icons.d.ts.map +0 -1
  231. package/dist/components/Dropdown/index.d.ts +0 -4
  232. package/dist/components/Dropdown/index.d.ts.map +0 -1
  233. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts +0 -101
  234. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +0 -1
  235. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +0 -116
  236. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +0 -1
  237. package/dist/components/DropdownItemCollapsible/icons.d.ts +0 -19
  238. package/dist/components/DropdownItemCollapsible/icons.d.ts.map +0 -1
  239. package/dist/components/DropdownItemCollapsible/index.d.ts +0 -9
  240. package/dist/components/DropdownItemCollapsible/index.d.ts.map +0 -1
  241. package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts +0 -75
  242. package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts.map +0 -1
  243. package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts +0 -85
  244. package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts.map +0 -1
  245. package/dist/components/DropdownItemHeading/icons.d.ts +0 -48
  246. package/dist/components/DropdownItemHeading/icons.d.ts.map +0 -1
  247. package/dist/components/DropdownItemHeading/index.d.ts +0 -4
  248. package/dist/components/DropdownItemHeading/index.d.ts.map +0 -1
  249. package/dist/components/Input/Input.d.ts +0 -40
  250. package/dist/components/Input/Input.d.ts.map +0 -1
  251. package/dist/components/Input/Input.types.d.ts +0 -71
  252. package/dist/components/Input/Input.types.d.ts.map +0 -1
  253. package/dist/components/Input/icons.d.ts +0 -15
  254. package/dist/components/Input/icons.d.ts.map +0 -1
  255. package/dist/components/Input/index.d.ts +0 -3
  256. package/dist/components/Input/index.d.ts.map +0 -1
  257. package/dist/components/LoginView/LoginView.d.ts +0 -36
  258. package/dist/components/LoginView/LoginView.d.ts.map +0 -1
  259. package/dist/components/LoginView/LoginView.types.d.ts +0 -46
  260. package/dist/components/LoginView/LoginView.types.d.ts.map +0 -1
  261. package/dist/components/LoginView/icons.d.ts +0 -18
  262. package/dist/components/LoginView/icons.d.ts.map +0 -1
  263. package/dist/components/LoginView/index.d.ts +0 -4
  264. package/dist/components/LoginView/index.d.ts.map +0 -1
  265. package/dist/components/Navbar/Navbar.d.ts +0 -63
  266. package/dist/components/Navbar/Navbar.d.ts.map +0 -1
  267. package/dist/components/Navbar/Navbar.types.d.ts +0 -194
  268. package/dist/components/Navbar/Navbar.types.d.ts.map +0 -1
  269. package/dist/components/Navbar/icons.d.ts +0 -12
  270. package/dist/components/Navbar/icons.d.ts.map +0 -1
  271. package/dist/components/Navbar/index.d.ts +0 -4
  272. package/dist/components/Navbar/index.d.ts.map +0 -1
  273. package/dist/components/NavigationBar/NavigationBar.d.ts +0 -75
  274. package/dist/components/NavigationBar/NavigationBar.d.ts.map +0 -1
  275. package/dist/components/NavigationBar/NavigationBar.types.d.ts +0 -63
  276. package/dist/components/NavigationBar/NavigationBar.types.d.ts.map +0 -1
  277. package/dist/components/NavigationBar/index.d.ts +0 -3
  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 +0 -3
  284. package/dist/components/NavigationRail/index.d.ts.map +0 -1
  285. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +0 -122
  286. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +0 -1
  287. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +0 -139
  288. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +0 -1
  289. package/dist/components/NavigationRailCommercial/icons.d.ts +0 -33
  290. package/dist/components/NavigationRailCommercial/icons.d.ts.map +0 -1
  291. package/dist/components/NavigationRailCommercial/index.d.ts +0 -4
  292. package/dist/components/NavigationRailCommercial/index.d.ts.map +0 -1
  293. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts +0 -90
  294. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +0 -1
  295. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +0 -162
  296. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +0 -1
  297. package/dist/components/NavigationRailItem/index.d.ts +0 -3
  298. package/dist/components/NavigationRailItem/index.d.ts.map +0 -1
  299. package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts +0 -124
  300. package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts.map +0 -1
  301. package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts +0 -154
  302. package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts.map +0 -1
  303. package/dist/components/NavigationRailPanel/index.d.ts +0 -3
  304. package/dist/components/NavigationRailPanel/index.d.ts.map +0 -1
  305. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts +0 -99
  306. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +0 -1
  307. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +0 -152
  308. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +0 -1
  309. package/dist/components/NavigationRailTypes/icons.d.ts +0 -44
  310. package/dist/components/NavigationRailTypes/icons.d.ts.map +0 -1
  311. package/dist/components/NavigationRailTypes/index.d.ts +0 -4
  312. package/dist/components/NavigationRailTypes/index.d.ts.map +0 -1
  313. package/dist/components/Notification/Notification.d.ts +0 -52
  314. package/dist/components/Notification/Notification.d.ts.map +0 -1
  315. package/dist/components/Notification/Notification.types.d.ts +0 -138
  316. package/dist/components/Notification/Notification.types.d.ts.map +0 -1
  317. package/dist/components/Notification/index.d.ts +0 -3
  318. package/dist/components/Notification/index.d.ts.map +0 -1
  319. package/dist/components/POSConvention/POSConvention.d.ts +0 -55
  320. package/dist/components/POSConvention/POSConvention.d.ts.map +0 -1
  321. package/dist/components/POSConvention/POSConvention.types.d.ts +0 -37
  322. package/dist/components/POSConvention/POSConvention.types.d.ts.map +0 -1
  323. package/dist/components/POSConvention/icons.d.ts +0 -21
  324. package/dist/components/POSConvention/icons.d.ts.map +0 -1
  325. package/dist/components/POSConvention/index.d.ts +0 -4
  326. package/dist/components/POSConvention/index.d.ts.map +0 -1
  327. package/dist/components/POSLocationButton/POSLocationButton.d.ts +0 -73
  328. package/dist/components/POSLocationButton/POSLocationButton.d.ts.map +0 -1
  329. package/dist/components/POSLocationButton/POSLocationButton.types.d.ts +0 -75
  330. package/dist/components/POSLocationButton/POSLocationButton.types.d.ts.map +0 -1
  331. package/dist/components/POSLocationButton/icons.d.ts +0 -37
  332. package/dist/components/POSLocationButton/icons.d.ts.map +0 -1
  333. package/dist/components/POSLocationButton/index.d.ts +0 -4
  334. package/dist/components/POSLocationButton/index.d.ts.map +0 -1
  335. package/dist/components/POSNumberButton/POSNumberButton.d.ts +0 -61
  336. package/dist/components/POSNumberButton/POSNumberButton.d.ts.map +0 -1
  337. package/dist/components/POSNumberButton/POSNumberButton.types.d.ts +0 -43
  338. package/dist/components/POSNumberButton/POSNumberButton.types.d.ts.map +0 -1
  339. package/dist/components/POSNumberButton/index.d.ts +0 -3
  340. package/dist/components/POSNumberButton/index.d.ts.map +0 -1
  341. package/dist/components/POSProductButton/POSProductButton.d.ts +0 -59
  342. package/dist/components/POSProductButton/POSProductButton.d.ts.map +0 -1
  343. package/dist/components/POSProductButton/POSProductButton.types.d.ts +0 -40
  344. package/dist/components/POSProductButton/POSProductButton.types.d.ts.map +0 -1
  345. package/dist/components/POSProductButton/index.d.ts +0 -3
  346. package/dist/components/POSProductButton/index.d.ts.map +0 -1
  347. package/dist/components/POSProductCard/POSProductCard.d.ts +0 -68
  348. package/dist/components/POSProductCard/POSProductCard.d.ts.map +0 -1
  349. package/dist/components/POSProductCard/POSProductCard.types.d.ts +0 -67
  350. package/dist/components/POSProductCard/POSProductCard.types.d.ts.map +0 -1
  351. package/dist/components/POSProductCard/icons.d.ts +0 -10
  352. package/dist/components/POSProductCard/icons.d.ts.map +0 -1
  353. package/dist/components/POSProductCard/index.d.ts +0 -3
  354. package/dist/components/POSProductCard/index.d.ts.map +0 -1
  355. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts +0 -57
  356. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts.map +0 -1
  357. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts +0 -85
  358. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts.map +0 -1
  359. package/dist/components/POSProductSidebarItems/icons.d.ts +0 -9
  360. package/dist/components/POSProductSidebarItems/icons.d.ts.map +0 -1
  361. package/dist/components/POSProductSidebarItems/index.d.ts +0 -4
  362. package/dist/components/POSProductSidebarItems/index.d.ts.map +0 -1
  363. package/dist/components/POSTable/POSTable.d.ts +0 -75
  364. package/dist/components/POSTable/POSTable.d.ts.map +0 -1
  365. package/dist/components/POSTable/POSTable.types.d.ts +0 -71
  366. package/dist/components/POSTable/POSTable.types.d.ts.map +0 -1
  367. package/dist/components/POSTable/index.d.ts +0 -3
  368. package/dist/components/POSTable/index.d.ts.map +0 -1
  369. package/dist/components/Pagination/Pagination.d.ts +0 -29
  370. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  371. package/dist/components/Pagination/Pagination.types.d.ts +0 -79
  372. package/dist/components/Pagination/Pagination.types.d.ts.map +0 -1
  373. package/dist/components/Pagination/icons.d.ts +0 -18
  374. package/dist/components/Pagination/icons.d.ts.map +0 -1
  375. package/dist/components/Pagination/index.d.ts +0 -4
  376. package/dist/components/Pagination/index.d.ts.map +0 -1
  377. package/dist/components/Quantity/Quantity.d.ts +0 -38
  378. package/dist/components/Quantity/Quantity.d.ts.map +0 -1
  379. package/dist/components/Quantity/Quantity.types.d.ts +0 -59
  380. package/dist/components/Quantity/Quantity.types.d.ts.map +0 -1
  381. package/dist/components/Radio/Radio.d.ts +0 -45
  382. package/dist/components/Radio/Radio.d.ts.map +0 -1
  383. package/dist/components/Radio/Radio.types.d.ts +0 -115
  384. package/dist/components/Radio/Radio.types.d.ts.map +0 -1
  385. package/dist/components/Select/Select.d.ts +0 -37
  386. package/dist/components/Select/Select.d.ts.map +0 -1
  387. package/dist/components/Select/Select.types.d.ts +0 -124
  388. package/dist/components/Select/Select.types.d.ts.map +0 -1
  389. package/dist/components/Select/icons.d.ts +0 -20
  390. package/dist/components/Select/icons.d.ts.map +0 -1
  391. package/dist/components/Select/index.d.ts +0 -4
  392. package/dist/components/Select/index.d.ts.map +0 -1
  393. package/dist/components/SignUpView/SignUpView.d.ts +0 -38
  394. package/dist/components/SignUpView/SignUpView.d.ts.map +0 -1
  395. package/dist/components/SignUpView/SignUpView.types.d.ts +0 -51
  396. package/dist/components/SignUpView/SignUpView.types.d.ts.map +0 -1
  397. package/dist/components/SignUpView/icons.d.ts +0 -18
  398. package/dist/components/SignUpView/icons.d.ts.map +0 -1
  399. package/dist/components/SignUpView/index.d.ts +0 -4
  400. package/dist/components/SignUpView/index.d.ts.map +0 -1
  401. package/dist/components/Switch/Switch.d.ts +0 -46
  402. package/dist/components/Switch/Switch.d.ts.map +0 -1
  403. package/dist/components/Switch/Switch.types.d.ts +0 -58
  404. package/dist/components/Switch/Switch.types.d.ts.map +0 -1
  405. package/dist/components/Table/Table.d.ts +0 -64
  406. package/dist/components/Table/Table.d.ts.map +0 -1
  407. package/dist/components/Table/Table.types.d.ts +0 -173
  408. package/dist/components/Table/Table.types.d.ts.map +0 -1
  409. package/dist/components/Table/index.d.ts +0 -3
  410. package/dist/components/Table/index.d.ts.map +0 -1
  411. package/dist/components/Tabs/Tabs.d.ts +0 -76
  412. package/dist/components/Tabs/Tabs.d.ts.map +0 -1
  413. package/dist/components/Tabs/Tabs.types.d.ts +0 -107
  414. package/dist/components/Tabs/Tabs.types.d.ts.map +0 -1
  415. package/dist/components/Tabs/icons.d.ts +0 -45
  416. package/dist/components/Tabs/icons.d.ts.map +0 -1
  417. package/dist/components/Tabs/index.d.ts +0 -4
  418. package/dist/components/Tabs/index.d.ts.map +0 -1
  419. package/dist/components/Textarea/Textarea.d.ts +0 -38
  420. package/dist/components/Textarea/Textarea.d.ts.map +0 -1
  421. package/dist/components/Textarea/Textarea.types.d.ts +0 -46
  422. package/dist/components/Textarea/Textarea.types.d.ts.map +0 -1
  423. package/dist/context/ThemeContext.d.ts +0 -46
  424. package/dist/context/ThemeContext.d.ts.map +0 -1
  425. package/dist/context/index.d.ts +0 -2
  426. package/dist/context/index.d.ts.map +0 -1
  427. package/dist/index.d.ts +0 -88
  428. package/dist/index.d.ts.map +0 -1
  429. package/dist/siesa-ui-kit.cjs +0 -1474
  430. package/dist/siesa-ui-kit.cjs.map +0 -1
  431. package/dist/siesa-ui-kit.mjs +0 -9580
  432. package/dist/siesa-ui-kit.mjs.map +0 -1
  433. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +0 -48
  434. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +0 -1
  435. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +0 -49
  436. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +0 -1
  437. package/dist/views/LayoutCommercial/index.d.ts +0 -3
  438. package/dist/views/LayoutCommercial/index.d.ts.map +0 -1
  439. package/dist/views/ListView/ListView.d.ts +0 -47
  440. package/dist/views/ListView/ListView.d.ts.map +0 -1
  441. package/dist/views/ListView/ListView.types.d.ts +0 -177
  442. package/dist/views/ListView/ListView.types.d.ts.map +0 -1
  443. package/dist/views/ListView/icons.d.ts +0 -60
  444. package/dist/views/ListView/icons.d.ts.map +0 -1
  445. package/dist/views/ListView/index.d.ts +0 -3
  446. package/dist/views/ListView/index.d.ts.map +0 -1
  447. package/dist/views/LoginView/LoginView.d.ts +0 -36
  448. package/dist/views/LoginView/LoginView.d.ts.map +0 -1
  449. package/dist/views/LoginView/LoginView.types.d.ts +0 -46
  450. package/dist/views/LoginView/LoginView.types.d.ts.map +0 -1
  451. package/dist/views/LoginView/icons.d.ts +0 -18
  452. package/dist/views/LoginView/icons.d.ts.map +0 -1
  453. package/dist/views/LoginView/index.d.ts +0 -4
  454. package/dist/views/LoginView/index.d.ts.map +0 -1
  455. package/dist/views/ProductsView/ProductsView.d.ts +0 -56
  456. package/dist/views/ProductsView/ProductsView.d.ts.map +0 -1
  457. package/dist/views/ProductsView/ProductsView.types.d.ts +0 -184
  458. package/dist/views/ProductsView/ProductsView.types.d.ts.map +0 -1
  459. package/dist/views/ProductsView/icons.d.ts +0 -12
  460. package/dist/views/ProductsView/icons.d.ts.map +0 -1
  461. package/dist/views/ProductsView/index.d.ts +0 -3
  462. package/dist/views/ProductsView/index.d.ts.map +0 -1
  463. package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts +0 -34
  464. package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts.map +0 -1
  465. package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts +0 -50
  466. package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts.map +0 -1
  467. package/dist/views/RecoverPasswordView/icons.d.ts +0 -9
  468. package/dist/views/RecoverPasswordView/icons.d.ts.map +0 -1
  469. package/dist/views/RecoverPasswordView/index.d.ts +0 -3
  470. package/dist/views/RecoverPasswordView/index.d.ts.map +0 -1
  471. package/dist/views/SignUpView/SignUpView.d.ts +0 -38
  472. package/dist/views/SignUpView/SignUpView.d.ts.map +0 -1
  473. package/dist/views/SignUpView/SignUpView.types.d.ts +0 -51
  474. package/dist/views/SignUpView/SignUpView.types.d.ts.map +0 -1
  475. package/dist/views/SignUpView/icons.d.ts +0 -18
  476. package/dist/views/SignUpView/icons.d.ts.map +0 -1
  477. package/dist/views/SignUpView/index.d.ts +0 -4
  478. package/dist/views/SignUpView/index.d.ts.map +0 -1
  479. package/dist/views/TableLayoutView/TableLayoutView.d.ts +0 -46
  480. package/dist/views/TableLayoutView/TableLayoutView.d.ts.map +0 -1
  481. package/dist/views/TableLayoutView/TableLayoutView.types.d.ts +0 -170
  482. package/dist/views/TableLayoutView/TableLayoutView.types.d.ts.map +0 -1
  483. package/dist/views/TableLayoutView/icons.d.ts +0 -27
  484. package/dist/views/TableLayoutView/icons.d.ts.map +0 -1
  485. package/dist/views/TableLayoutView/index.d.ts +0 -3
  486. package/dist/views/TableLayoutView/index.d.ts.map +0 -1
  487. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +0 -317
  488. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +0 -307
  489. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +0 -136
  490. package/src/components/DropdownItemCollapsible/README.md +0 -264
  491. package/src/components/DropdownItemCollapsible/icons.tsx +0 -57
  492. package/src/components/DropdownItemCollapsible/index.ts +0 -12
  493. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +0 -386
  494. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +0 -216
  495. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +0 -93
  496. package/src/components/DropdownItemHeading/README.md +0 -573
  497. package/src/components/DropdownItemHeading/icons.tsx +0 -125
  498. package/src/components/DropdownItemHeading/index.ts +0 -3
  499. package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +0 -464
  500. package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +0 -301
  501. package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +0 -162
  502. package/src/components/NavigationRailCommercial/README.md +0 -251
  503. package/src/components/NavigationRailCommercial/icons.tsx +0 -54
  504. package/src/components/NavigationRailCommercial/index.ts +0 -6
  505. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +0 -667
  506. package/src/components/NavigationRailItem/NavigationRailItem.tsx +0 -314
  507. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +0 -175
  508. package/src/components/NavigationRailItem/README.md +0 -476
  509. package/src/components/NavigationRailItem/index.ts +0 -2
  510. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +0 -462
  511. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +0 -332
  512. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +0 -178
  513. package/src/components/NavigationRailPanel/README.md +0 -461
  514. package/src/components/NavigationRailPanel/index.ts +0 -6
  515. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +0 -682
  516. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +0 -363
  517. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +0 -178
  518. package/src/components/NavigationRailTypes/README.md +0 -573
  519. package/src/components/NavigationRailTypes/icons.tsx +0 -76
  520. package/src/components/NavigationRailTypes/index.ts +0 -7
  521. package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +0 -374
  522. package/src/views/LayoutCommercial/LayoutCommercial.tsx +0 -125
  523. package/src/views/LayoutCommercial/LayoutCommercial.types.ts +0 -54
  524. package/src/views/LayoutCommercial/README.md +0 -286
  525. package/src/views/LayoutCommercial/index.ts +0 -2
  526. package/src/views/ListView/ListView.stories.tsx +0 -329
  527. package/src/views/ListView/ListView.tsx +0 -570
  528. package/src/views/ListView/ListView.types.ts +0 -211
  529. package/src/views/ListView/icons.tsx +0 -282
  530. package/src/views/ListView/index.ts +0 -11
  531. package/src/views/LoginView/LoginView.stories.tsx +0 -148
  532. package/src/views/LoginView/LoginView.tsx +0 -426
  533. package/src/views/LoginView/LoginView.types.ts +0 -52
  534. package/src/views/LoginView/README.md +0 -396
  535. package/src/views/LoginView/icons.tsx +0 -85
  536. package/src/views/LoginView/index.ts +0 -3
  537. package/src/views/SignUpView/SignUpView.stories.tsx +0 -129
  538. package/src/views/SignUpView/SignUpView.tsx +0 -503
  539. package/src/views/SignUpView/SignUpView.types.ts +0 -58
  540. package/src/views/SignUpView/icons.tsx +0 -71
  541. package/src/views/SignUpView/index.ts +0 -3
package/bin/install.cjs CHANGED
@@ -1,502 +1,502 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs-extra');
4
- const path = require('path');
5
- const readline = require('readline');
6
-
7
- class SiesaUIKitInstaller {
8
- constructor() {
9
- // Definir las carpetas primero (nombres en el paquete vs nombres finales)
10
- this.folderMappings = [
11
- { source: 'claude', target: '.claude' },
12
- { source: 'storybook', target: '.storybook' },
13
- { source: 'docs', target: 'docs' },
14
- { source: 'src', target: 'src' },
15
- { source: 'public', target: 'public' }
16
- ];
17
-
18
- // Lista de archivos que se preservan automáticamente (no se crean backups)
19
- this.ignoredFiles = [];
20
-
21
- this.targetDir = process.cwd();
22
- // Intentar múltiples ubicaciones posibles para el paquete
23
- this.packageDir = this.findPackageDir();
24
-
25
- // Almacenamiento temporal para contenido de archivos ignorados
26
- this.preservedContent = new Map();
27
- }
28
-
29
- showBanner() {
30
- console.log('\n');
31
- console.log('███████╗██╗███████╗███████╗ █████╗ ██╗ ██╗██╗ ██╗ ██╗██╗████████╗');
32
- console.log('██╔════╝██║██╔════╝██╔════╝██╔══██╗ ██║ ██║██║ ██║ ██╔╝██║╚══██╔══╝');
33
- console.log('███████╗██║█████╗ ███████╗███████║ ██║ ██║██║ █████╔╝ ██║ ██║ ');
34
- console.log('╚════██║██║██╔══╝ ╚════██║██╔══██║ ██║ ██║██║ ██╔═██╗ ██║ ██║ ');
35
- console.log('███████║██║███████╗███████║██║ ██║ ╚██████╔╝██║ ██║ ██╗██║ ██║ ');
36
- console.log('╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ');
37
- console.log('');
38
- }
39
-
40
- findPackageDir() {
41
- // Opción 1: directorio padre del bin (instalación normal)
42
- let packageDir = path.dirname(__dirname);
43
-
44
- // Opción 2: si estamos en npx, buscar en node_modules
45
- if (!this.hasRequiredFolders(packageDir)) {
46
- // Para npm 6.14+ y npx, intentar ubicaciones alternativas
47
- const possiblePaths = [
48
- path.join(__dirname, '..'), // bin -> paquete
49
- path.resolve(__dirname, '..'), // alternativa con resolve
50
- path.resolve(__dirname, '..', '..', 'siesa-ui-kit'), // desde node_modules
51
- // Intentar buscar basado en __dirname específicamente para npx
52
- path.resolve(__dirname.replace(/\\bin$|\/bin$/, '')),
53
- process.cwd(), // directorio actual como último recurso
54
- ];
55
-
56
- for (const possiblePath of possiblePaths) {
57
- if (this.hasRequiredFolders(possiblePath)) {
58
- packageDir = possiblePath;
59
- break;
60
- }
61
- }
62
- }
63
-
64
- return packageDir;
65
- }
66
-
67
- hasRequiredFolders(dir) {
68
- return this.folderMappings.some(mapping => {
69
- const folderPath = path.join(dir, mapping.source);
70
- return fs.existsSync(folderPath);
71
- });
72
- }
73
-
74
- async install() {
75
- this.showBanner();
76
- console.log(' Instalando SIESA UI Kit...');
77
-
78
- try {
79
- // Verificar si ya existe una instalación
80
- const hasExistingInstallation = this.checkExistingInstallation();
81
-
82
- if (hasExistingInstallation) {
83
- console.log('🔄 Instalación existente detectada. Actualizando...');
84
- await this.update();
85
- } else {
86
- console.log('✨ Nueva instalación...');
87
- await this.performInstallation();
88
- }
89
-
90
- console.log('✅ SIESA UI Kit instalado correctamente!');
91
- this.showPostInstallMessage();
92
-
93
- } catch (error) {
94
- console.error('❌ Error durante la instalación:', error.message);
95
- process.exit(1);
96
- }
97
- }
98
-
99
- checkExistingInstallation() {
100
- return this.folderMappings.some(mapping => {
101
- const targetPath = path.join(this.targetDir, mapping.target);
102
- return fs.existsSync(targetPath);
103
- });
104
- }
105
-
106
- async checkModifiedFiles() {
107
- const modifiedFiles = [];
108
-
109
- for (const mapping of this.folderMappings) {
110
- const sourcePath = path.join(this.packageDir, mapping.source);
111
- const targetPath = path.join(this.targetDir, mapping.target);
112
-
113
- if (!fs.existsSync(sourcePath) || !fs.existsSync(targetPath)) {
114
- continue;
115
- }
116
-
117
- // Obtener todos los archivos recursivamente
118
- const sourceFiles = await this.getAllFiles(sourcePath);
119
-
120
- for (const sourceFile of sourceFiles) {
121
- const relativePath = path.relative(sourcePath, sourceFile);
122
- const targetFile = path.join(targetPath, relativePath);
123
-
124
- if (fs.existsSync(targetFile)) {
125
- try {
126
- // Comparar contenido de archivos
127
- const sourceContent = await fs.readFile(sourceFile, 'utf8');
128
- const targetContent = await fs.readFile(targetFile, 'utf8');
129
-
130
- if (sourceContent !== targetContent) {
131
- modifiedFiles.push({
132
- folder: mapping.target,
133
- file: relativePath,
134
- fullPath: targetFile,
135
- is_ignored: this.ignoredFiles.includes(relativePath)
136
- });
137
- }
138
- } catch (error) {
139
- // Si no se puede leer como texto, comparar como buffer (archivos binarios)
140
- const sourceBuffer = await fs.readFile(sourceFile);
141
- const targetBuffer = await fs.readFile(targetFile);
142
-
143
- if (!sourceBuffer.equals(targetBuffer)) {
144
- modifiedFiles.push({
145
- folder: mapping.target,
146
- file: relativePath,
147
- fullPath: targetFile,
148
- is_ignored: this.ignoredFiles.includes(relativePath)
149
- });
150
- }
151
- }
152
- }
153
- }
154
- }
155
-
156
- return modifiedFiles;
157
- }
158
-
159
- async getAllFiles(dir) {
160
- const files = [];
161
- const items = await fs.readdir(dir);
162
-
163
- for (const item of items) {
164
- const fullPath = path.join(dir, item);
165
- const stat = await fs.stat(fullPath);
166
-
167
- if (stat.isDirectory()) {
168
- const subFiles = await this.getAllFiles(fullPath);
169
- files.push(...subFiles);
170
- } else {
171
- files.push(fullPath);
172
- }
173
- }
174
-
175
- return files;
176
- }
177
-
178
- async promptUser(modifiedFiles) {
179
-
180
- const hasNonIgnoredFiles = modifiedFiles.some(file => file.is_ignored == false)
181
- if (!hasNonIgnoredFiles) return '2'
182
-
183
- console.log('\n⚠️ Se detectaron archivos modificados:');
184
-
185
- // Agrupar por carpeta
186
- const filesByFolder = {};
187
- modifiedFiles.forEach(item => {
188
- if (!filesByFolder[item.folder]) {
189
- filesByFolder[item.folder] = [];
190
- }
191
- filesByFolder[item.folder].push(item.file);
192
- });
193
-
194
- // Mostrar archivos modificados por carpeta
195
- Object.keys(filesByFolder).forEach(folder => {
196
- console.log(`\n📁 ${folder}:`);
197
- filesByFolder[folder].forEach(file => {
198
- console.log(` - ${file}`);
199
- });
200
- });
201
-
202
- console.log('\n¿Qué deseas hacer?');
203
- console.log('1. Reemplazar todos los archivos (se perderán las modificaciones)');
204
- console.log('2. Hacer backup de archivos modificados (se agregarán con sufijo _bk)');
205
-
206
- const rl = readline.createInterface({
207
- input: process.stdin,
208
- output: process.stdout
209
- });
210
-
211
- return new Promise((resolve) => {
212
- rl.question('\nElige una opción (1 o 2): ', (answer) => {
213
- rl.close();
214
- resolve(answer.trim());
215
- });
216
- });
217
- }
218
-
219
- async backupModifiedFiles(modifiedFiles) {
220
- console.log('\n🔄 Creando backup de archivos modificados...');
221
-
222
- for (const item of modifiedFiles) {
223
- // No crear backup de archivos ignorados
224
- if (item.is_ignored) {
225
- console.log(`✓ Preservando: ${item.file} (sin backup)`);
226
- continue;
227
- }
228
-
229
- const originalPath = item.fullPath;
230
- const backupPath = this.getBackupPath(originalPath);
231
-
232
- try {
233
- await fs.copy(originalPath, backupPath);
234
-
235
- // Determinar tipo de backup para mostrar mensaje apropiado
236
- const backupName = path.basename(backupPath);
237
- const isVersionedBackup = backupName.includes('_bk_');
238
-
239
- if (isVersionedBackup) {
240
- console.log(`✓ Backup versionado: ${path.relative(this.targetDir, backupPath)}`);
241
- } else {
242
- console.log(`✓ Backup creado: ${path.relative(this.targetDir, backupPath)}`);
243
- }
244
- } catch (error) {
245
- console.warn(`⚠️ Error creando backup de ${item.file}: ${error.message}`);
246
- }
247
- }
248
- }
249
-
250
- getBackupPath(filePath) {
251
- const dir = path.dirname(filePath);
252
- const ext = path.extname(filePath);
253
- const name = path.basename(filePath, ext);
254
-
255
- // Primer intento: archivo_bk.ext
256
- const basicBackupPath = path.join(dir, `${name}_bk${ext}`);
257
-
258
- // Si no existe, usar el nombre básico
259
- if (!fs.existsSync(basicBackupPath)) {
260
- return basicBackupPath;
261
- }
262
-
263
- // Si ya existe _bk, crear versión con timestamp
264
- const now = new Date();
265
- const timestamp = now.getFullYear().toString() +
266
- (now.getMonth() + 1).toString().padStart(2, '0') +
267
- now.getDate().toString().padStart(2, '0') + '_' +
268
- now.getHours().toString().padStart(2, '0') +
269
- now.getMinutes().toString().padStart(2, '0') +
270
- now.getSeconds().toString().padStart(2, '0');
271
-
272
- return path.join(dir, `${name}_bk_${timestamp}${ext}`);
273
- }
274
-
275
- async performUpdateWithBackups() {
276
- for (const mapping of this.folderMappings) {
277
- const sourcePath = path.join(this.packageDir, mapping.source);
278
- const targetPath = path.join(this.targetDir, mapping.target);
279
-
280
- if (fs.existsSync(sourcePath)) {
281
- // Copiar archivos selectivamente, preservando los _bk
282
- await this.copyWithBackupPreservation(sourcePath, targetPath);
283
- } else {
284
- console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
285
- }
286
- }
287
- }
288
-
289
- async copyWithBackupPreservation(sourcePath, targetPath) {
290
- // Obtener todos los archivos backup existentes
291
- const backupFiles = await this.findBackupFiles(targetPath);
292
-
293
- // Copiar la carpeta
294
- await fs.copy(sourcePath, targetPath, {
295
- overwrite: true,
296
- recursive: true,
297
- filter: (src) => {
298
- const relativePath = path.relative(sourcePath, src);
299
- // No sobrescribir archivos ignorados si ya existen
300
- if (this.ignoredFiles.includes(relativePath)) {
301
- const targetFile = path.join(targetPath, relativePath);
302
- return !fs.existsSync(targetFile);
303
- }
304
- return true;
305
- }
306
- });
307
-
308
- // Restaurar los archivos backup
309
- for (const backupFile of backupFiles) {
310
- const backupSourcePath = backupFile.tempPath;
311
- const backupTargetPath = backupFile.originalPath;
312
-
313
- try {
314
- await fs.copy(backupSourcePath, backupTargetPath);
315
- // Limpiar archivo temporal
316
- await fs.remove(backupSourcePath);
317
- } catch (error) {
318
- console.warn(`⚠️ Error restaurando backup ${backupFile.relativePath}: ${error.message}`);
319
- }
320
- }
321
- }
322
-
323
- async findBackupFiles(targetPath) {
324
- if (!fs.existsSync(targetPath)) {
325
- return [];
326
- }
327
-
328
- const backupFiles = [];
329
- const allFiles = await this.getAllFiles(targetPath);
330
-
331
- for (const filePath of allFiles) {
332
- const fileName = path.basename(filePath);
333
- // Detectar archivos _bk y _bk_timestamp
334
- if (fileName.includes('_bk')) {
335
- const tempPath = path.join(require('os').tmpdir(), `backup_${Date.now()}_${fileName}`);
336
- const relativePath = path.relative(targetPath, filePath);
337
-
338
- // Crear copia temporal del backup
339
- await fs.copy(filePath, tempPath);
340
-
341
- backupFiles.push({
342
- originalPath: filePath,
343
- tempPath: tempPath,
344
- relativePath: relativePath
345
- });
346
- }
347
- }
348
-
349
- return backupFiles;
350
- }
351
-
352
- async performInstallation() {
353
- for (const mapping of this.folderMappings) {
354
- const sourcePath = path.join(this.packageDir, mapping.source);
355
- const targetPath = path.join(this.targetDir, mapping.target);
356
-
357
- if (fs.existsSync(sourcePath)) {
358
- await fs.copy(sourcePath, targetPath, {
359
- overwrite: true,
360
- recursive: true,
361
- filter: (src) => {
362
- const relativePath = path.relative(sourcePath, src);
363
- // No sobrescribir archivos ignorados si ya existen
364
- if (this.ignoredFiles.includes(relativePath)) {
365
- const targetFile = path.join(targetPath, relativePath);
366
- return !fs.existsSync(targetFile);
367
- }
368
- return true;
369
- }
370
- });
371
- console.log(` ✓ ${mapping.target} instalado`);
372
- } else {
373
- console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
374
- }
375
- }
376
- }
377
-
378
- async update() {
379
- // Verificar archivos modificados
380
- console.log('🔍 Verificando archivos modificados...');
381
- const modifiedFiles = await this.checkModifiedFiles();
382
-
383
- let hasBackups = false;
384
- if (modifiedFiles.length > 0) {
385
- const userChoice = await this.promptUser(modifiedFiles);
386
-
387
- if (userChoice === '2') {
388
- // Crear backup de archivos modificados
389
- await this.backupModifiedFiles(modifiedFiles);
390
- hasBackups = true;
391
- } else if (userChoice !== '1') {
392
- console.log('❌ Opción no válida. Cancelando actualización.');
393
- return;
394
- }
395
-
396
- console.log('\n🔄 Procediendo con la actualización...');
397
- } else {
398
- console.log('✓ No se detectaron archivos modificados.');
399
- }
400
-
401
- // Si hay backups, hacer actualización preservando backups
402
- if (hasBackups) {
403
- await this.performUpdateWithBackups();
404
- } else {
405
- // Si no hay backups, hacer actualización normal (remover y copiar)
406
- // Pero primero preservar archivos ignorados
407
- await this.preserveIgnoredFiles();
408
-
409
- for (const mapping of this.folderMappings) {
410
- const targetPath = path.join(this.targetDir, mapping.target);
411
-
412
- if (fs.existsSync(targetPath)) {
413
- await fs.remove(targetPath);
414
- }
415
- }
416
-
417
- // Realizar instalación nueva
418
- await this.performInstallation();
419
-
420
- // Restaurar archivos ignorados
421
- await this.restoreIgnoredFiles();
422
- }
423
- }
424
-
425
- async preserveIgnoredFiles() {
426
- if (this.ignoredFiles.length === 0) return;
427
-
428
- console.log('🔒 Preservando archivos de configuración...');
429
-
430
- for (const mapping of this.folderMappings) {
431
- const targetFolderPath = path.join(this.targetDir, mapping.target);
432
-
433
- if (!fs.existsSync(targetFolderPath)) {
434
- continue;
435
- }
436
-
437
- for (const ignoredFile of this.ignoredFiles) {
438
- const filePath = path.join(targetFolderPath, ignoredFile);
439
-
440
- if (fs.existsSync(filePath)) {
441
- try {
442
- const content = await fs.readFile(filePath, 'utf8');
443
- const key = `${mapping.target}/${ignoredFile}`;
444
- this.preservedContent.set(key, content);
445
- console.log(`✓ Preservando: ${ignoredFile}`);
446
- } catch (error) {
447
- console.warn(`⚠️ Error leyendo ${ignoredFile}: ${error.message}`);
448
- }
449
- }
450
- }
451
- }
452
- }
453
-
454
- async restoreIgnoredFiles() {
455
- if (this.preservedContent.size === 0) {
456
- return;
457
- }
458
-
459
- console.log('🔄 Restaurando archivos de configuración...');
460
-
461
- for (const [key, content] of this.preservedContent) {
462
- const [targetFolder, ...filePathParts] = key.split('/');
463
- const filePath = path.join(this.targetDir, targetFolder, ...filePathParts);
464
-
465
- try {
466
- // Asegurar que el directorio existe
467
- await fs.ensureDir(path.dirname(filePath));
468
-
469
- // Restaurar el contenido
470
- await fs.writeFile(filePath, content, 'utf8');
471
- console.log(`✓ Restaurado: ${filePathParts.join('/')}`);
472
- } catch (error) {
473
- console.warn(`⚠️ Error restaurando ${filePathParts.join('/')}: ${error.message}`);
474
- }
475
- }
476
-
477
- // Limpiar el mapa después de restaurar
478
- this.preservedContent.clear();
479
- }
480
-
481
- showPostInstallMessage() {
482
- console.log('\n📚 Carpetas instaladas:');
483
- this.folderMappings.forEach(mapping => {
484
- const targetPath = path.join(this.targetDir, mapping.target);
485
- if (fs.existsSync(targetPath)) {
486
- console.log(` ✓ ${mapping.target}`);
487
- }
488
- });
489
-
490
- console.log('\n🎉 ¡Instalación completada!');
491
- console.log('💡 Las carpetas han sido instaladas en tu directorio actual.');
492
- console.log('🔧 Puedes ejecutar "npx siesa-ui-kit" nuevamente para actualizar.');
493
- }
494
- }
495
-
496
- // Ejecutar instalación si el script es llamado directamente
497
- if (require.main === module) {
498
- const installer = new SiesaUIKitInstaller();
499
- installer.install();
500
- }
501
-
502
- module.exports = SiesaUIKitInstaller;
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs-extra');
4
+ const path = require('path');
5
+ const readline = require('readline');
6
+
7
+ class SiesaUIKitInstaller {
8
+ constructor() {
9
+ // Definir las carpetas primero (nombres en el paquete vs nombres finales)
10
+ this.folderMappings = [
11
+ { source: 'claude', target: '.claude' },
12
+ { source: 'storybook', target: '.storybook' },
13
+ { source: 'docs', target: 'docs' },
14
+ { source: 'src', target: 'src' },
15
+ { source: 'public', target: 'public' }
16
+ ];
17
+
18
+ // Lista de archivos que se preservan automáticamente (no se crean backups)
19
+ this.ignoredFiles = [];
20
+
21
+ this.targetDir = process.cwd();
22
+ // Intentar múltiples ubicaciones posibles para el paquete
23
+ this.packageDir = this.findPackageDir();
24
+
25
+ // Almacenamiento temporal para contenido de archivos ignorados
26
+ this.preservedContent = new Map();
27
+ }
28
+
29
+ showBanner() {
30
+ console.log('\n');
31
+ console.log('███████╗██╗███████╗███████╗ █████╗ ██╗ ██╗██╗ ██╗ ██╗██╗████████╗');
32
+ console.log('██╔════╝██║██╔════╝██╔════╝██╔══██╗ ██║ ██║██║ ██║ ██╔╝██║╚══██╔══╝');
33
+ console.log('███████╗██║█████╗ ███████╗███████║ ██║ ██║██║ █████╔╝ ██║ ██║ ');
34
+ console.log('╚════██║██║██╔══╝ ╚════██║██╔══██║ ██║ ██║██║ ██╔═██╗ ██║ ██║ ');
35
+ console.log('███████║██║███████╗███████║██║ ██║ ╚██████╔╝██║ ██║ ██╗██║ ██║ ');
36
+ console.log('╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ');
37
+ console.log('');
38
+ }
39
+
40
+ findPackageDir() {
41
+ // Opción 1: directorio padre del bin (instalación normal)
42
+ let packageDir = path.dirname(__dirname);
43
+
44
+ // Opción 2: si estamos en npx, buscar en node_modules
45
+ if (!this.hasRequiredFolders(packageDir)) {
46
+ // Para npm 6.14+ y npx, intentar ubicaciones alternativas
47
+ const possiblePaths = [
48
+ path.join(__dirname, '..'), // bin -> paquete
49
+ path.resolve(__dirname, '..'), // alternativa con resolve
50
+ path.resolve(__dirname, '..', '..', 'siesa-ui-kit'), // desde node_modules
51
+ // Intentar buscar basado en __dirname específicamente para npx
52
+ path.resolve(__dirname.replace(/\\bin$|\/bin$/, '')),
53
+ process.cwd(), // directorio actual como último recurso
54
+ ];
55
+
56
+ for (const possiblePath of possiblePaths) {
57
+ if (this.hasRequiredFolders(possiblePath)) {
58
+ packageDir = possiblePath;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+
64
+ return packageDir;
65
+ }
66
+
67
+ hasRequiredFolders(dir) {
68
+ return this.folderMappings.some(mapping => {
69
+ const folderPath = path.join(dir, mapping.source);
70
+ return fs.existsSync(folderPath);
71
+ });
72
+ }
73
+
74
+ async install() {
75
+ this.showBanner();
76
+ console.log(' Instalando SIESA UI Kit...');
77
+
78
+ try {
79
+ // Verificar si ya existe una instalación
80
+ const hasExistingInstallation = this.checkExistingInstallation();
81
+
82
+ if (hasExistingInstallation) {
83
+ console.log('🔄 Instalación existente detectada. Actualizando...');
84
+ await this.update();
85
+ } else {
86
+ console.log('✨ Nueva instalación...');
87
+ await this.performInstallation();
88
+ }
89
+
90
+ console.log('✅ SIESA UI Kit instalado correctamente!');
91
+ this.showPostInstallMessage();
92
+
93
+ } catch (error) {
94
+ console.error('❌ Error durante la instalación:', error.message);
95
+ process.exit(1);
96
+ }
97
+ }
98
+
99
+ checkExistingInstallation() {
100
+ return this.folderMappings.some(mapping => {
101
+ const targetPath = path.join(this.targetDir, mapping.target);
102
+ return fs.existsSync(targetPath);
103
+ });
104
+ }
105
+
106
+ async checkModifiedFiles() {
107
+ const modifiedFiles = [];
108
+
109
+ for (const mapping of this.folderMappings) {
110
+ const sourcePath = path.join(this.packageDir, mapping.source);
111
+ const targetPath = path.join(this.targetDir, mapping.target);
112
+
113
+ if (!fs.existsSync(sourcePath) || !fs.existsSync(targetPath)) {
114
+ continue;
115
+ }
116
+
117
+ // Obtener todos los archivos recursivamente
118
+ const sourceFiles = await this.getAllFiles(sourcePath);
119
+
120
+ for (const sourceFile of sourceFiles) {
121
+ const relativePath = path.relative(sourcePath, sourceFile);
122
+ const targetFile = path.join(targetPath, relativePath);
123
+
124
+ if (fs.existsSync(targetFile)) {
125
+ try {
126
+ // Comparar contenido de archivos
127
+ const sourceContent = await fs.readFile(sourceFile, 'utf8');
128
+ const targetContent = await fs.readFile(targetFile, 'utf8');
129
+
130
+ if (sourceContent !== targetContent) {
131
+ modifiedFiles.push({
132
+ folder: mapping.target,
133
+ file: relativePath,
134
+ fullPath: targetFile,
135
+ is_ignored: this.ignoredFiles.includes(relativePath)
136
+ });
137
+ }
138
+ } catch (error) {
139
+ // Si no se puede leer como texto, comparar como buffer (archivos binarios)
140
+ const sourceBuffer = await fs.readFile(sourceFile);
141
+ const targetBuffer = await fs.readFile(targetFile);
142
+
143
+ if (!sourceBuffer.equals(targetBuffer)) {
144
+ modifiedFiles.push({
145
+ folder: mapping.target,
146
+ file: relativePath,
147
+ fullPath: targetFile,
148
+ is_ignored: this.ignoredFiles.includes(relativePath)
149
+ });
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+
156
+ return modifiedFiles;
157
+ }
158
+
159
+ async getAllFiles(dir) {
160
+ const files = [];
161
+ const items = await fs.readdir(dir);
162
+
163
+ for (const item of items) {
164
+ const fullPath = path.join(dir, item);
165
+ const stat = await fs.stat(fullPath);
166
+
167
+ if (stat.isDirectory()) {
168
+ const subFiles = await this.getAllFiles(fullPath);
169
+ files.push(...subFiles);
170
+ } else {
171
+ files.push(fullPath);
172
+ }
173
+ }
174
+
175
+ return files;
176
+ }
177
+
178
+ async promptUser(modifiedFiles) {
179
+
180
+ const hasNonIgnoredFiles = modifiedFiles.some(file => file.is_ignored == false)
181
+ if (!hasNonIgnoredFiles) return '2'
182
+
183
+ console.log('\n⚠️ Se detectaron archivos modificados:');
184
+
185
+ // Agrupar por carpeta
186
+ const filesByFolder = {};
187
+ modifiedFiles.forEach(item => {
188
+ if (!filesByFolder[item.folder]) {
189
+ filesByFolder[item.folder] = [];
190
+ }
191
+ filesByFolder[item.folder].push(item.file);
192
+ });
193
+
194
+ // Mostrar archivos modificados por carpeta
195
+ Object.keys(filesByFolder).forEach(folder => {
196
+ console.log(`\n📁 ${folder}:`);
197
+ filesByFolder[folder].forEach(file => {
198
+ console.log(` - ${file}`);
199
+ });
200
+ });
201
+
202
+ console.log('\n¿Qué deseas hacer?');
203
+ console.log('1. Reemplazar todos los archivos (se perderán las modificaciones)');
204
+ console.log('2. Hacer backup de archivos modificados (se agregarán con sufijo _bk)');
205
+
206
+ const rl = readline.createInterface({
207
+ input: process.stdin,
208
+ output: process.stdout
209
+ });
210
+
211
+ return new Promise((resolve) => {
212
+ rl.question('\nElige una opción (1 o 2): ', (answer) => {
213
+ rl.close();
214
+ resolve(answer.trim());
215
+ });
216
+ });
217
+ }
218
+
219
+ async backupModifiedFiles(modifiedFiles) {
220
+ console.log('\n🔄 Creando backup de archivos modificados...');
221
+
222
+ for (const item of modifiedFiles) {
223
+ // No crear backup de archivos ignorados
224
+ if (item.is_ignored) {
225
+ console.log(`✓ Preservando: ${item.file} (sin backup)`);
226
+ continue;
227
+ }
228
+
229
+ const originalPath = item.fullPath;
230
+ const backupPath = this.getBackupPath(originalPath);
231
+
232
+ try {
233
+ await fs.copy(originalPath, backupPath);
234
+
235
+ // Determinar tipo de backup para mostrar mensaje apropiado
236
+ const backupName = path.basename(backupPath);
237
+ const isVersionedBackup = backupName.includes('_bk_');
238
+
239
+ if (isVersionedBackup) {
240
+ console.log(`✓ Backup versionado: ${path.relative(this.targetDir, backupPath)}`);
241
+ } else {
242
+ console.log(`✓ Backup creado: ${path.relative(this.targetDir, backupPath)}`);
243
+ }
244
+ } catch (error) {
245
+ console.warn(`⚠️ Error creando backup de ${item.file}: ${error.message}`);
246
+ }
247
+ }
248
+ }
249
+
250
+ getBackupPath(filePath) {
251
+ const dir = path.dirname(filePath);
252
+ const ext = path.extname(filePath);
253
+ const name = path.basename(filePath, ext);
254
+
255
+ // Primer intento: archivo_bk.ext
256
+ const basicBackupPath = path.join(dir, `${name}_bk${ext}`);
257
+
258
+ // Si no existe, usar el nombre básico
259
+ if (!fs.existsSync(basicBackupPath)) {
260
+ return basicBackupPath;
261
+ }
262
+
263
+ // Si ya existe _bk, crear versión con timestamp
264
+ const now = new Date();
265
+ const timestamp = now.getFullYear().toString() +
266
+ (now.getMonth() + 1).toString().padStart(2, '0') +
267
+ now.getDate().toString().padStart(2, '0') + '_' +
268
+ now.getHours().toString().padStart(2, '0') +
269
+ now.getMinutes().toString().padStart(2, '0') +
270
+ now.getSeconds().toString().padStart(2, '0');
271
+
272
+ return path.join(dir, `${name}_bk_${timestamp}${ext}`);
273
+ }
274
+
275
+ async performUpdateWithBackups() {
276
+ for (const mapping of this.folderMappings) {
277
+ const sourcePath = path.join(this.packageDir, mapping.source);
278
+ const targetPath = path.join(this.targetDir, mapping.target);
279
+
280
+ if (fs.existsSync(sourcePath)) {
281
+ // Copiar archivos selectivamente, preservando los _bk
282
+ await this.copyWithBackupPreservation(sourcePath, targetPath);
283
+ } else {
284
+ console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
285
+ }
286
+ }
287
+ }
288
+
289
+ async copyWithBackupPreservation(sourcePath, targetPath) {
290
+ // Obtener todos los archivos backup existentes
291
+ const backupFiles = await this.findBackupFiles(targetPath);
292
+
293
+ // Copiar la carpeta
294
+ await fs.copy(sourcePath, targetPath, {
295
+ overwrite: true,
296
+ recursive: true,
297
+ filter: (src) => {
298
+ const relativePath = path.relative(sourcePath, src);
299
+ // No sobrescribir archivos ignorados si ya existen
300
+ if (this.ignoredFiles.includes(relativePath)) {
301
+ const targetFile = path.join(targetPath, relativePath);
302
+ return !fs.existsSync(targetFile);
303
+ }
304
+ return true;
305
+ }
306
+ });
307
+
308
+ // Restaurar los archivos backup
309
+ for (const backupFile of backupFiles) {
310
+ const backupSourcePath = backupFile.tempPath;
311
+ const backupTargetPath = backupFile.originalPath;
312
+
313
+ try {
314
+ await fs.copy(backupSourcePath, backupTargetPath);
315
+ // Limpiar archivo temporal
316
+ await fs.remove(backupSourcePath);
317
+ } catch (error) {
318
+ console.warn(`⚠️ Error restaurando backup ${backupFile.relativePath}: ${error.message}`);
319
+ }
320
+ }
321
+ }
322
+
323
+ async findBackupFiles(targetPath) {
324
+ if (!fs.existsSync(targetPath)) {
325
+ return [];
326
+ }
327
+
328
+ const backupFiles = [];
329
+ const allFiles = await this.getAllFiles(targetPath);
330
+
331
+ for (const filePath of allFiles) {
332
+ const fileName = path.basename(filePath);
333
+ // Detectar archivos _bk y _bk_timestamp
334
+ if (fileName.includes('_bk')) {
335
+ const tempPath = path.join(require('os').tmpdir(), `backup_${Date.now()}_${fileName}`);
336
+ const relativePath = path.relative(targetPath, filePath);
337
+
338
+ // Crear copia temporal del backup
339
+ await fs.copy(filePath, tempPath);
340
+
341
+ backupFiles.push({
342
+ originalPath: filePath,
343
+ tempPath: tempPath,
344
+ relativePath: relativePath
345
+ });
346
+ }
347
+ }
348
+
349
+ return backupFiles;
350
+ }
351
+
352
+ async performInstallation() {
353
+ for (const mapping of this.folderMappings) {
354
+ const sourcePath = path.join(this.packageDir, mapping.source);
355
+ const targetPath = path.join(this.targetDir, mapping.target);
356
+
357
+ if (fs.existsSync(sourcePath)) {
358
+ await fs.copy(sourcePath, targetPath, {
359
+ overwrite: true,
360
+ recursive: true,
361
+ filter: (src) => {
362
+ const relativePath = path.relative(sourcePath, src);
363
+ // No sobrescribir archivos ignorados si ya existen
364
+ if (this.ignoredFiles.includes(relativePath)) {
365
+ const targetFile = path.join(targetPath, relativePath);
366
+ return !fs.existsSync(targetFile);
367
+ }
368
+ return true;
369
+ }
370
+ });
371
+ console.log(` ✓ ${mapping.target} instalado`);
372
+ } else {
373
+ console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
374
+ }
375
+ }
376
+ }
377
+
378
+ async update() {
379
+ // Verificar archivos modificados
380
+ console.log('🔍 Verificando archivos modificados...');
381
+ const modifiedFiles = await this.checkModifiedFiles();
382
+
383
+ let hasBackups = false;
384
+ if (modifiedFiles.length > 0) {
385
+ const userChoice = await this.promptUser(modifiedFiles);
386
+
387
+ if (userChoice === '2') {
388
+ // Crear backup de archivos modificados
389
+ await this.backupModifiedFiles(modifiedFiles);
390
+ hasBackups = true;
391
+ } else if (userChoice !== '1') {
392
+ console.log('❌ Opción no válida. Cancelando actualización.');
393
+ return;
394
+ }
395
+
396
+ console.log('\n🔄 Procediendo con la actualización...');
397
+ } else {
398
+ console.log('✓ No se detectaron archivos modificados.');
399
+ }
400
+
401
+ // Si hay backups, hacer actualización preservando backups
402
+ if (hasBackups) {
403
+ await this.performUpdateWithBackups();
404
+ } else {
405
+ // Si no hay backups, hacer actualización normal (remover y copiar)
406
+ // Pero primero preservar archivos ignorados
407
+ await this.preserveIgnoredFiles();
408
+
409
+ for (const mapping of this.folderMappings) {
410
+ const targetPath = path.join(this.targetDir, mapping.target);
411
+
412
+ if (fs.existsSync(targetPath)) {
413
+ await fs.remove(targetPath);
414
+ }
415
+ }
416
+
417
+ // Realizar instalación nueva
418
+ await this.performInstallation();
419
+
420
+ // Restaurar archivos ignorados
421
+ await this.restoreIgnoredFiles();
422
+ }
423
+ }
424
+
425
+ async preserveIgnoredFiles() {
426
+ if (this.ignoredFiles.length === 0) return;
427
+
428
+ console.log('🔒 Preservando archivos de configuración...');
429
+
430
+ for (const mapping of this.folderMappings) {
431
+ const targetFolderPath = path.join(this.targetDir, mapping.target);
432
+
433
+ if (!fs.existsSync(targetFolderPath)) {
434
+ continue;
435
+ }
436
+
437
+ for (const ignoredFile of this.ignoredFiles) {
438
+ const filePath = path.join(targetFolderPath, ignoredFile);
439
+
440
+ if (fs.existsSync(filePath)) {
441
+ try {
442
+ const content = await fs.readFile(filePath, 'utf8');
443
+ const key = `${mapping.target}/${ignoredFile}`;
444
+ this.preservedContent.set(key, content);
445
+ console.log(`✓ Preservando: ${ignoredFile}`);
446
+ } catch (error) {
447
+ console.warn(`⚠️ Error leyendo ${ignoredFile}: ${error.message}`);
448
+ }
449
+ }
450
+ }
451
+ }
452
+ }
453
+
454
+ async restoreIgnoredFiles() {
455
+ if (this.preservedContent.size === 0) {
456
+ return;
457
+ }
458
+
459
+ console.log('🔄 Restaurando archivos de configuración...');
460
+
461
+ for (const [key, content] of this.preservedContent) {
462
+ const [targetFolder, ...filePathParts] = key.split('/');
463
+ const filePath = path.join(this.targetDir, targetFolder, ...filePathParts);
464
+
465
+ try {
466
+ // Asegurar que el directorio existe
467
+ await fs.ensureDir(path.dirname(filePath));
468
+
469
+ // Restaurar el contenido
470
+ await fs.writeFile(filePath, content, 'utf8');
471
+ console.log(`✓ Restaurado: ${filePathParts.join('/')}`);
472
+ } catch (error) {
473
+ console.warn(`⚠️ Error restaurando ${filePathParts.join('/')}: ${error.message}`);
474
+ }
475
+ }
476
+
477
+ // Limpiar el mapa después de restaurar
478
+ this.preservedContent.clear();
479
+ }
480
+
481
+ showPostInstallMessage() {
482
+ console.log('\n📚 Carpetas instaladas:');
483
+ this.folderMappings.forEach(mapping => {
484
+ const targetPath = path.join(this.targetDir, mapping.target);
485
+ if (fs.existsSync(targetPath)) {
486
+ console.log(` ✓ ${mapping.target}`);
487
+ }
488
+ });
489
+
490
+ console.log('\n🎉 ¡Instalación completada!');
491
+ console.log('💡 Las carpetas han sido instaladas en tu directorio actual.');
492
+ console.log('🔧 Puedes ejecutar "npx siesa-ui-kit" nuevamente para actualizar.');
493
+ }
494
+ }
495
+
496
+ // Ejecutar instalación si el script es llamado directamente
497
+ if (require.main === module) {
498
+ const installer = new SiesaUIKitInstaller();
499
+ installer.install();
500
+ }
501
+
502
+ module.exports = SiesaUIKitInstaller;