@soyfri/shared-library 2.0.0-beta.3 → 2.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/.dockerignore +8 -0
  2. package/.github/workflows/publish.yml +107 -0
  3. package/.prettierrc +3 -0
  4. package/.storybook/main.ts +19 -0
  5. package/.storybook/preview.ts +14 -0
  6. package/.storybook/vitest.setup.ts +9 -0
  7. package/Dockerfile +37 -0
  8. package/build.js +102 -0
  9. package/chromatic.config.json +5 -0
  10. package/cleanDirectories.js +40 -0
  11. package/dist/README.md +243 -0
  12. package/{index.cjs → dist/index.cjs} +24 -0
  13. package/{index.cjs.map → dist/index.cjs.map} +1 -1
  14. package/{index.js → dist/index.js} +7 -1
  15. package/{mui.d.ts → dist/mui.d.ts} +1 -0
  16. package/dist/package.json +197 -0
  17. package/package.json +43 -164
  18. package/rollup.config.cjs +87 -0
  19. package/src/components/ActionMenu/ActionMenu.stories.tsx +230 -0
  20. package/src/components/ActionMenu/ActionMenu.tsx +174 -0
  21. package/src/components/ActionMenu/index.ts +2 -0
  22. package/src/components/AppBar/AppBar.stories.tsx +272 -0
  23. package/src/components/AppBar/AppBar.sx.ts +32 -0
  24. package/src/components/AppBar/AppBar.tsx +123 -0
  25. package/src/components/AppBar/AppBarBrand.tsx +120 -0
  26. package/src/components/AppBar/AppBarContext.ts +25 -0
  27. package/src/components/AppBar/AppBarMenuToggle.tsx +90 -0
  28. package/src/components/AppBar/AppBarUserMenu.tsx +217 -0
  29. package/src/components/AppBar/index.ts +25 -0
  30. package/src/components/Autocomplete/Autocomplete.definitions.ts +477 -0
  31. package/src/components/Autocomplete/Autocomplete.helpers.ts +60 -0
  32. package/src/components/Autocomplete/Autocomplete.stories.tsx +748 -0
  33. package/src/components/Autocomplete/Autocomplete.sx.ts +30 -0
  34. package/src/components/Autocomplete/Autocomplete.tsx +361 -0
  35. package/src/components/Autocomplete/Autocomplete.types.ts +13 -0
  36. package/src/components/Autocomplete/_parts/AutocompleteChips.tsx +55 -0
  37. package/src/components/Autocomplete/_parts/AutocompleteLoader.tsx +17 -0
  38. package/src/components/Autocomplete/_parts/AutocompleteOption.tsx +31 -0
  39. package/src/components/Autocomplete/index.ts +12 -0
  40. package/src/components/Avatar/Avatar.definitions.ts +162 -0
  41. package/src/components/Avatar/Avatar.stories.tsx +258 -0
  42. package/src/components/Avatar/Avatar.tsx +206 -0
  43. package/src/components/Avatar/index.ts +1 -0
  44. package/src/components/Button/Button.definition.ts +97 -0
  45. package/src/components/Button/Button.stories.tsx +285 -0
  46. package/src/components/Button/Button.tsx +67 -0
  47. package/src/components/Button/index.ts +1 -0
  48. package/src/components/Card/Card.definition.ts +5 -0
  49. package/src/components/Card/Card.stories.tsx +221 -0
  50. package/src/components/Card/Card.sx.ts +104 -0
  51. package/src/components/Card/Card.tsx +200 -0
  52. package/src/components/Card/index.ts +9 -0
  53. package/src/components/Chip/Chip.definitions.ts +167 -0
  54. package/src/components/Chip/Chip.stories.tsx +265 -0
  55. package/src/components/Chip/Chip.tsx +61 -0
  56. package/src/components/Chip/index.ts +1 -0
  57. package/src/components/Column/Column.tsx +29 -0
  58. package/src/components/Column/index.ts +1 -0
  59. package/src/components/DatePicker/DatePicker.definitions.ts +228 -0
  60. package/src/components/DatePicker/DatePicker.helpers.ts +24 -0
  61. package/src/components/DatePicker/DatePicker.stories.tsx +309 -0
  62. package/src/components/DatePicker/DatePicker.sx.ts +33 -0
  63. package/src/components/DatePicker/DatePicker.tsx +189 -0
  64. package/src/components/DatePicker/DatePicker.types.ts +10 -0
  65. package/src/components/DatePicker/index.ts +9 -0
  66. package/src/components/DateRangePicker/DateRangePicker.definitions.ts +191 -0
  67. package/src/components/DateRangePicker/DateRangePicker.stories.tsx +252 -0
  68. package/src/components/DateRangePicker/DateRangePicker.tsx +56 -0
  69. package/src/components/DateRangePicker/index.ts +1 -0
  70. package/src/components/DateTimePicker/DateTimePicker.definitions.ts +256 -0
  71. package/src/components/DateTimePicker/DateTimePicker.helpers.ts +38 -0
  72. package/src/components/DateTimePicker/DateTimePicker.stories.tsx +418 -0
  73. package/src/components/DateTimePicker/DateTimePicker.sx.ts +30 -0
  74. package/src/components/DateTimePicker/DateTimePicker.tsx +225 -0
  75. package/src/components/DateTimePicker/DateTimePicker.types.ts +10 -0
  76. package/src/components/DateTimePicker/index.ts +9 -0
  77. package/src/components/Drawer/Drawer.stories.tsx +270 -0
  78. package/src/components/Drawer/Drawer.sx.ts +106 -0
  79. package/src/components/Drawer/Drawer.tsx +214 -0
  80. package/src/components/Drawer/DrawerContext.ts +26 -0
  81. package/src/components/Drawer/DrawerItem.tsx +110 -0
  82. package/src/components/Drawer/index.ts +10 -0
  83. package/src/components/Flyout/Flyout.stories.tsx +282 -0
  84. package/src/components/Flyout/Flyout.tsx +122 -0
  85. package/src/components/Flyout/index.ts +1 -0
  86. package/src/components/Gallery/Gallery.definition.tsx +37 -0
  87. package/src/components/Gallery/Gallery.stories.tsx +82 -0
  88. package/src/components/Gallery/Gallery.tsx +118 -0
  89. package/src/components/Gallery/GalleryLightbox.tsx +170 -0
  90. package/src/components/Gallery/GalleryMain.tsx +84 -0
  91. package/src/components/Gallery/GalleryThumbnails.tsx +106 -0
  92. package/src/components/Gallery/index.ts +1 -0
  93. package/src/components/Icon/Icon.stories.tsx +121 -0
  94. package/src/components/Icon/Icon.tsx +175 -0
  95. package/src/components/Icon/index.ts +2 -0
  96. package/src/components/Input/Input.definitions.ts +324 -0
  97. package/src/components/Input/Input.helpers.ts +49 -0
  98. package/src/components/Input/Input.stories.tsx +499 -0
  99. package/src/components/Input/Input.sx.ts +42 -0
  100. package/src/components/Input/Input.tsx +141 -0
  101. package/src/components/Input/Input.types.ts +10 -0
  102. package/src/components/Input/index.ts +9 -0
  103. package/src/components/InputGroup/InputGroup.definitions.ts +158 -0
  104. package/src/components/InputGroup/InputGroup.stories.tsx +267 -0
  105. package/src/components/InputGroup/InputGroup.tsx +179 -0
  106. package/src/components/InputGroup/index.ts +1 -0
  107. package/src/components/MenuButton/MenuButton.stories.tsx +197 -0
  108. package/src/components/MenuButton/MenuButton.tsx +100 -0
  109. package/src/components/MenuButton/index.ts +1 -0
  110. package/src/components/Modal/Modal.stories.tsx +721 -0
  111. package/src/components/Modal/Modal.tsx +355 -0
  112. package/src/components/Modal/ModalBody.tsx +16 -0
  113. package/src/components/Modal/ModalFooter.tsx +71 -0
  114. package/src/components/Modal/ModalHeader.tsx +18 -0
  115. package/src/components/Modal/index.ts +6 -0
  116. package/src/components/PageLoader/PageLoader.stories.tsx +217 -0
  117. package/src/components/PageLoader/PageLoader.tsx +96 -0
  118. package/src/components/PageLoader/index.ts +2 -0
  119. package/src/components/ScrollTopButton/ScrollTopButton.stories.tsx +158 -0
  120. package/src/components/ScrollTopButton/ScrollTopButton.tsx +135 -0
  121. package/src/components/ScrollTopButton/index.ts +8 -0
  122. package/src/components/ScrollTopButton/scrollToTop.ts +37 -0
  123. package/src/components/Select/Select.definitions.ts +602 -0
  124. package/src/components/Select/Select.helpers.ts +71 -0
  125. package/src/components/Select/Select.stories.tsx +687 -0
  126. package/src/components/Select/Select.sx.ts +14 -0
  127. package/src/components/Select/Select.tsx +429 -0
  128. package/src/components/Select/Select.types.ts +15 -0
  129. package/src/components/Select/_parts/SelectMenuItem.tsx +40 -0
  130. package/src/components/Select/_parts/SelectSearchHeader.tsx +51 -0
  131. package/src/components/Select/_parts/SelectValue.tsx +96 -0
  132. package/src/components/Select/index.ts +14 -0
  133. package/src/components/Stat/Stat.stories.tsx +85 -0
  134. package/src/components/Stat/Stat.tsx +117 -0
  135. package/src/components/Stat/index.ts +2 -0
  136. package/src/components/StatusMessage/StatusMessage.stories.tsx +130 -0
  137. package/src/components/StatusMessage/StatusMessage.tsx +162 -0
  138. package/src/components/StatusMessage/index.ts +2 -0
  139. package/src/components/Stepper/Step.tsx +21 -0
  140. package/src/components/Stepper/Stepper.definition.ts +75 -0
  141. package/src/components/Stepper/Stepper.stories.tsx +122 -0
  142. package/src/components/Stepper/Stepper.tsx +75 -0
  143. package/src/components/Stepper/index.ts +2 -0
  144. package/src/components/Table/EmptyTable.png +0 -0
  145. package/src/components/Table/Table.definition.ts +580 -0
  146. package/src/components/Table/Table.stories.tsx +853 -0
  147. package/src/components/Table/Table.tsx +495 -0
  148. package/src/components/Table/data.ts +134 -0
  149. package/src/components/Table/exportsUtils.ts +195 -0
  150. package/src/components/Table/index.ts +3 -0
  151. package/src/components/Table/types.ts +34 -0
  152. package/src/components/Tabs/Tab.definition.ts +53 -0
  153. package/src/components/Tabs/Tab.tsx +19 -0
  154. package/src/components/Tabs/Tabs.stories.tsx +118 -0
  155. package/src/components/Tabs/Tabs.tsx +99 -0
  156. package/src/components/Tabs/_tabUtils.tsx +4 -0
  157. package/src/components/Tabs/index.ts +2 -0
  158. package/src/components/Timeline/Timeline.definition.ts +43 -0
  159. package/src/components/Timeline/Timeline.stories.tsx +108 -0
  160. package/src/components/Timeline/Timeline.tsx +49 -0
  161. package/src/components/Timeline/TimelineItem.tsx +31 -0
  162. package/src/components/Timeline/index.ts +2 -0
  163. package/src/components/Tooltip/Tooltip.stories.tsx +129 -0
  164. package/src/components/Tooltip/Tooltip.tsx +58 -0
  165. package/src/components/Tooltip/index.ts +1 -0
  166. package/src/components/_shared/formField.sx.ts +118 -0
  167. package/src/components/_shared/resolvePreset.ts +35 -0
  168. package/src/hooks/ClipBoard/ClipBoard.stories.tsx +168 -0
  169. package/src/hooks/ClipBoard/ClipBoard.tsx +131 -0
  170. package/src/hooks/ClipBoard/ClipboardUnifiedDemo.tsx +111 -0
  171. package/src/hooks/ClipBoard/index.ts +1 -0
  172. package/src/hooks/Wizard/Wizard.stories.tsx +301 -0
  173. package/src/hooks/Wizard/WizardContext.tsx +166 -0
  174. package/src/hooks/Wizard/index.ts +6 -0
  175. package/src/hooks/Wizard/useWizard.ts +13 -0
  176. package/src/index.ts +17 -0
  177. package/src/mui.ts +54 -0
  178. package/src/styles.css +3 -0
  179. package/src/theme/componentStyles.ts +47 -0
  180. package/src/theme/tokens.ts +43 -0
  181. package/tailwind.config.js +10 -0
  182. package/tsconfig.json +48 -0
  183. package/tsup.config.js +41 -0
  184. package/vite.config.js +132 -0
  185. package/vitest.config.ts +35 -0
  186. /package/{README.md → Readme.md} +0 -0
  187. /package/{Button-C17mExpd.cjs → dist/Button-C17mExpd.cjs} +0 -0
  188. /package/{Button-C17mExpd.cjs.map → dist/Button-C17mExpd.cjs.map} +0 -0
  189. /package/{Button-UkkP-bNw.js → dist/Button-UkkP-bNw.js} +0 -0
  190. /package/{Button-UkkP-bNw.js.map → dist/Button-UkkP-bNw.js.map} +0 -0
  191. /package/{components → dist/components}/ActionMenu/ActionMenu.cjs +0 -0
  192. /package/{components → dist/components}/ActionMenu/ActionMenu.cjs.map +0 -0
  193. /package/{components → dist/components}/ActionMenu/ActionMenu.d.ts +0 -0
  194. /package/{components → dist/components}/ActionMenu/ActionMenu.js +0 -0
  195. /package/{components → dist/components}/ActionMenu/ActionMenu.js.map +0 -0
  196. /package/{components → dist/components}/ActionMenu/index.d.ts +0 -0
  197. /package/{components → dist/components}/ActionMenu.d.ts +0 -0
  198. /package/{components → dist/components}/AppBar/AppBar.cjs +0 -0
  199. /package/{components → dist/components}/AppBar/AppBar.cjs.map +0 -0
  200. /package/{components → dist/components}/AppBar/AppBar.d.ts +0 -0
  201. /package/{components → dist/components}/AppBar/AppBar.js +0 -0
  202. /package/{components → dist/components}/AppBar/AppBar.js.map +0 -0
  203. /package/{components → dist/components}/AppBar/AppBar.sx.d.ts +0 -0
  204. /package/{components → dist/components}/AppBar/AppBarBrand.d.ts +0 -0
  205. /package/{components → dist/components}/AppBar/AppBarContext.d.ts +0 -0
  206. /package/{components → dist/components}/AppBar/AppBarMenuToggle.d.ts +0 -0
  207. /package/{components → dist/components}/AppBar/AppBarUserMenu.d.ts +0 -0
  208. /package/{components → dist/components}/AppBar/index.d.ts +0 -0
  209. /package/{components → dist/components}/AppBar.d.ts +0 -0
  210. /package/{components → dist/components}/Autocomplete/Autocomplete.cjs +0 -0
  211. /package/{components → dist/components}/Autocomplete/Autocomplete.cjs.map +0 -0
  212. /package/{components → dist/components}/Autocomplete/Autocomplete.d.ts +0 -0
  213. /package/{components → dist/components}/Autocomplete/Autocomplete.definitions.d.ts +0 -0
  214. /package/{components → dist/components}/Autocomplete/Autocomplete.helpers.d.ts +0 -0
  215. /package/{components → dist/components}/Autocomplete/Autocomplete.js +0 -0
  216. /package/{components → dist/components}/Autocomplete/Autocomplete.js.map +0 -0
  217. /package/{components → dist/components}/Autocomplete/Autocomplete.sx.d.ts +0 -0
  218. /package/{components → dist/components}/Autocomplete/Autocomplete.types.d.ts +0 -0
  219. /package/{components → dist/components}/Autocomplete/_parts/AutocompleteChips.d.ts +0 -0
  220. /package/{components → dist/components}/Autocomplete/_parts/AutocompleteLoader.d.ts +0 -0
  221. /package/{components → dist/components}/Autocomplete/_parts/AutocompleteOption.d.ts +0 -0
  222. /package/{components → dist/components}/Autocomplete/index.d.ts +0 -0
  223. /package/{components → dist/components}/Autocomplete.d.ts +0 -0
  224. /package/{components → dist/components}/Avatar/Avatar.cjs +0 -0
  225. /package/{components → dist/components}/Avatar/Avatar.cjs.map +0 -0
  226. /package/{components → dist/components}/Avatar/Avatar.d.ts +0 -0
  227. /package/{components → dist/components}/Avatar/Avatar.definitions.d.ts +0 -0
  228. /package/{components → dist/components}/Avatar/Avatar.js +0 -0
  229. /package/{components → dist/components}/Avatar/Avatar.js.map +0 -0
  230. /package/{components → dist/components}/Avatar/index.d.ts +0 -0
  231. /package/{components → dist/components}/Avatar.d.ts +0 -0
  232. /package/{components → dist/components}/Button/Button.cjs +0 -0
  233. /package/{components → dist/components}/Button/Button.cjs.map +0 -0
  234. /package/{components → dist/components}/Button/Button.d.ts +0 -0
  235. /package/{components → dist/components}/Button/Button.definition.d.ts +0 -0
  236. /package/{components → dist/components}/Button/Button.js +0 -0
  237. /package/{components → dist/components}/Button/Button.js.map +0 -0
  238. /package/{components → dist/components}/Button/index.d.ts +0 -0
  239. /package/{components → dist/components}/Button.d.ts +0 -0
  240. /package/{components → dist/components}/Card/Card.cjs +0 -0
  241. /package/{components → dist/components}/Card/Card.cjs.map +0 -0
  242. /package/{components → dist/components}/Card/Card.d.ts +0 -0
  243. /package/{components → dist/components}/Card/Card.definition.d.ts +0 -0
  244. /package/{components → dist/components}/Card/Card.js +0 -0
  245. /package/{components → dist/components}/Card/Card.js.map +0 -0
  246. /package/{components → dist/components}/Card/Card.sx.d.ts +0 -0
  247. /package/{components → dist/components}/Card/index.d.ts +0 -0
  248. /package/{components → dist/components}/Card.d.ts +0 -0
  249. /package/{components → dist/components}/Chip/Chip.cjs +0 -0
  250. /package/{components → dist/components}/Chip/Chip.cjs.map +0 -0
  251. /package/{components → dist/components}/Chip/Chip.d.ts +0 -0
  252. /package/{components → dist/components}/Chip/Chip.definitions.d.ts +0 -0
  253. /package/{components → dist/components}/Chip/Chip.js +0 -0
  254. /package/{components → dist/components}/Chip/Chip.js.map +0 -0
  255. /package/{components → dist/components}/Chip/index.d.ts +0 -0
  256. /package/{components → dist/components}/Chip.d.ts +0 -0
  257. /package/{components → dist/components}/Column/Column.cjs +0 -0
  258. /package/{components → dist/components}/Column/Column.cjs.map +0 -0
  259. /package/{components → dist/components}/Column/Column.d.ts +0 -0
  260. /package/{components → dist/components}/Column/Column.js +0 -0
  261. /package/{components → dist/components}/Column/Column.js.map +0 -0
  262. /package/{components → dist/components}/Column/index.d.ts +0 -0
  263. /package/{components → dist/components}/Column.d.ts +0 -0
  264. /package/{components → dist/components}/DatePicker/DatePicker.cjs +0 -0
  265. /package/{components → dist/components}/DatePicker/DatePicker.cjs.map +0 -0
  266. /package/{components → dist/components}/DatePicker/DatePicker.d.ts +0 -0
  267. /package/{components → dist/components}/DatePicker/DatePicker.definitions.d.ts +0 -0
  268. /package/{components → dist/components}/DatePicker/DatePicker.helpers.d.ts +0 -0
  269. /package/{components → dist/components}/DatePicker/DatePicker.js +0 -0
  270. /package/{components → dist/components}/DatePicker/DatePicker.js.map +0 -0
  271. /package/{components → dist/components}/DatePicker/DatePicker.sx.d.ts +0 -0
  272. /package/{components → dist/components}/DatePicker/DatePicker.types.d.ts +0 -0
  273. /package/{components → dist/components}/DatePicker/index.d.ts +0 -0
  274. /package/{components → dist/components}/DatePicker.d.ts +0 -0
  275. /package/{components → dist/components}/DateRangePicker/DateRangePicker.cjs +0 -0
  276. /package/{components → dist/components}/DateRangePicker/DateRangePicker.cjs.map +0 -0
  277. /package/{components → dist/components}/DateRangePicker/DateRangePicker.d.ts +0 -0
  278. /package/{components → dist/components}/DateRangePicker/DateRangePicker.definitions.d.ts +0 -0
  279. /package/{components → dist/components}/DateRangePicker/DateRangePicker.js +0 -0
  280. /package/{components → dist/components}/DateRangePicker/DateRangePicker.js.map +0 -0
  281. /package/{components → dist/components}/DateRangePicker/index.d.ts +0 -0
  282. /package/{components → dist/components}/DateRangePicker.d.ts +0 -0
  283. /package/{components → dist/components}/DateTimePicker/DateTimePicker.cjs +0 -0
  284. /package/{components → dist/components}/DateTimePicker/DateTimePicker.cjs.map +0 -0
  285. /package/{components → dist/components}/DateTimePicker/DateTimePicker.d.ts +0 -0
  286. /package/{components → dist/components}/DateTimePicker/DateTimePicker.definitions.d.ts +0 -0
  287. /package/{components → dist/components}/DateTimePicker/DateTimePicker.helpers.d.ts +0 -0
  288. /package/{components → dist/components}/DateTimePicker/DateTimePicker.js +0 -0
  289. /package/{components → dist/components}/DateTimePicker/DateTimePicker.js.map +0 -0
  290. /package/{components → dist/components}/DateTimePicker/DateTimePicker.sx.d.ts +0 -0
  291. /package/{components → dist/components}/DateTimePicker/DateTimePicker.types.d.ts +0 -0
  292. /package/{components → dist/components}/DateTimePicker/index.d.ts +0 -0
  293. /package/{components → dist/components}/DateTimePicker.d.ts +0 -0
  294. /package/{components → dist/components}/Drawer/Drawer.cjs +0 -0
  295. /package/{components → dist/components}/Drawer/Drawer.cjs.map +0 -0
  296. /package/{components → dist/components}/Drawer/Drawer.d.ts +0 -0
  297. /package/{components → dist/components}/Drawer/Drawer.js +0 -0
  298. /package/{components → dist/components}/Drawer/Drawer.js.map +0 -0
  299. /package/{components → dist/components}/Drawer/Drawer.sx.d.ts +0 -0
  300. /package/{components → dist/components}/Drawer/DrawerContext.d.ts +0 -0
  301. /package/{components → dist/components}/Drawer/DrawerItem.d.ts +0 -0
  302. /package/{components → dist/components}/Drawer/index.d.ts +0 -0
  303. /package/{components → dist/components}/Drawer.d.ts +0 -0
  304. /package/{components → dist/components}/Flyout/Flyout.cjs +0 -0
  305. /package/{components → dist/components}/Flyout/Flyout.cjs.map +0 -0
  306. /package/{components → dist/components}/Flyout/Flyout.d.ts +0 -0
  307. /package/{components → dist/components}/Flyout/Flyout.js +0 -0
  308. /package/{components → dist/components}/Flyout/Flyout.js.map +0 -0
  309. /package/{components → dist/components}/Flyout/index.d.ts +0 -0
  310. /package/{components → dist/components}/Flyout.d.ts +0 -0
  311. /package/{components → dist/components}/Gallery/Gallery.cjs +0 -0
  312. /package/{components → dist/components}/Gallery/Gallery.cjs.map +0 -0
  313. /package/{components → dist/components}/Gallery/Gallery.d.ts +0 -0
  314. /package/{components → dist/components}/Gallery/Gallery.definition.d.ts +0 -0
  315. /package/{components → dist/components}/Gallery/Gallery.js +0 -0
  316. /package/{components → dist/components}/Gallery/Gallery.js.map +0 -0
  317. /package/{components → dist/components}/Gallery/GalleryLightbox.d.ts +0 -0
  318. /package/{components → dist/components}/Gallery/GalleryMain.d.ts +0 -0
  319. /package/{components → dist/components}/Gallery/GalleryThumbnails.d.ts +0 -0
  320. /package/{components → dist/components}/Gallery/index.d.ts +0 -0
  321. /package/{components → dist/components}/Gallery.d.ts +0 -0
  322. /package/{components → dist/components}/Icon/Icon.cjs +0 -0
  323. /package/{components → dist/components}/Icon/Icon.cjs.map +0 -0
  324. /package/{components → dist/components}/Icon/Icon.d.ts +0 -0
  325. /package/{components → dist/components}/Icon/Icon.js +0 -0
  326. /package/{components → dist/components}/Icon/Icon.js.map +0 -0
  327. /package/{components → dist/components}/Icon/index.d.ts +0 -0
  328. /package/{components → dist/components}/Icon.d.ts +0 -0
  329. /package/{components → dist/components}/Input/Input.cjs +0 -0
  330. /package/{components → dist/components}/Input/Input.cjs.map +0 -0
  331. /package/{components → dist/components}/Input/Input.d.ts +0 -0
  332. /package/{components → dist/components}/Input/Input.definitions.d.ts +0 -0
  333. /package/{components → dist/components}/Input/Input.helpers.d.ts +0 -0
  334. /package/{components → dist/components}/Input/Input.js +0 -0
  335. /package/{components → dist/components}/Input/Input.js.map +0 -0
  336. /package/{components → dist/components}/Input/Input.sx.d.ts +0 -0
  337. /package/{components → dist/components}/Input/Input.types.d.ts +0 -0
  338. /package/{components → dist/components}/Input/index.d.ts +0 -0
  339. /package/{components → dist/components}/Input.d.ts +0 -0
  340. /package/{components → dist/components}/InputGroup/InputGroup.cjs +0 -0
  341. /package/{components → dist/components}/InputGroup/InputGroup.cjs.map +0 -0
  342. /package/{components → dist/components}/InputGroup/InputGroup.d.ts +0 -0
  343. /package/{components → dist/components}/InputGroup/InputGroup.definitions.d.ts +0 -0
  344. /package/{components → dist/components}/InputGroup/InputGroup.js +0 -0
  345. /package/{components → dist/components}/InputGroup/InputGroup.js.map +0 -0
  346. /package/{components → dist/components}/InputGroup/index.d.ts +0 -0
  347. /package/{components → dist/components}/InputGroup.d.ts +0 -0
  348. /package/{components → dist/components}/MenuButton/MenuButton.cjs +0 -0
  349. /package/{components → dist/components}/MenuButton/MenuButton.cjs.map +0 -0
  350. /package/{components → dist/components}/MenuButton/MenuButton.d.ts +0 -0
  351. /package/{components → dist/components}/MenuButton/MenuButton.js +0 -0
  352. /package/{components → dist/components}/MenuButton/MenuButton.js.map +0 -0
  353. /package/{components → dist/components}/MenuButton/index.d.ts +0 -0
  354. /package/{components → dist/components}/MenuButton.d.ts +0 -0
  355. /package/{components → dist/components}/Modal/Modal.cjs +0 -0
  356. /package/{components → dist/components}/Modal/Modal.cjs.map +0 -0
  357. /package/{components → dist/components}/Modal/Modal.d.ts +0 -0
  358. /package/{components → dist/components}/Modal/Modal.js +0 -0
  359. /package/{components → dist/components}/Modal/Modal.js.map +0 -0
  360. /package/{components → dist/components}/Modal/ModalBody.d.ts +0 -0
  361. /package/{components → dist/components}/Modal/ModalFooter.d.ts +0 -0
  362. /package/{components → dist/components}/Modal/ModalHeader.d.ts +0 -0
  363. /package/{components → dist/components}/Modal/index.d.ts +0 -0
  364. /package/{components → dist/components}/Modal.d.ts +0 -0
  365. /package/{components → dist/components}/PageLoader/PageLoader.cjs +0 -0
  366. /package/{components → dist/components}/PageLoader/PageLoader.cjs.map +0 -0
  367. /package/{components → dist/components}/PageLoader/PageLoader.d.ts +0 -0
  368. /package/{components → dist/components}/PageLoader/PageLoader.js +0 -0
  369. /package/{components → dist/components}/PageLoader/PageLoader.js.map +0 -0
  370. /package/{components → dist/components}/PageLoader/index.d.ts +0 -0
  371. /package/{components → dist/components}/PageLoader.d.ts +0 -0
  372. /package/{components → dist/components}/ScrollTopButton/ScrollTopButton.cjs +0 -0
  373. /package/{components → dist/components}/ScrollTopButton/ScrollTopButton.cjs.map +0 -0
  374. /package/{components → dist/components}/ScrollTopButton/ScrollTopButton.d.ts +0 -0
  375. /package/{components → dist/components}/ScrollTopButton/ScrollTopButton.js +0 -0
  376. /package/{components → dist/components}/ScrollTopButton/ScrollTopButton.js.map +0 -0
  377. /package/{components → dist/components}/ScrollTopButton/index.d.ts +0 -0
  378. /package/{components → dist/components}/ScrollTopButton/scrollToTop.d.ts +0 -0
  379. /package/{components → dist/components}/ScrollTopButton.d.ts +0 -0
  380. /package/{components → dist/components}/Select/Select.cjs +0 -0
  381. /package/{components → dist/components}/Select/Select.cjs.map +0 -0
  382. /package/{components → dist/components}/Select/Select.d.ts +0 -0
  383. /package/{components → dist/components}/Select/Select.definitions.d.ts +0 -0
  384. /package/{components → dist/components}/Select/Select.helpers.d.ts +0 -0
  385. /package/{components → dist/components}/Select/Select.js +0 -0
  386. /package/{components → dist/components}/Select/Select.js.map +0 -0
  387. /package/{components → dist/components}/Select/Select.sx.d.ts +0 -0
  388. /package/{components → dist/components}/Select/Select.types.d.ts +0 -0
  389. /package/{components → dist/components}/Select/_parts/SelectMenuItem.d.ts +0 -0
  390. /package/{components → dist/components}/Select/_parts/SelectSearchHeader.d.ts +0 -0
  391. /package/{components → dist/components}/Select/_parts/SelectValue.d.ts +0 -0
  392. /package/{components → dist/components}/Select/index.d.ts +0 -0
  393. /package/{components → dist/components}/Select.d.ts +0 -0
  394. /package/{components → dist/components}/Stat/Stat.cjs +0 -0
  395. /package/{components → dist/components}/Stat/Stat.cjs.map +0 -0
  396. /package/{components → dist/components}/Stat/Stat.d.ts +0 -0
  397. /package/{components → dist/components}/Stat/Stat.js +0 -0
  398. /package/{components → dist/components}/Stat/Stat.js.map +0 -0
  399. /package/{components → dist/components}/Stat/index.d.ts +0 -0
  400. /package/{components → dist/components}/Stat.d.ts +0 -0
  401. /package/{components → dist/components}/StatusMessage/StatusMessage.cjs +0 -0
  402. /package/{components → dist/components}/StatusMessage/StatusMessage.cjs.map +0 -0
  403. /package/{components → dist/components}/StatusMessage/StatusMessage.d.ts +0 -0
  404. /package/{components → dist/components}/StatusMessage/StatusMessage.js +0 -0
  405. /package/{components → dist/components}/StatusMessage/StatusMessage.js.map +0 -0
  406. /package/{components → dist/components}/StatusMessage/index.d.ts +0 -0
  407. /package/{components → dist/components}/StatusMessage.d.ts +0 -0
  408. /package/{components → dist/components}/Stepper/Step.d.ts +0 -0
  409. /package/{components → dist/components}/Stepper/Stepper.cjs +0 -0
  410. /package/{components → dist/components}/Stepper/Stepper.cjs.map +0 -0
  411. /package/{components → dist/components}/Stepper/Stepper.d.ts +0 -0
  412. /package/{components → dist/components}/Stepper/Stepper.definition.d.ts +0 -0
  413. /package/{components → dist/components}/Stepper/Stepper.js +0 -0
  414. /package/{components → dist/components}/Stepper/Stepper.js.map +0 -0
  415. /package/{components → dist/components}/Stepper/index.d.ts +0 -0
  416. /package/{components → dist/components}/Stepper.d.ts +0 -0
  417. /package/{components → dist/components}/Table/Table.cjs +0 -0
  418. /package/{components → dist/components}/Table/Table.cjs.map +0 -0
  419. /package/{components → dist/components}/Table/Table.d.ts +0 -0
  420. /package/{components → dist/components}/Table/Table.definition.d.ts +0 -0
  421. /package/{components → dist/components}/Table/Table.js +0 -0
  422. /package/{components → dist/components}/Table/Table.js.map +0 -0
  423. /package/{components → dist/components}/Table/data.d.ts +0 -0
  424. /package/{components → dist/components}/Table/exportsUtils.d.ts +0 -0
  425. /package/{components → dist/components}/Table/index.d.ts +0 -0
  426. /package/{components → dist/components}/Table/types.d.ts +0 -0
  427. /package/{components → dist/components}/Table.d.ts +0 -0
  428. /package/{components → dist/components}/Tabs/Tab.d.ts +0 -0
  429. /package/{components → dist/components}/Tabs/Tab.definition.d.ts +0 -0
  430. /package/{components → dist/components}/Tabs/Tabs.cjs +0 -0
  431. /package/{components → dist/components}/Tabs/Tabs.cjs.map +0 -0
  432. /package/{components → dist/components}/Tabs/Tabs.d.ts +0 -0
  433. /package/{components → dist/components}/Tabs/Tabs.js +0 -0
  434. /package/{components → dist/components}/Tabs/Tabs.js.map +0 -0
  435. /package/{components → dist/components}/Tabs/_tabUtils.d.ts +0 -0
  436. /package/{components → dist/components}/Tabs/index.d.ts +0 -0
  437. /package/{components → dist/components}/Tabs.d.ts +0 -0
  438. /package/{components → dist/components}/Timeline/Timeline.cjs +0 -0
  439. /package/{components → dist/components}/Timeline/Timeline.cjs.map +0 -0
  440. /package/{components → dist/components}/Timeline/Timeline.d.ts +0 -0
  441. /package/{components → dist/components}/Timeline/Timeline.definition.d.ts +0 -0
  442. /package/{components → dist/components}/Timeline/Timeline.js +0 -0
  443. /package/{components → dist/components}/Timeline/Timeline.js.map +0 -0
  444. /package/{components → dist/components}/Timeline/TimelineItem.d.ts +0 -0
  445. /package/{components → dist/components}/Timeline/index.d.ts +0 -0
  446. /package/{components → dist/components}/Timeline.d.ts +0 -0
  447. /package/{components → dist/components}/Tooltip/Tooltip.cjs +0 -0
  448. /package/{components → dist/components}/Tooltip/Tooltip.cjs.map +0 -0
  449. /package/{components → dist/components}/Tooltip/Tooltip.d.ts +0 -0
  450. /package/{components → dist/components}/Tooltip/Tooltip.js +0 -0
  451. /package/{components → dist/components}/Tooltip/Tooltip.js.map +0 -0
  452. /package/{components → dist/components}/Tooltip/index.d.ts +0 -0
  453. /package/{components → dist/components}/Tooltip.d.ts +0 -0
  454. /package/{components → dist/components}/_shared/formField.sx.d.ts +0 -0
  455. /package/{components → dist/components}/_shared/resolvePreset.d.ts +0 -0
  456. /package/{formField.sx-CQ1mbk9M.cjs → dist/formField.sx-CQ1mbk9M.cjs} +0 -0
  457. /package/{formField.sx-CQ1mbk9M.cjs.map → dist/formField.sx-CQ1mbk9M.cjs.map} +0 -0
  458. /package/{formField.sx-DfVbMe0V.js → dist/formField.sx-DfVbMe0V.js} +0 -0
  459. /package/{formField.sx-DfVbMe0V.js.map → dist/formField.sx-DfVbMe0V.js.map} +0 -0
  460. /package/{hooks → dist/hooks}/ClipBoard/ClipBoard.cjs +0 -0
  461. /package/{hooks → dist/hooks}/ClipBoard/ClipBoard.cjs.map +0 -0
  462. /package/{hooks → dist/hooks}/ClipBoard/ClipBoard.d.ts +0 -0
  463. /package/{hooks → dist/hooks}/ClipBoard/ClipBoard.js +0 -0
  464. /package/{hooks → dist/hooks}/ClipBoard/ClipBoard.js.map +0 -0
  465. /package/{hooks → dist/hooks}/ClipBoard/ClipboardUnifiedDemo.d.ts +0 -0
  466. /package/{hooks → dist/hooks}/ClipBoard/index.d.ts +0 -0
  467. /package/{hooks → dist/hooks}/ClipBoard.d.ts +0 -0
  468. /package/{hooks → dist/hooks}/Wizard/Wizard.cjs +0 -0
  469. /package/{hooks → dist/hooks}/Wizard/Wizard.cjs.map +0 -0
  470. /package/{hooks → dist/hooks}/Wizard/Wizard.js +0 -0
  471. /package/{hooks → dist/hooks}/Wizard/Wizard.js.map +0 -0
  472. /package/{hooks → dist/hooks}/Wizard/WizardContext.d.ts +0 -0
  473. /package/{hooks → dist/hooks}/Wizard/index.d.ts +0 -0
  474. /package/{hooks → dist/hooks}/Wizard/useWizard.d.ts +0 -0
  475. /package/{hooks → dist/hooks}/Wizard.d.ts +0 -0
  476. /package/{index.d.ts → dist/index.d.ts} +0 -0
  477. /package/{index.js.map → dist/index.js.map} +0 -0
  478. /package/{resolvePreset-B-IB0ehH.js → dist/resolvePreset-B-IB0ehH.js} +0 -0
  479. /package/{resolvePreset-B-IB0ehH.js.map → dist/resolvePreset-B-IB0ehH.js.map} +0 -0
  480. /package/{resolvePreset-CT3kU-K2.cjs → dist/resolvePreset-CT3kU-K2.cjs} +0 -0
  481. /package/{resolvePreset-CT3kU-K2.cjs.map → dist/resolvePreset-CT3kU-K2.cjs.map} +0 -0
  482. /package/{styles.css → dist/styles.css} +0 -0
  483. /package/{theme → dist/theme}/componentStyles.d.ts +0 -0
  484. /package/{theme → dist/theme}/tokens.d.ts +0 -0
  485. /package/{useWizard-CWdIxZzX.cjs → dist/useWizard-CWdIxZzX.cjs} +0 -0
  486. /package/{useWizard-CWdIxZzX.cjs.map → dist/useWizard-CWdIxZzX.cjs.map} +0 -0
  487. /package/{useWizard-CWq--C3o.js → dist/useWizard-CWq--C3o.js} +0 -0
  488. /package/{useWizard-CWq--C3o.js.map → dist/useWizard-CWq--C3o.js.map} +0 -0
@@ -0,0 +1,721 @@
1
+ import React, { useState, useRef } from 'react'; // 👈 Importa useRef
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import { useForm } from 'react-hook-form';
4
+
5
+ import { Button, Typography, Box, Stack } from '@mui/material';
6
+ import { fn } from '@storybook/test';
7
+ import Modal, { ModalRef } from './Modal';
8
+ import { Input } from '../Input/Input';
9
+ import { useClipboard } from '../../hooks/ClipBoard';
10
+
11
+ const meta: Meta<typeof Modal> = {
12
+ title: 'Components/Modal',
13
+ component: Modal,
14
+ tags: ['autodocs'],
15
+ argTypes: {
16
+ open: {
17
+ control: 'boolean',
18
+ description: 'Controla si el modal está abierto o cerrado (uso controlado). Opcional si se usa el control imperativo con `ref`.',
19
+ },
20
+ onClose: {
21
+ action: 'onClose clickeado',
22
+ description: 'Función a ejecutar cuando el modal solicita cerrarse (ej. clic fuera o botón de cerrar). Opcional si se usa el control imperativo con `ref`.',
23
+ },
24
+ title: {
25
+ control: 'text',
26
+ description: 'Título opcional para el encabezado del modal. Se usará si no se proporciona `Modal.Header` explícitamente.',
27
+ },
28
+ children: {
29
+ control: 'object',
30
+ description: 'Contenido del modal, típicamente `Modal.Header`, `Modal.Body` y `Modal.Footer`.',
31
+ },
32
+ showCloseButton: {
33
+ control: 'boolean',
34
+ description: 'Controla la visibilidad del botón "Cerrar" por defecto en el `Modal.Footer`.',
35
+ },
36
+ closeButtonText: {
37
+ control: 'text',
38
+ description: 'Texto personalizado para el botón "Cerrar".',
39
+ },
40
+ closeButtonDisabled: {
41
+ control: 'boolean',
42
+ description: 'Deshabilita el botón "Cerrar".',
43
+ },
44
+ actions: {
45
+ control: 'object',
46
+ description: 'Un arreglo de objetos `ModalAction` para botones de acción personalizados en el `Modal.Footer`.',
47
+ },
48
+ maxWidth: {
49
+ control: 'select',
50
+ options: ['xs', 'sm', 'md', 'lg', 'xl', false],
51
+ description: 'Tamaño máximo del modal (propiedad de Material-UI `Dialog`).',
52
+ },
53
+ },
54
+ parameters: {
55
+ docs: {
56
+ description: {
57
+ component: 'Un componente de modal reutilizable de Material-UI con una estructura de componente compuesto (`Modal.Header`, `Modal.Body`, `Modal.Footer`). Puede ser controlado por una prop `open` o de forma imperativa a través de `ref` (`open()` y `close()` métodos). Permite definir acciones personalizadas y controlar la visibilidad y el estado de los botones por defecto.',
58
+ },
59
+ },
60
+ },
61
+ };
62
+
63
+ export default meta;
64
+ type Story = StoryObj<typeof Modal>;
65
+
66
+ // --- Historias ---
67
+
68
+ // Historia base: Modal simple con título y contenido básico (uso controlado por estado)
69
+ export const Default: Story = {
70
+ args: {
71
+ open: true,
72
+ onClose: fn(),
73
+ title: 'Modal de Ejemplo (Controlado por Estado)',
74
+ children: (
75
+ <Modal.Body>
76
+ <Typography>Este es el contenido principal del modal.</Typography>
77
+ <Typography sx={{ mt: 2 }}>Puedes colocar cualquier elemento React aquí.</Typography>
78
+ </Modal.Body>
79
+ ),
80
+ showCloseButton: true,
81
+ closeButtonText: 'Cerrar',
82
+ actions: [
83
+ { text: 'Guardar', onClick: fn(() => console.log("some some")), variant: 'contained' },
84
+ { text: 'Aceptar', onClick: fn(), color: 'success' },
85
+ ],
86
+ },
87
+ parameters: {
88
+ docs: {
89
+ description: {
90
+ story: 'Muestra un modal básico con un título y botones de acción, controlado por una prop `open` en el componente padre.',
91
+ },
92
+ },
93
+ },
94
+ };
95
+
96
+ // Nueva Historia: Modal controlado de forma Imperativa (sin estado `open` en el padre)
97
+ export const ImperativeControl: Story = {
98
+ render: (args) => {
99
+ const modalRef = useRef<ModalRef>(null);
100
+
101
+ const handleOpen = () => {
102
+ modalRef.current?.open();
103
+ };
104
+
105
+ const handleConfirm = () => {
106
+ alert('Acción confirmada desde el modal imperativo!');
107
+ modalRef.current?.close();
108
+ };
109
+
110
+ return (
111
+ <Box>
112
+ <Button onClick={handleOpen} variant="contained">
113
+ Abrir Modal Imperativo
114
+ </Button>
115
+
116
+ <Modal
117
+ ref={modalRef} // Asigna la ref al modal
118
+ // No se pasa la prop `open` aquí, el modal gestiona su estado interno
119
+ onClose={fn(() => console.log('Modal cerrado imperativamente'))} // El padre aún puede escuchar el cierre
120
+ title="Modal Controlado Imperativamente"
121
+ showCloseButton={true}
122
+ closeButtonText="Cerrar"
123
+ actions={[{ text: 'Aceptar', onClick: handleConfirm, variant: 'contained' }]}
124
+ maxWidth="sm"
125
+ {...args} // Pasa otras props del story
126
+ >
127
+ <Modal.Body>
128
+ <Typography>Este modal se abre y cierra llamando a métodos de la `ref`.</Typography>
129
+ <Typography sx={{ mt: 2 }}>No hay un `useState` para `open` en este componente padre.</Typography>
130
+ </Modal.Body>
131
+ </Modal>
132
+ </Box>
133
+ );
134
+ },
135
+ args: {
136
+ // Las props 'open' y 'onClose' se omiten o se gestionan internamente en el render
137
+ open: undefined, // Asegúrate de que `open` no se pase para activar el control interno
138
+ onClose: undefined, // `onClose` se gestiona en el render
139
+ },
140
+ parameters: {
141
+ docs: {
142
+ description: {
143
+ story: 'Demuestra cómo controlar el modal de forma imperativa usando `useRef` y los métodos `open()` y `close()` expuestos por el modal, sin necesidad de gestionar un estado `open` en el componente padre.',
144
+ },
145
+ },
146
+ },
147
+ };
148
+
149
+
150
+ // Historia: Modal con estructura de componente compuesto completa
151
+ export const CompleteStructure: Story = {
152
+ args: {
153
+ open: true,
154
+ onClose: fn(),
155
+ maxWidth: 'md',
156
+ children: (
157
+ <>
158
+ <Modal.Header>
159
+ <Typography variant="h6">Detalles del Artículo</Typography>
160
+ </Modal.Header>
161
+ <Modal.Body>
162
+ <Box sx={{ p: 2, border: '1px dashed grey', borderRadius: 1 }}>
163
+ <Typography>Aquí va un formulario complejo o información detallada.</Typography>
164
+ <Typography sx={{ mt: 1 }}>El cuerpo puede crecer y tener scroll si es necesario.</Typography>
165
+ <Button onClick={fn()} sx={{ mt: 2 }}>Acción en el cuerpo</Button>
166
+ </Box>
167
+ </Modal.Body>
168
+ <Modal.Footer
169
+ showCloseButton={false}
170
+ onClose={fn()} // Added onClose property
171
+ actions={[
172
+ { text: 'Cancelar', onClick: fn(), variant: 'outlined', color: 'error' },
173
+ { text: 'Confirmar Envío', onClick: fn(), variant: 'contained', color: 'primary' },
174
+ ]}
175
+ >
176
+ <Typography variant="caption" sx={{ mr: 2 }}>
177
+ Requiere confirmación.
178
+ </Typography>
179
+ </Modal.Footer>
180
+ </>
181
+ ),
182
+ },
183
+ parameters: {
184
+ docs: {
185
+ description: {
186
+ story: 'Demuestra el uso completo de la estructura de componente compuesto (`Modal.Header`, `Modal.Body`, `Modal.Footer`) con contenido variado y control de botones.',
187
+ },
188
+ },
189
+ },
190
+ };
191
+
192
+ // Historia: Modal sin botón de cerrar por defecto
193
+ export const NoDefaultCloseButton: Story = {
194
+ args: {
195
+ ...Default.args,
196
+ title: 'Modal sin botón de cerrar',
197
+ showCloseButton: false,
198
+ actions: [
199
+ { text: 'Entendido', onClick: fn(), variant: 'contained' },
200
+ ],
201
+ },
202
+ parameters: {
203
+ docs: {
204
+ description: {
205
+ story: 'Un modal que no muestra el botón "Cerrar" por defecto, forzando al usuario a usar las acciones personalizadas.',
206
+ },
207
+ },
208
+ },
209
+ };
210
+
211
+ // Historia: Modal con botón de cerrar deshabilitado
212
+ export const DisabledCloseButton: Story = {
213
+ args: {
214
+ ...Default.args,
215
+ title: 'Modal con botón de cerrar deshabilitado',
216
+ closeButtonDisabled: true,
217
+ actions: [
218
+ { text: 'Habilitar', onClick: fn(), variant: 'contained' },
219
+ ],
220
+ },
221
+ parameters: {
222
+ docs: {
223
+ description: {
224
+ story: 'Muestra un modal donde el botón "Cerrar" por defecto está deshabilitado.',
225
+ },
226
+ },
227
+ },
228
+ };
229
+
230
+ // Historia: Modal con diferentes tamaños (maxWidth)
231
+ export const Sizing: Story = {
232
+ render: (args: any) => {
233
+ const [openXs, setOpenXs] = useState(false);
234
+ const [openLg, setOpenLg] = useState(false);
235
+ const { ref, CopyMessage } = useClipboard();
236
+
237
+ return (
238
+ <Box sx={{ display: 'flex', gap: 2 }}>
239
+ <Button onClick={() => setOpenXs(true)} variant="outlined">Abrir XS</Button>
240
+ <Button onClick={() => setOpenLg(true)} variant="outlined">Abrir LG</Button>
241
+
242
+ <Modal {...args} open={openXs} onClose={() => setOpenXs(false)} title="Modal XS" maxWidth="xs">
243
+ <Modal.Body><Typography>Este es un modal de tamaño extra pequeño.</Typography></Modal.Body>
244
+ </Modal>
245
+
246
+ <Modal {...args} open={openLg} onClose={() => setOpenLg(false)} title="Modal LG" maxWidth="lg">
247
+ <Modal.Body>
248
+ <Typography ref={ref}>Este es un modal de tamaño grande.</Typography>
249
+ <CopyMessage />
250
+ </Modal.Body>
251
+ </Modal>
252
+ </Box>
253
+ );
254
+ },
255
+ args: {
256
+ open: false,
257
+ onClose: fn(),
258
+ },
259
+ parameters: {
260
+ docs: {
261
+ description: {
262
+ story: 'Demuestra cómo el modal se ajusta a diferentes tamaños (`maxWidth`) definidos por las propiedades de Material-UI.',
263
+ },
264
+ },
265
+ },
266
+ };
267
+
268
+ // Historia: Modal con texto largo en el cuerpo (para probar el scroll)
269
+ export const LongContent: Story = {
270
+ args: {
271
+ open: true,
272
+ onClose: fn(),
273
+ title: 'Modal con Contenido Largo',
274
+ maxWidth: 'sm',
275
+ children: (
276
+ <Modal.Body>
277
+ {Array.from({ length: 30 }, (_, i) => (
278
+ <Typography key={i} sx={{ mb: 1 }}>
279
+ Este es un párrafo de contenido largo para probar el scroll del modal. Línea {i + 1}.
280
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
281
+ </Typography>
282
+ ))}
283
+ </Modal.Body>
284
+ ),
285
+ },
286
+ parameters: {
287
+ docs: {
288
+ description: {
289
+ story: 'Muestra un modal con un cuerpo que contiene mucho texto, demostrando la funcionalidad de scroll automático.',
290
+ },
291
+ },
292
+ },
293
+ };
294
+ // =============================================================================
295
+ // RHF DENTRO DEL MODAL — Botones a nivel de BODY (forma recomendada)
296
+ // =============================================================================
297
+ // PROBLEMA: Si los botones viven en `Modal.Footer` (hermano de `Modal.Body`),
298
+ // el `<form>` no puede envolver a ambos porque son hermanos en el árbol.
299
+ // Entonces "Guardar" NO dispara submit ni validaciones.
300
+ //
301
+ // SOLUCIÓN: Meter el `<form>` + inputs + botones dentro del mismo `Modal.Body`.
302
+ // Usar `hiddenFooter` para ocultar el footer por defecto.
303
+ // =============================================================================
304
+
305
+ type UserFormValues = {
306
+ name: string;
307
+ email: string;
308
+ };
309
+
310
+ export const RHFInsideBody: Story = {
311
+ render: () => {
312
+ const [open, setOpen] = useState(false);
313
+ const [submitted, setSubmitted] = useState<UserFormValues | null>(null);
314
+
315
+ const {
316
+ control,
317
+ handleSubmit,
318
+ reset,
319
+ formState: { isSubmitting },
320
+ } = useForm<UserFormValues>({
321
+ defaultValues: { name: '', email: '' },
322
+ });
323
+
324
+ const onSubmit = async (data: UserFormValues) => {
325
+ await new Promise((r) => setTimeout(r, 500));
326
+ setSubmitted(data);
327
+ setOpen(false);
328
+ reset();
329
+ };
330
+
331
+ const handleClose = () => {
332
+ setOpen(false);
333
+ reset();
334
+ };
335
+
336
+ return (
337
+ <Box>
338
+ <Button variant="contained" onClick={() => setOpen(true)}>
339
+ Abrir form en Modal
340
+ </Button>
341
+ {submitted && (
342
+ <Typography sx={{ mt: 2 }} color="success.main">
343
+ Enviado: {JSON.stringify(submitted)}
344
+ </Typography>
345
+ )}
346
+
347
+ <Modal
348
+ open={open}
349
+ onClose={handleClose}
350
+ title="Crear usuario"
351
+ maxWidth="sm"
352
+ hiddenFooter // 👈 ocultamos el footer por defecto
353
+ >
354
+ <Modal.Body>
355
+ {/* El form envuelve TODO: inputs + botones.
356
+ Los botones están dentro del body, NO en un footer. */}
357
+ <Box
358
+ component="form"
359
+ onSubmit={handleSubmit(onSubmit)}
360
+ noValidate
361
+ paddingTop={2}
362
+ >
363
+ <Stack spacing={3}>
364
+ <Input
365
+ name="name"
366
+ control={control}
367
+ label="Nombre"
368
+ validation={{
369
+ required: 'El nombre es requerido',
370
+ minLength: { value: 2, message: 'Mínimo 2 caracteres' },
371
+ }}
372
+ />
373
+ <Input
374
+ name="email"
375
+ control={control}
376
+ label="Email"
377
+ type="email"
378
+ validation={{
379
+ required: 'El email es requerido',
380
+ pattern: {
381
+ value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
382
+ message: 'Email inválido',
383
+ },
384
+ }}
385
+ />
386
+
387
+ {/* Botones DENTRO del form, a nivel del body. */}
388
+ <Stack
389
+ direction="row"
390
+ spacing={1}
391
+ justifyContent="flex-end"
392
+ sx={{ pt: 1 }}
393
+ >
394
+ <Button
395
+ type="button"
396
+ variant="text"
397
+ onClick={handleClose}
398
+ disabled={isSubmitting}
399
+ >
400
+ Cancelar
401
+ </Button>
402
+ <Button
403
+ type="submit"
404
+ variant="contained"
405
+ disabled={isSubmitting}
406
+ >
407
+ {isSubmitting ? 'Guardando...' : 'Guardar'}
408
+ </Button>
409
+ </Stack>
410
+ </Stack>
411
+ </Box>
412
+ </Modal.Body>
413
+ </Modal>
414
+ </Box>
415
+ );
416
+ },
417
+ parameters: {
418
+ docs: {
419
+ description: {
420
+ story: [
421
+ '**Modal + React Hook Form con botones a nivel del Body (recomendado).**',
422
+ '',
423
+ 'Cuando usás RHF dentro de un modal, los botones de submit/cancel deben',
424
+ 'vivir dentro del mismo `<form>` que los inputs. Si ponés los botones',
425
+ 'en `Modal.Footer`, quedan en un subárbol hermano al Body y el submit',
426
+ 'no dispara porque el `<form>` no los envuelve.',
427
+ '',
428
+ 'La solución es:',
429
+ '1. Usar `hiddenFooter` en el Modal para ocultar el footer por defecto.',
430
+ '2. Meter el `<form>`, los inputs y los botones todos dentro de `Modal.Body`.',
431
+ '3. El botón de submit usa `type="submit"`, que dispara el `onSubmit` del form.',
432
+ ].join('\n'),
433
+ },
434
+ },
435
+ },
436
+ };
437
+
438
+ // =============================================================================
439
+ // RHF con botones en FOOTER usando formId (alternativa avanzada)
440
+ // =============================================================================
441
+ // Si querés mantener el layout clásico (botones en footer, form en body), la
442
+ // forma correcta es conectar el botón al form por su atributo `form=""`.
443
+ // Esto sí funciona con HTML5 nativo: un `<button form="myFormId">` fuera del
444
+ // `<form>` sigue disparando el submit.
445
+ // =============================================================================
446
+
447
+ // =============================================================================
448
+ // MODO CONFIRM — reemplazo del ConfirmModal legacy
449
+ // =============================================================================
450
+
451
+ export const ConfirmInfo: Story = {
452
+ render: () => {
453
+ const [open, setOpen] = useState(false);
454
+ return (
455
+ <Box>
456
+ <Button variant="contained" onClick={() => setOpen(true)}>
457
+ Abrir confirm (info)
458
+ </Button>
459
+ <Modal
460
+ mode="confirm"
461
+ open={open}
462
+ onClose={() => setOpen(false)}
463
+ title="¿Deseas continuar?"
464
+ confirmMessage="Esta acción guardará los cambios realizados en el formulario."
465
+ confirmText="Sí, continuar"
466
+ closeButtonText="Cancelar"
467
+ onConfirm={() => console.log('confirmed')}
468
+ />
469
+ </Box>
470
+ );
471
+ },
472
+ parameters: {
473
+ docs: {
474
+ description: {
475
+ story: 'Confirm de severidad `info` (default). Layout centrado con icono circular, título, mensaje y botones Cancelar / Confirmar.',
476
+ },
477
+ },
478
+ },
479
+ };
480
+
481
+ export const ConfirmDelete: Story = {
482
+ render: () => {
483
+ const [open, setOpen] = useState(false);
484
+ return (
485
+ <Box>
486
+ <Button variant="outlined" color="error" onClick={() => setOpen(true)}>
487
+ Eliminar afiliación
488
+ </Button>
489
+ <Modal
490
+ mode="confirm"
491
+ severity="error"
492
+ open={open}
493
+ onClose={() => setOpen(false)}
494
+ title="Eliminar afiliación"
495
+ confirmMessage="Esta acción no se puede deshacer. ¿Confirmas que deseas eliminar la afiliación #12458?"
496
+ confirmText="Sí, eliminar"
497
+ closeButtonText="Cancelar"
498
+ onConfirm={() => console.log('deleted')}
499
+ />
500
+ </Box>
501
+ );
502
+ },
503
+ parameters: {
504
+ docs: {
505
+ description: {
506
+ story: 'Confirm de severidad `error` — icono rojo y botón primario rojo. Patrón típico para operaciones destructivas.',
507
+ },
508
+ },
509
+ },
510
+ };
511
+
512
+ export const ConfirmWarning: Story = {
513
+ render: () => {
514
+ const [open, setOpen] = useState(false);
515
+ return (
516
+ <Box>
517
+ <Button variant="contained" color="warning" onClick={() => setOpen(true)}>
518
+ Salir sin guardar
519
+ </Button>
520
+ <Modal
521
+ mode="confirm"
522
+ severity="warning"
523
+ open={open}
524
+ onClose={() => setOpen(false)}
525
+ title="Tienes cambios sin guardar"
526
+ confirmMessage="Si sales ahora perderás los cambios realizados. ¿Deseas salir igualmente?"
527
+ confirmText="Salir sin guardar"
528
+ closeButtonText="Seguir editando"
529
+ onConfirm={() => console.log('discarded')}
530
+ />
531
+ </Box>
532
+ );
533
+ },
534
+ };
535
+
536
+ export const ConfirmSuccess: Story = {
537
+ render: () => {
538
+ const [open, setOpen] = useState(false);
539
+ return (
540
+ <Box>
541
+ <Button variant="contained" color="success" onClick={() => setOpen(true)}>
542
+ Aprobar solicitud
543
+ </Button>
544
+ <Modal
545
+ mode="confirm"
546
+ severity="success"
547
+ open={open}
548
+ onClose={() => setOpen(false)}
549
+ title="Aprobar solicitud"
550
+ confirmMessage="Al aprobar, el cliente recibirá una notificación y se activará su afiliación."
551
+ confirmText="Aprobar"
552
+ closeButtonText="Cancelar"
553
+ onConfirm={() => console.log('approved')}
554
+ />
555
+ </Box>
556
+ );
557
+ },
558
+ };
559
+
560
+ export const ConfirmAsync: Story = {
561
+ render: () => {
562
+ const [open, setOpen] = useState(false);
563
+ const [result, setResult] = useState<string | null>(null);
564
+
565
+ const simulateRequest = () =>
566
+ new Promise<void>((resolve) => {
567
+ setTimeout(() => {
568
+ setResult('Ejecutado después de 1.5s');
569
+ resolve();
570
+ }, 1500);
571
+ });
572
+
573
+ return (
574
+ <Box>
575
+ <Button variant="contained" onClick={() => setOpen(true)}>
576
+ Confirmar con request async
577
+ </Button>
578
+ {result && (
579
+ <Typography sx={{ mt: 2 }} color="success.main">
580
+ {result}
581
+ </Typography>
582
+ )}
583
+ <Modal
584
+ mode="confirm"
585
+ open={open}
586
+ onClose={() => setOpen(false)}
587
+ title="Procesar afiliación"
588
+ confirmMessage="Esto enviará la solicitud al backend y puede tardar unos segundos."
589
+ confirmText="Procesar"
590
+ onConfirm={simulateRequest}
591
+ />
592
+ </Box>
593
+ );
594
+ },
595
+ parameters: {
596
+ docs: {
597
+ description: {
598
+ story: 'El `onConfirm` puede devolver una `Promise`. Mientras resuelve, los botones quedan deshabilitados para evitar clicks dobles. Al resolver, el modal cierra automáticamente.',
599
+ },
600
+ },
601
+ },
602
+ };
603
+
604
+ export const RHFWithFooterFormId: Story = {
605
+ render: () => {
606
+ const [open, setOpen] = useState(false);
607
+ const [submitted, setSubmitted] = useState<UserFormValues | null>(null);
608
+
609
+ const {
610
+ control,
611
+ handleSubmit,
612
+ reset,
613
+ formState: { isSubmitting },
614
+ } = useForm<UserFormValues>({
615
+ defaultValues: { name: '', email: '' },
616
+ });
617
+
618
+ const FORM_ID = 'user-form-footer';
619
+
620
+ const onSubmit = async (data: UserFormValues) => {
621
+ await new Promise((r) => setTimeout(r, 500));
622
+ setSubmitted(data);
623
+ setOpen(false);
624
+ reset();
625
+ };
626
+
627
+ const handleClose = () => {
628
+ setOpen(false);
629
+ reset();
630
+ };
631
+
632
+ return (
633
+ <Box>
634
+ <Button variant="contained" onClick={() => setOpen(true)}>
635
+ Abrir form (footer con formId)
636
+ </Button>
637
+ {submitted && (
638
+ <Typography sx={{ mt: 2 }} color="success.main">
639
+ Enviado: {JSON.stringify(submitted)}
640
+ </Typography>
641
+ )}
642
+
643
+ <Modal
644
+ open={open}
645
+ onClose={handleClose}
646
+ title="Crear usuario (footer)"
647
+ maxWidth="sm"
648
+ actions={[
649
+ {
650
+ text: isSubmitting ? 'Guardando...' : 'Guardar',
651
+ // 👇 clave: el botón referencia al form por id.
652
+ buttonProps: {
653
+ type: 'submit',
654
+ form: FORM_ID,
655
+ variant: 'contained',
656
+ disabled: isSubmitting,
657
+ },
658
+ },
659
+ ]}
660
+ closeButtonText="Cancelar"
661
+ >
662
+ <Modal.Body>
663
+ <Box
664
+ component="form"
665
+ id={FORM_ID}
666
+ onSubmit={handleSubmit(onSubmit)}
667
+ noValidate
668
+ paddingTop={2}
669
+ >
670
+ <Stack spacing={3}>
671
+ <Input
672
+ name="name"
673
+ control={control}
674
+ label="Nombre"
675
+ validation={{
676
+ required: 'El nombre es requerido',
677
+ }}
678
+ />
679
+ <Input
680
+ name="email"
681
+ control={control}
682
+ label="Email"
683
+ type="email"
684
+ validation={{
685
+ required: 'El email es requerido',
686
+ pattern: {
687
+ value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
688
+ message: 'Email inválido',
689
+ },
690
+ }}
691
+ />
692
+ </Stack>
693
+ </Box>
694
+ </Modal.Body>
695
+ </Modal>
696
+ </Box>
697
+ );
698
+ },
699
+ parameters: {
700
+ docs: {
701
+ description: {
702
+ story: [
703
+ '**Alternativa avanzada: botones en el footer usando `form="formId"`.**',
704
+ '',
705
+ 'Si necesitás mantener el layout clásico (Header / Body / Footer) con los',
706
+ 'botones en el footer, la forma correcta es asignarle un `id` al `<form>`',
707
+ 'y al botón de submit le pasás `form="mismoId"`. HTML5 nativo conecta',
708
+ 'el botón con el form aunque no sean hermanos en el DOM.',
709
+ '',
710
+ '```tsx',
711
+ '<form id="user-form" onSubmit={handleSubmit(onSubmit)}>...</form>',
712
+ '<button type="submit" form="user-form">Guardar</button>',
713
+ '```',
714
+ '',
715
+ 'Es la alternativa cuando querés reutilizar `Modal.Footer` con sus `actions`',
716
+ 'en lugar de construir los botones a mano dentro del body.',
717
+ ].join('\n'),
718
+ },
719
+ },
720
+ },
721
+ };