@brcarddev/frontend-commons 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +241 -0
  2. package/eslint.config.js +190 -0
  3. package/package.json +161 -0
  4. package/src/components/atoms/AudioPlayer/audio-player.stories.tsx +36 -0
  5. package/src/components/atoms/AudioPlayer/audio-player.test.tsx +20 -0
  6. package/src/components/atoms/AudioPlayer/audio-player.tsx +13 -0
  7. package/src/components/atoms/AudioPlayer/index.ts +1 -0
  8. package/src/components/atoms/Badge/badge.stories.tsx +80 -0
  9. package/src/components/atoms/Badge/badge.test.tsx +59 -0
  10. package/src/components/atoms/Badge/badge.tsx +47 -0
  11. package/src/components/atoms/Badge/index.ts +1 -0
  12. package/src/components/atoms/Box/box.stories.tsx +37 -0
  13. package/src/components/atoms/Box/box.test.tsx +47 -0
  14. package/src/components/atoms/Box/box.tsx +7 -0
  15. package/src/components/atoms/Box/index.ts +1 -0
  16. package/src/components/atoms/Button/button.stories.tsx +108 -0
  17. package/src/components/atoms/Button/button.test.tsx +54 -0
  18. package/src/components/atoms/Button/button.tsx +96 -0
  19. package/src/components/atoms/Button/index.ts +1 -0
  20. package/src/components/atoms/ButtonUpload/button-upload.stories.tsx +137 -0
  21. package/src/components/atoms/ButtonUpload/button-upload.tsx +304 -0
  22. package/src/components/atoms/ButtonUpload/index.ts +1 -0
  23. package/src/components/atoms/Calendar/calendar.stories.tsx +51 -0
  24. package/src/components/atoms/Calendar/calendar.test.tsx +41 -0
  25. package/src/components/atoms/Calendar/calendar.tsx +107 -0
  26. package/src/components/atoms/Calendar/index.ts +1 -0
  27. package/src/components/atoms/CheckIcon/check-icon.stories.tsx +38 -0
  28. package/src/components/atoms/CheckIcon/check-icon.test.tsx +270 -0
  29. package/src/components/atoms/CheckIcon/check-icon.tsx +141 -0
  30. package/src/components/atoms/CheckIcon/index.ts +1 -0
  31. package/src/components/atoms/Checkbox/checkbox.stories.tsx +133 -0
  32. package/src/components/atoms/Checkbox/checkbox.test.tsx +70 -0
  33. package/src/components/atoms/Checkbox/checkbox.tsx +31 -0
  34. package/src/components/atoms/Checkbox/index.ts +1 -0
  35. package/src/components/atoms/Flex/flex.stories.tsx +33 -0
  36. package/src/components/atoms/Flex/flex.test.tsx +47 -0
  37. package/src/components/atoms/Flex/flex.tsx +7 -0
  38. package/src/components/atoms/Flex/index.ts +1 -0
  39. package/src/components/atoms/Grid/grid.stories.tsx +33 -0
  40. package/src/components/atoms/Grid/grid.test.tsx +47 -0
  41. package/src/components/atoms/Grid/grid.tsx +7 -0
  42. package/src/components/atoms/Grid/index.ts +1 -0
  43. package/src/components/atoms/Icon/icon.stories.tsx +169 -0
  44. package/src/components/atoms/Icon/icon.test.tsx +272 -0
  45. package/src/components/atoms/Icon/icon.tsx +119 -0
  46. package/src/components/atoms/Icon/index.ts +1 -0
  47. package/src/components/atoms/Input/index.ts +1 -0
  48. package/src/components/atoms/Input/input.stories.tsx +704 -0
  49. package/src/components/atoms/Input/input.test.tsx +86 -0
  50. package/src/components/atoms/Input/input.tsx +161 -0
  51. package/src/components/atoms/InputMoney/index.ts +2 -0
  52. package/src/components/atoms/InputMoney/input-money.stories.tsx +240 -0
  53. package/src/components/atoms/InputMoney/input-money.test.tsx +98 -0
  54. package/src/components/atoms/InputMoney/input-money.tsx +254 -0
  55. package/src/components/atoms/InputPhone/index.ts +2 -0
  56. package/src/components/atoms/InputPhone/input-phone.stories.tsx +447 -0
  57. package/src/components/atoms/InputPhone/input-phone.test.tsx +148 -0
  58. package/src/components/atoms/InputPhone/input-phone.tsx +267 -0
  59. package/src/components/atoms/InputSearch/index.ts +2 -0
  60. package/src/components/atoms/InputSearch/input-search.stories.tsx +360 -0
  61. package/src/components/atoms/InputSearch/input-search.test.tsx +239 -0
  62. package/src/components/atoms/InputSearch/input-search.tsx +210 -0
  63. package/src/components/atoms/InputUpload/index.ts +1 -0
  64. package/src/components/atoms/InputUpload/input-upload.stories.tsx +229 -0
  65. package/src/components/atoms/InputUpload/input-upload.test.tsx +556 -0
  66. package/src/components/atoms/InputUpload/input-upload.tsx +434 -0
  67. package/src/components/atoms/InputWithButton/index.ts +2 -0
  68. package/src/components/atoms/InputWithButton/input-with-button.stories.tsx +503 -0
  69. package/src/components/atoms/InputWithButton/input-with-button.test.tsx +128 -0
  70. package/src/components/atoms/InputWithButton/input-with-button.tsx +170 -0
  71. package/src/components/atoms/Label/index.ts +1 -0
  72. package/src/components/atoms/Label/label.stories.tsx +90 -0
  73. package/src/components/atoms/Label/label.test.tsx +59 -0
  74. package/src/components/atoms/Label/label.tsx +43 -0
  75. package/src/components/atoms/Progress/index.ts +1 -0
  76. package/src/components/atoms/Progress/progress.stories.tsx +30 -0
  77. package/src/components/atoms/Progress/progress.test.tsx +63 -0
  78. package/src/components/atoms/Progress/progress.tsx +32 -0
  79. package/src/components/atoms/RenderCondition/index.ts +1 -0
  80. package/src/components/atoms/RenderCondition/render-condition.stories.tsx +28 -0
  81. package/src/components/atoms/RenderCondition/render-condition.test.tsx +27 -0
  82. package/src/components/atoms/RenderCondition/render-condition.tsx +9 -0
  83. package/src/components/atoms/RichTextEditor/index.ts +1 -0
  84. package/src/components/atoms/RichTextEditor/rich-text-editor.stories.tsx +214 -0
  85. package/src/components/atoms/RichTextEditor/rich-text-editor.test.tsx +442 -0
  86. package/src/components/atoms/RichTextEditor/rich-text-editor.tsx +202 -0
  87. package/src/components/atoms/Separator/index.ts +1 -0
  88. package/src/components/atoms/Separator/separator.stories.tsx +117 -0
  89. package/src/components/atoms/Separator/separator.test.tsx +50 -0
  90. package/src/components/atoms/Separator/separator.tsx +28 -0
  91. package/src/components/atoms/Skeleton/index.ts +1 -0
  92. package/src/components/atoms/Skeleton/skeleton.stories.tsx +84 -0
  93. package/src/components/atoms/Skeleton/skeleton.test.tsx +39 -0
  94. package/src/components/atoms/Skeleton/skeleton.tsx +14 -0
  95. package/src/components/atoms/Slider/index.ts +1 -0
  96. package/src/components/atoms/Slider/slider.stories.tsx +28 -0
  97. package/src/components/atoms/Slider/slider.test.tsx +90 -0
  98. package/src/components/atoms/Slider/slider.tsx +54 -0
  99. package/src/components/atoms/Sonner/index.ts +1 -0
  100. package/src/components/atoms/Sonner/sonner.css +39 -0
  101. package/src/components/atoms/Sonner/sonner.stories.tsx +261 -0
  102. package/src/components/atoms/Sonner/sonner.test.tsx +24 -0
  103. package/src/components/atoms/Sonner/sonner.tsx +13 -0
  104. package/src/components/atoms/Switch/index.ts +1 -0
  105. package/src/components/atoms/Switch/switch.stories.tsx +128 -0
  106. package/src/components/atoms/Switch/switch.test.tsx +70 -0
  107. package/src/components/atoms/Switch/switch.tsx +61 -0
  108. package/src/components/atoms/Textarea/index.ts +1 -0
  109. package/src/components/atoms/Textarea/textarea.stories.tsx +169 -0
  110. package/src/components/atoms/Textarea/textarea.test.tsx +56 -0
  111. package/src/components/atoms/Textarea/textarea.tsx +26 -0
  112. package/src/components/atoms/Toggle/index.ts +1 -0
  113. package/src/components/atoms/Toggle/toggle.stories.tsx +170 -0
  114. package/src/components/atoms/Toggle/toggle.test.tsx +62 -0
  115. package/src/components/atoms/Toggle/toggle.tsx +47 -0
  116. package/src/components/atoms/Typography/index.ts +1 -0
  117. package/src/components/atoms/Typography/typography.stories.tsx +95 -0
  118. package/src/components/atoms/Typography/typography.test.tsx +66 -0
  119. package/src/components/atoms/Typography/typography.tsx +63 -0
  120. package/src/components/atoms/UploadImageField/index.ts +1 -0
  121. package/src/components/atoms/UploadImageField/upload-image-field.stories.tsx +249 -0
  122. package/src/components/atoms/UploadImageField/upload-image-field.test.tsx +348 -0
  123. package/src/components/atoms/UploadImageField/upload-image-field.tsx +362 -0
  124. package/src/components/atoms/VideoPlayer/index.ts +1 -0
  125. package/src/components/atoms/VideoPlayer/video-player.stories.tsx +37 -0
  126. package/src/components/atoms/VideoPlayer/video-player.test.tsx +20 -0
  127. package/src/components/atoms/VideoPlayer/video-player.tsx +26 -0
  128. package/src/components/atoms/index.ts +31 -0
  129. package/src/components/icons/alert-circle.tsx +22 -0
  130. package/src/components/icons/align-center.tsx +22 -0
  131. package/src/components/icons/align-left.tsx +22 -0
  132. package/src/components/icons/annotation-dots.tsx +16 -0
  133. package/src/components/icons/annotation-question.tsx +15 -0
  134. package/src/components/icons/annotation.tsx +22 -0
  135. package/src/components/icons/announcement-01.tsx +15 -0
  136. package/src/components/icons/announcement-02.tsx +15 -0
  137. package/src/components/icons/apple-logo.tsx +9 -0
  138. package/src/components/icons/arrow-circle-broken-right.tsx +16 -0
  139. package/src/components/icons/arrow-down.tsx +9 -0
  140. package/src/components/icons/arrow-up.tsx +9 -0
  141. package/src/components/icons/at-sign.tsx +21 -0
  142. package/src/components/icons/award-01.tsx +15 -0
  143. package/src/components/icons/award-03.tsx +16 -0
  144. package/src/components/icons/bank-note-01.tsx +15 -0
  145. package/src/components/icons/bar-chart-square-02.tsx +9 -0
  146. package/src/components/icons/bell-01.tsx +9 -0
  147. package/src/components/icons/bell-04.tsx +16 -0
  148. package/src/components/icons/bold-01.tsx +22 -0
  149. package/src/components/icons/book-open-01.tsx +15 -0
  150. package/src/components/icons/brackets-ellipses.tsx +22 -0
  151. package/src/components/icons/briefcase-01.tsx +9 -0
  152. package/src/components/icons/brush-01.tsx +22 -0
  153. package/src/components/icons/building-02.tsx +9 -0
  154. package/src/components/icons/building-06.tsx +9 -0
  155. package/src/components/icons/calendar-minus-02.tsx +15 -0
  156. package/src/components/icons/calendar.tsx +9 -0
  157. package/src/components/icons/certificate-01.tsx +16 -0
  158. package/src/components/icons/chart-breakout-square.tsx +16 -0
  159. package/src/components/icons/check-circle-02.tsx +16 -0
  160. package/src/components/icons/check-circle.tsx +15 -0
  161. package/src/components/icons/check.tsx +21 -0
  162. package/src/components/icons/chevron-down-double.tsx +16 -0
  163. package/src/components/icons/chevron-down.tsx +9 -0
  164. package/src/components/icons/chevron-left-double.tsx +22 -0
  165. package/src/components/icons/chevron-left.tsx +16 -0
  166. package/src/components/icons/chevron-right-double.tsx +22 -0
  167. package/src/components/icons/chevron-right.tsx +16 -0
  168. package/src/components/icons/chevron-up-double.tsx +16 -0
  169. package/src/components/icons/clock-rewind.tsx +15 -0
  170. package/src/components/icons/clock-stopwatch.tsx +15 -0
  171. package/src/components/icons/coins-hand.tsx +15 -0
  172. package/src/components/icons/coins-stacked-01.tsx +15 -0
  173. package/src/components/icons/coins-stacked-02.tsx +15 -0
  174. package/src/components/icons/container.tsx +9 -0
  175. package/src/components/icons/copy-02.tsx +16 -0
  176. package/src/components/icons/copy-04.tsx +21 -0
  177. package/src/components/icons/corner-down-right.tsx +9 -0
  178. package/src/components/icons/countries/br.tsx +20 -0
  179. package/src/components/icons/countries/es.tsx +19 -0
  180. package/src/components/icons/countries/index.ts +3 -0
  181. package/src/components/icons/countries/us.tsx +21 -0
  182. package/src/components/icons/dataflow-03.tsx +15 -0
  183. package/src/components/icons/dotpoints-01.tsx +22 -0
  184. package/src/components/icons/dots-vertical.tsx +35 -0
  185. package/src/components/icons/download-03.tsx +16 -0
  186. package/src/components/icons/download-cloud-02.tsx +15 -0
  187. package/src/components/icons/drag.tsx +14 -0
  188. package/src/components/icons/dropper.tsx +21 -0
  189. package/src/components/icons/edit-01.tsx +15 -0
  190. package/src/components/icons/edit-02.tsx +9 -0
  191. package/src/components/icons/edit-03.tsx +23 -0
  192. package/src/components/icons/eye.tsx +22 -0
  193. package/src/components/icons/face-frown.tsx +15 -0
  194. package/src/components/icons/face-happy.tsx +15 -0
  195. package/src/components/icons/file-06.tsx +15 -0
  196. package/src/components/icons/file-attachment-04.tsx +15 -0
  197. package/src/components/icons/file-download-02.tsx +16 -0
  198. package/src/components/icons/file-plus-02.tsx +16 -0
  199. package/src/components/icons/file-search-01.tsx +22 -0
  200. package/src/components/icons/file-search-03.tsx +15 -0
  201. package/src/components/icons/filter-lines.tsx +21 -0
  202. package/src/components/icons/first-category.tsx +16 -0
  203. package/src/components/icons/first-stage.tsx +19 -0
  204. package/src/components/icons/folder.tsx +15 -0
  205. package/src/components/icons/google.tsx +12 -0
  206. package/src/components/icons/graduation-hat-02.tsx +15 -0
  207. package/src/components/icons/grid-01.tsx +36 -0
  208. package/src/components/icons/help-circle.tsx +16 -0
  209. package/src/components/icons/help-square.tsx +16 -0
  210. package/src/components/icons/home-line.tsx +21 -0
  211. package/src/components/icons/icons.stories.tsx +199 -0
  212. package/src/components/icons/index.ts +140 -0
  213. package/src/components/icons/info-circle.tsx +15 -0
  214. package/src/components/icons/italic-01.tsx +22 -0
  215. package/src/components/icons/last-category.tsx +11 -0
  216. package/src/components/icons/last-stage.tsx +19 -0
  217. package/src/components/icons/layout-alt-04.tsx +9 -0
  218. package/src/components/icons/lightbulb-02.tsx +16 -0
  219. package/src/components/icons/link-01.tsx +16 -0
  220. package/src/components/icons/link-broken-01.tsx +16 -0
  221. package/src/components/icons/linkedin-logo.tsx +17 -0
  222. package/src/components/icons/lock-01.tsx +21 -0
  223. package/src/components/icons/log-out-01.tsx +9 -0
  224. package/src/components/icons/mail-01.tsx +16 -0
  225. package/src/components/icons/marker-pin-02.tsx +10 -0
  226. package/src/components/icons/menu-01.tsx +9 -0
  227. package/src/components/icons/middle-category.tsx +10 -0
  228. package/src/components/icons/middle-stage.tsx +19 -0
  229. package/src/components/icons/ms-outlook.tsx +47 -0
  230. package/src/components/icons/paragraph-spacing.tsx +15 -0
  231. package/src/components/icons/phone-01.tsx +21 -0
  232. package/src/components/icons/pie-chart-02.tsx +22 -0
  233. package/src/components/icons/plus-circle.tsx +15 -0
  234. package/src/components/icons/portal-logo.tsx +76 -0
  235. package/src/components/icons/presentation-chart-02.tsx +14 -0
  236. package/src/components/icons/route.tsx +22 -0
  237. package/src/components/icons/save-01.tsx +15 -0
  238. package/src/components/icons/search-lg.tsx +15 -0
  239. package/src/components/icons/search-sm.tsx +9 -0
  240. package/src/components/icons/send-03.tsx +15 -0
  241. package/src/components/icons/settings-01.tsx +17 -0
  242. package/src/components/icons/settings-03.tsx +14 -0
  243. package/src/components/icons/share-05.tsx +15 -0
  244. package/src/components/icons/share-06.tsx +15 -0
  245. package/src/components/icons/slash-circle-01.tsx +9 -0
  246. package/src/components/icons/star-01.tsx +9 -0
  247. package/src/components/icons/step-icon-active.tsx +11 -0
  248. package/src/components/icons/step-icon-checked.tsx +10 -0
  249. package/src/components/icons/step-icon-default.tsx +11 -0
  250. package/src/components/icons/switch-horizontal-01.tsx +9 -0
  251. package/src/components/icons/table-01.tsx +15 -0
  252. package/src/components/icons/tag-01.tsx +15 -0
  253. package/src/components/icons/tag-03.tsx +15 -0
  254. package/src/components/icons/tool-02.tsx +14 -0
  255. package/src/components/icons/trash-01.tsx +15 -0
  256. package/src/components/icons/underline-01.tsx +22 -0
  257. package/src/components/icons/upload-cloud-02.tsx +15 -0
  258. package/src/components/icons/user-01.tsx +9 -0
  259. package/src/components/icons/user-03.tsx +9 -0
  260. package/src/components/icons/user-check-01.tsx +14 -0
  261. package/src/components/icons/user-circle.tsx +14 -0
  262. package/src/components/icons/user-edit.tsx +16 -0
  263. package/src/components/icons/user-minus-02.tsx +15 -0
  264. package/src/components/icons/user-plus-01.tsx +22 -0
  265. package/src/components/icons/user-plus-02.tsx +15 -0
  266. package/src/components/icons/user-square.tsx +16 -0
  267. package/src/components/icons/users-01.tsx +14 -0
  268. package/src/components/icons/users-plus-01.tsx +21 -0
  269. package/src/components/icons/users-plus.tsx +16 -0
  270. package/src/components/icons/vertical-drag.tsx +21 -0
  271. package/src/components/icons/x-circle.tsx +15 -0
  272. package/src/components/icons/x-close.tsx +9 -0
  273. package/src/components/icons/zap-fast.tsx +16 -0
  274. package/src/components/icons/zap.tsx +9 -0
  275. package/src/components/index.ts +4 -0
  276. package/src/components/molecules/Accordion/accordion.stories.tsx +81 -0
  277. package/src/components/molecules/Accordion/accordion.test.tsx +91 -0
  278. package/src/components/molecules/Accordion/accordion.tsx +65 -0
  279. package/src/components/molecules/Accordion/index.ts +1 -0
  280. package/src/components/molecules/Alert/alert.stories.tsx +75 -0
  281. package/src/components/molecules/Alert/alert.test.tsx +58 -0
  282. package/src/components/molecules/Alert/alert.tsx +67 -0
  283. package/src/components/molecules/Alert/index.ts +1 -0
  284. package/src/components/molecules/AlertDialog/alert-dialog.stories.tsx +55 -0
  285. package/src/components/molecules/AlertDialog/alert-dialog.test.tsx +34 -0
  286. package/src/components/molecules/AlertDialog/alert-dialog.tsx +172 -0
  287. package/src/components/molecules/AlertDialog/index.ts +1 -0
  288. package/src/components/molecules/Avatar/avatar.stories.tsx +98 -0
  289. package/src/components/molecules/Avatar/avatar.test.tsx +55 -0
  290. package/src/components/molecules/Avatar/avatar.tsx +55 -0
  291. package/src/components/molecules/Avatar/index.ts +1 -0
  292. package/src/components/molecules/Breadcrumb/breadcrumb.stories.tsx +125 -0
  293. package/src/components/molecules/Breadcrumb/breadcrumb.test.tsx +118 -0
  294. package/src/components/molecules/Breadcrumb/breadcrumb.tsx +120 -0
  295. package/src/components/molecules/Breadcrumb/index.ts +1 -0
  296. package/src/components/molecules/Card/card.stories.tsx +109 -0
  297. package/src/components/molecules/Card/card.test.tsx +103 -0
  298. package/src/components/molecules/Card/card.tsx +78 -0
  299. package/src/components/molecules/Card/index.ts +1 -0
  300. package/src/components/molecules/Collapsible/collapsible.stories.tsx +28 -0
  301. package/src/components/molecules/Collapsible/collapsible.test.tsx +36 -0
  302. package/src/components/molecules/Collapsible/collapsible.tsx +31 -0
  303. package/src/components/molecules/Collapsible/index.ts +1 -0
  304. package/src/components/molecules/ColorPicker/color-picker.stories.tsx +40 -0
  305. package/src/components/molecules/ColorPicker/color-picker.tsx +106 -0
  306. package/src/components/molecules/ColorPicker/index.ts +1 -0
  307. package/src/components/molecules/ColorScale/color-scale.stories.tsx +31 -0
  308. package/src/components/molecules/ColorScale/color-scale.tsx +74 -0
  309. package/src/components/molecules/ColorScale/index.ts +1 -0
  310. package/src/components/molecules/Command/command.stories.tsx +71 -0
  311. package/src/components/molecules/Command/command.test.tsx +50 -0
  312. package/src/components/molecules/Command/command.tsx +177 -0
  313. package/src/components/molecules/Command/index.ts +1 -0
  314. package/src/components/molecules/ContextMenu/context-menu.stories.tsx +69 -0
  315. package/src/components/molecules/ContextMenu/context-menu.test.tsx +25 -0
  316. package/src/components/molecules/ContextMenu/context-menu.tsx +259 -0
  317. package/src/components/molecules/ContextMenu/index.ts +1 -0
  318. package/src/components/molecules/DatePicker/date-picker.stories.tsx +204 -0
  319. package/src/components/molecules/DatePicker/date-picker.test.tsx +27 -0
  320. package/src/components/molecules/DatePicker/date-picker.tsx +486 -0
  321. package/src/components/molecules/DatePicker/index.ts +1 -0
  322. package/src/components/molecules/Dialog/dialog.stories.tsx +48 -0
  323. package/src/components/molecules/Dialog/dialog.test.tsx +51 -0
  324. package/src/components/molecules/Dialog/dialog.tsx +150 -0
  325. package/src/components/molecules/Dialog/index.ts +1 -0
  326. package/src/components/molecules/Drawer/drawer.stories.tsx +182 -0
  327. package/src/components/molecules/Drawer/drawer.test.tsx +100 -0
  328. package/src/components/molecules/Drawer/drawer.tsx +206 -0
  329. package/src/components/molecules/Drawer/index.ts +1 -0
  330. package/src/components/molecules/Dropdown/dropdown-async.stories.tsx +15 -0
  331. package/src/components/molecules/Dropdown/dropdown.stories.tsx +112 -0
  332. package/src/components/molecules/Dropdown/dropdown.test.tsx +128 -0
  333. package/src/components/molecules/Dropdown/dropdown.tsx +322 -0
  334. package/src/components/molecules/Dropdown/index.ts +1 -0
  335. package/src/components/molecules/DropdownMenu/dropdown-menu.stories.tsx +154 -0
  336. package/src/components/molecules/DropdownMenu/dropdown-menu.test.tsx +163 -0
  337. package/src/components/molecules/DropdownMenu/dropdown-menu.tsx +313 -0
  338. package/src/components/molecules/DropdownMenu/index.ts +1 -0
  339. package/src/components/molecules/HoverCard/hover-card.stories.tsx +48 -0
  340. package/src/components/molecules/HoverCard/hover-card.test.tsx +42 -0
  341. package/src/components/molecules/HoverCard/hover-card.tsx +44 -0
  342. package/src/components/molecules/HoverCard/index.ts +1 -0
  343. package/src/components/molecules/InputOTP/index.ts +1 -0
  344. package/src/components/molecules/InputOTP/input-otp.stories.tsx +52 -0
  345. package/src/components/molecules/InputOTP/input-otp.test.tsx +28 -0
  346. package/src/components/molecules/InputOTP/input-otp.tsx +76 -0
  347. package/src/components/molecules/Menubar/index.ts +1 -0
  348. package/src/components/molecules/Menubar/menubar.stories.tsx +113 -0
  349. package/src/components/molecules/Menubar/menubar.test.tsx +42 -0
  350. package/src/components/molecules/Menubar/menubar.tsx +314 -0
  351. package/src/components/molecules/NavigationMenu/index.ts +1 -0
  352. package/src/components/molecules/NavigationMenu/navigation-menu.stories.tsx +143 -0
  353. package/src/components/molecules/NavigationMenu/navigation-menu.test.tsx +69 -0
  354. package/src/components/molecules/NavigationMenu/navigation-menu.tsx +174 -0
  355. package/src/components/molecules/PDFViewer/index.ts +1 -0
  356. package/src/components/molecules/PDFViewer/pdf-viewer.stories.tsx +34 -0
  357. package/src/components/molecules/PDFViewer/pdf-viewer.test.tsx +26 -0
  358. package/src/components/molecules/PDFViewer/pdf-viewer.tsx +358 -0
  359. package/src/components/molecules/Pagination/index.ts +1 -0
  360. package/src/components/molecules/Pagination/pagination.stories.tsx +193 -0
  361. package/src/components/molecules/Pagination/pagination.test.tsx +448 -0
  362. package/src/components/molecules/Pagination/pagination.tsx +206 -0
  363. package/src/components/molecules/PaginationDotGroup/index.ts +1 -0
  364. package/src/components/molecules/PaginationDotGroup/pagination-dot-group.stories.tsx +211 -0
  365. package/src/components/molecules/PaginationDotGroup/pagination-dot-group.test.tsx +385 -0
  366. package/src/components/molecules/PaginationDotGroup/pagination-dot-group.tsx +119 -0
  367. package/src/components/molecules/Popover/index.ts +1 -0
  368. package/src/components/molecules/Popover/popover-menu.stories.tsx +27 -0
  369. package/src/components/molecules/Popover/popover.test.tsx +50 -0
  370. package/src/components/molecules/Popover/popover.tsx +38 -0
  371. package/src/components/molecules/ProgressSteps/index.ts +1 -0
  372. package/src/components/molecules/ProgressSteps/progress-steps.stories.tsx +36 -0
  373. package/src/components/molecules/ProgressSteps/progress-steps.test.tsx +470 -0
  374. package/src/components/molecules/ProgressSteps/progress-steps.tsx +140 -0
  375. package/src/components/molecules/RadioGroup/index.ts +1 -0
  376. package/src/components/molecules/RadioGroup/radio-group.stories.tsx +42 -0
  377. package/src/components/molecules/RadioGroup/radio-group.test.tsx +22 -0
  378. package/src/components/molecules/RadioGroup/radio-group.tsx +55 -0
  379. package/src/components/molecules/Resizable/index.ts +1 -0
  380. package/src/components/molecules/Resizable/resizable.stories.tsx +52 -0
  381. package/src/components/molecules/Resizable/resizable.test.tsx +22 -0
  382. package/src/components/molecules/Resizable/resizable.tsx +55 -0
  383. package/src/components/molecules/ScrollArea/index.ts +1 -0
  384. package/src/components/molecules/ScrollArea/scroll-area.stories.tsx +93 -0
  385. package/src/components/molecules/ScrollArea/scroll-area.test.tsx +28 -0
  386. package/src/components/molecules/ScrollArea/scroll-area.tsx +57 -0
  387. package/src/components/molecules/Select/index.ts +1 -0
  388. package/src/components/molecules/Select/select.stories.tsx +63 -0
  389. package/src/components/molecules/Select/select.test.tsx +80 -0
  390. package/src/components/molecules/Select/select.tsx +172 -0
  391. package/src/components/molecules/Sheet/index.ts +1 -0
  392. package/src/components/molecules/Sheet/sheet.stories.tsx +141 -0
  393. package/src/components/molecules/Sheet/sheet.test.tsx +70 -0
  394. package/src/components/molecules/Sheet/sheet.tsx +133 -0
  395. package/src/components/molecules/Tabs/index.ts +1 -0
  396. package/src/components/molecules/Tabs/tabs.stories.tsx +222 -0
  397. package/src/components/molecules/Tabs/tabs.test.tsx +113 -0
  398. package/src/components/molecules/Tabs/tabs.tsx +102 -0
  399. package/src/components/molecules/ToggleGroup/index.ts +1 -0
  400. package/src/components/molecules/ToggleGroup/toggle-group.stories.tsx +117 -0
  401. package/src/components/molecules/ToggleGroup/toggle-group.test.tsx +100 -0
  402. package/src/components/molecules/ToggleGroup/toggle-group.tsx +70 -0
  403. package/src/components/molecules/Tooltip/index.ts +1 -0
  404. package/src/components/molecules/Tooltip/tooltip.stories.tsx +133 -0
  405. package/src/components/molecules/Tooltip/tooltip.test.tsx +58 -0
  406. package/src/components/molecules/Tooltip/tooltip.tsx +58 -0
  407. package/src/components/molecules/index.ts +33 -0
  408. package/src/components/organisms/Carousel/carousel.stories.tsx +94 -0
  409. package/src/components/organisms/Carousel/carousel.test.tsx +24 -0
  410. package/src/components/organisms/Carousel/carousel.tsx +383 -0
  411. package/src/components/organisms/Carousel/index.ts +1 -0
  412. package/src/components/organisms/Chart/chart.stories.tsx +102 -0
  413. package/src/components/organisms/Chart/chart.test.tsx +105 -0
  414. package/src/components/organisms/Chart/chart.tsx +294 -0
  415. package/src/components/organisms/Chart/index.ts +1 -0
  416. package/src/components/organisms/FileUpload/FilePreview/file-preview.tsx +55 -0
  417. package/src/components/organisms/FileUpload/FilePreview/index.ts +1 -0
  418. package/src/components/organisms/FileUpload/file-upload.stories.tsx +20 -0
  419. package/src/components/organisms/FileUpload/file-upload.test.tsx +59 -0
  420. package/src/components/organisms/FileUpload/file-upload.tsx +175 -0
  421. package/src/components/organisms/FileUpload/file.d.ts +21 -0
  422. package/src/components/organisms/FileUpload/index.ts +1 -0
  423. package/src/components/organisms/Form/form.stories.tsx +155 -0
  424. package/src/components/organisms/Form/form.test.tsx +49 -0
  425. package/src/components/organisms/Form/form.tsx +133 -0
  426. package/src/components/organisms/Form/index.ts +1 -0
  427. package/src/components/organisms/Sidebar/index.ts +1 -0
  428. package/src/components/organisms/Sidebar/sidebar.stories.tsx +86 -0
  429. package/src/components/organisms/Sidebar/sidebar.test.tsx +101 -0
  430. package/src/components/organisms/Sidebar/sidebar.tsx +666 -0
  431. package/src/components/organisms/Table/index.ts +1 -0
  432. package/src/components/organisms/Table/table.stories.tsx +86 -0
  433. package/src/components/organisms/Table/table.test.tsx +42 -0
  434. package/src/components/organisms/Table/table.tsx +120 -0
  435. package/src/components/organisms/index.ts +6 -0
  436. package/src/constants/brazilian-states.ts +29 -0
  437. package/src/constants/index.ts +1 -0
  438. package/src/hooks/index.ts +10 -0
  439. package/src/hooks/useEditorActiveMarks.ts +63 -0
  440. package/src/hooks/useForm.ts +8 -0
  441. package/src/hooks/useFormContext.ts +7 -0
  442. package/src/hooks/useFormField.ts +41 -0
  443. package/src/hooks/useMobile.ts +61 -0
  444. package/src/hooks/useOnToggle.ts +28 -0
  445. package/src/hooks/usePDFNavigation.ts +41 -0
  446. package/src/hooks/usePDFZoom.ts +35 -0
  447. package/src/hooks/useSidebar.ts +23 -0
  448. package/src/hooks/useToast.tsx +63 -0
  449. package/src/index.css +73 -0
  450. package/src/main.ts +6 -0
  451. package/src/theme.css +388 -0
  452. package/src/utils/api/api.test.ts +64 -0
  453. package/src/utils/api/api.ts +34 -0
  454. package/src/utils/api/index.ts +1 -0
  455. package/src/utils/array/array.test.ts +160 -0
  456. package/src/utils/array/array.ts +43 -0
  457. package/src/utils/array/index.ts +1 -0
  458. package/src/utils/clipboard/clipboard.test.ts +218 -0
  459. package/src/utils/clipboard/clipboard.ts +40 -0
  460. package/src/utils/clipboard/index.ts +1 -0
  461. package/src/utils/cn/cn.test.ts +43 -0
  462. package/src/utils/cn/cn.ts +6 -0
  463. package/src/utils/cn/index.ts +1 -0
  464. package/src/utils/color-utils/color-utils.test.ts +46 -0
  465. package/src/utils/color-utils/color-utils.ts +97 -0
  466. package/src/utils/color-utils/index.ts +1 -0
  467. package/src/utils/countries/countries.ts +69 -0
  468. package/src/utils/countries/index.ts +1 -0
  469. package/src/utils/currency/currency.test.ts +114 -0
  470. package/src/utils/currency/currency.ts +134 -0
  471. package/src/utils/currency/index.ts +1 -0
  472. package/src/utils/date/date.test.ts +167 -0
  473. package/src/utils/date/date.ts +83 -0
  474. package/src/utils/date/index.ts +1 -0
  475. package/src/utils/file/file.ts +45 -0
  476. package/src/utils/file/index.ts +1 -0
  477. package/src/utils/get-initials/get-initials.test.ts +40 -0
  478. package/src/utils/get-initials/get-initials.ts +13 -0
  479. package/src/utils/get-initials/index.ts +1 -0
  480. package/src/utils/index.ts +14 -0
  481. package/src/utils/masks/index.ts +1 -0
  482. package/src/utils/masks/masks.ts +180 -0
  483. package/src/utils/render-highlighted-text/index.ts +1 -0
  484. package/src/utils/render-highlighted-text/render-highlighted-text.tsx +25 -0
  485. package/src/utils/string/index.ts +1 -0
  486. package/src/utils/string/string.test.ts +171 -0
  487. package/src/utils/string/string.ts +155 -0
  488. package/src/utils/video/index.ts +1 -0
  489. package/src/utils/video/video.ts +9 -0
  490. package/src/vite-env.d.ts +3 -0
@@ -0,0 +1,704 @@
1
+ import { useState } from 'react';
2
+
3
+ import { Input } from './input';
4
+
5
+ import type { Meta, StoryObj } from '@storybook/react';
6
+
7
+ import { MASKS, MASK_HELPERS } from '@/utils';
8
+
9
+ const meta: Meta<typeof Input> = {
10
+ title: 'Components/Data Entry/Input',
11
+ component: Input,
12
+ tags: [ 'autodocs' ],
13
+ parameters: {
14
+ layout: 'centered',
15
+ docs: {
16
+ description: {
17
+ component: 'A flexible input component with optional masking, various states, sizes, and built-in password visibility toggle. Works seamlessly with the masks utility.',
18
+ },
19
+ },
20
+ },
21
+ argTypes: {
22
+ 'type': {
23
+ control: { type: 'select' },
24
+ options: [ 'text', 'email', 'password', 'number', 'tel', 'url' ],
25
+ description: 'Input type',
26
+ },
27
+ 'size': {
28
+ control: { type: 'select' },
29
+ options: [ 'sm', 'md', 'lg' ],
30
+ description: 'Input size',
31
+ },
32
+ 'mask': {
33
+ control: { type: 'text' },
34
+ description: 'Input mask pattern (use MASKS from utils)',
35
+ },
36
+ 'error': {
37
+ control: { type: 'boolean' },
38
+ description: 'Error state',
39
+ },
40
+ 'success': {
41
+ control: { type: 'boolean' },
42
+ description: 'Success state',
43
+ },
44
+ 'loading': {
45
+ control: { type: 'boolean' },
46
+ description: 'Loading state',
47
+ },
48
+ 'disabled': {
49
+ control: { type: 'boolean' },
50
+ description: 'Disabled state',
51
+ },
52
+ 'placeholder': {
53
+ control: { type: 'text' },
54
+ description: 'Placeholder text',
55
+ },
56
+ 'data-testid': {
57
+ control: { type: 'text' },
58
+ description: 'Test identifier',
59
+ },
60
+ },
61
+ };
62
+
63
+ export default meta;
64
+
65
+ type Story = StoryObj<typeof meta>;
66
+
67
+ // Helper components
68
+ const InteractiveExample = () => {
69
+ const [ email, setEmail ] = useState('');
70
+ const [ password, setPassword ] = useState('');
71
+ const [ phone, setPhone ] = useState('');
72
+ const [ cpf, setCpf ] = useState('');
73
+ const [ isLoading, setIsLoading ] = useState(false);
74
+ const [ hasError, setHasError ] = useState(false);
75
+
76
+ const handleSubmit = () => {
77
+ setIsLoading(true);
78
+ setHasError(false);
79
+
80
+ setTimeout(() => {
81
+ setIsLoading(false);
82
+ setHasError(!email.includes('@'));
83
+ }, 2000);
84
+ };
85
+
86
+ return (
87
+ <div className="w-80 space-y-4 p-6 border rounded-lg">
88
+ <h3 className="text-lg font-semibold mb-4">Registration Form</h3>
89
+
90
+ <div>
91
+ <label className="block text-sm font-medium text-gray-700 mb-1">
92
+ Email
93
+ </label>
94
+ <Input
95
+ type="email"
96
+ value={email}
97
+ onChange={(e) => setEmail(e.target.value)}
98
+ placeholder="Enter your email..."
99
+ error={hasError}
100
+ loading={isLoading}
101
+ />
102
+ {hasError && (
103
+ <p className="text-sm text-red-600 mt-1">Please enter a valid email</p>
104
+ )}
105
+ </div>
106
+
107
+ <div>
108
+ <label className="block text-sm font-medium text-gray-700 mb-1">
109
+ Password
110
+ </label>
111
+ <Input
112
+ type="password"
113
+ value={password}
114
+ onChange={(e) => setPassword(e.target.value)}
115
+ placeholder="Enter your password..."
116
+ />
117
+ </div>
118
+
119
+ <div>
120
+ <label className="block text-sm font-medium text-gray-700 mb-1">
121
+ Phone
122
+ </label>
123
+ <Input
124
+ mask="(___) ___-____"
125
+ value={phone}
126
+ onChange={(e) => setPhone(e.target.value)}
127
+ placeholder="(123) 456-7890"
128
+ type="tel"
129
+ />
130
+ </div>
131
+
132
+ <div>
133
+ <label className="block text-sm font-medium text-gray-700 mb-1">
134
+ CPF
135
+ </label>
136
+ <Input
137
+ mask={MASKS.CPF}
138
+ value={cpf}
139
+ onChange={(e) => setCpf(e.target.value)}
140
+ placeholder="000.000.000-00"
141
+ />
142
+ </div>
143
+
144
+ <button
145
+ onClick={handleSubmit}
146
+ disabled={isLoading}
147
+ className="w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed"
148
+ >
149
+ {isLoading ? 'Processing...' : 'Submit'}
150
+ </button>
151
+ </div>
152
+ );
153
+ };
154
+
155
+ const FormWithValidation = () => {
156
+ const [ formData, setFormData ] = useState({
157
+ cpf: '',
158
+ email: '',
159
+ phone: '',
160
+ cep: '',
161
+ });
162
+ const [ errors, setErrors ] = useState<Record<string, boolean>>({});
163
+ const [ isSubmitting, setIsSubmitting ] = useState(false);
164
+
165
+ const updateField = (field: string, value: string) => {
166
+ setFormData(prev => ({ ...prev, [field]: value }));
167
+
168
+ // Real-time validation
169
+ let isValid = true;
170
+
171
+ switch (field) {
172
+ case 'cpf':
173
+ isValid = !value || MASK_HELPERS.isValidCPF(value);
174
+ break;
175
+ case 'email':
176
+ isValid = !value || MASK_HELPERS.isValidEmail(value);
177
+ break;
178
+ default:
179
+ isValid = true;
180
+ }
181
+
182
+ setErrors(prev => ({ ...prev, [field]: !isValid }));
183
+ };
184
+
185
+ const handleSubmit = async () => {
186
+ setIsSubmitting(true);
187
+
188
+ // Simulate API call
189
+ await new Promise(resolve => setTimeout(resolve, 2000));
190
+
191
+ const cleanData = {
192
+ cpf: MASK_HELPERS.removeMask(formData.cpf),
193
+ email: formData.email,
194
+ phone: MASK_HELPERS.removeMask(formData.phone),
195
+ cep: MASK_HELPERS.removeMask(formData.cep),
196
+ };
197
+
198
+ console.log('Submitted data:', cleanData);
199
+ setIsSubmitting(false);
200
+ alert('Form submitted successfully!');
201
+ };
202
+
203
+ return (
204
+ <div className="w-80 space-y-4 p-6 border rounded-lg">
205
+ <h3 className="text-lg font-semibold mb-4">Registration Form</h3>
206
+
207
+ <div>
208
+ <label className="block text-sm font-medium text-gray-700 mb-1">
209
+ CPF *
210
+ </label>
211
+ <Input
212
+ mask={MASKS.CPF}
213
+ value={formData.cpf}
214
+ onChange={(e) => updateField('cpf', e.target.value)}
215
+ placeholder="000.000.000-00"
216
+ error={errors.cpf}
217
+ loading={isSubmitting}
218
+ />
219
+ {errors.cpf && (
220
+ <p className="text-sm text-red-600 mt-1">CPF inválido</p>
221
+ )}
222
+ </div>
223
+
224
+ <div>
225
+ <label className="block text-sm font-medium text-gray-700 mb-1">
226
+ Email *
227
+ </label>
228
+ <Input
229
+ type="email"
230
+ value={formData.email}
231
+ onChange={(e) => updateField('email', e.target.value)}
232
+ placeholder="your@email.com"
233
+ error={errors.email}
234
+ loading={isSubmitting}
235
+ />
236
+ {errors.email && (
237
+ <p className="text-sm text-red-600 mt-1">Email inválido</p>
238
+ )}
239
+ </div>
240
+
241
+ <div>
242
+ <label className="block text-sm font-medium text-gray-700 mb-1">
243
+ Phone
244
+ </label>
245
+ <Input
246
+ mask={MASKS.PHONE_MOBILE}
247
+ value={formData.phone}
248
+ onChange={(e) => updateField('phone', e.target.value)}
249
+ placeholder="(11) 9 9999-9999"
250
+ type="tel"
251
+ loading={isSubmitting}
252
+ />
253
+ </div>
254
+
255
+ <div>
256
+ <label className="block text-sm font-medium text-gray-700 mb-1">
257
+ CEP
258
+ </label>
259
+ <Input
260
+ mask={MASKS.CEP}
261
+ value={formData.cep}
262
+ onChange={(e) => updateField('cep', e.target.value)}
263
+ placeholder="00000-000"
264
+ loading={isSubmitting}
265
+ />
266
+ </div>
267
+
268
+ <button
269
+ onClick={handleSubmit}
270
+ disabled={isSubmitting || Object.values(errors).some(Boolean)}
271
+ className="w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed"
272
+ >
273
+ {isSubmitting ? 'Processing...' : 'Submit'}
274
+ </button>
275
+ </div>
276
+ );
277
+ };
278
+
279
+ export const AllSizesBasic: Story = {
280
+ name: 'All Sizes Showcase',
281
+ render: () => (
282
+ <div className="space-y-6">
283
+ <div>
284
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Small</h4>
285
+ <div className="space-y-2">
286
+ <Input size="sm" placeholder="Small text input" />
287
+ <Input size="sm" type="password" placeholder="Small password input" />
288
+ <Input size="sm" mask="(___) ___-____" placeholder="(123) 456-7890" />
289
+ </div>
290
+ </div>
291
+
292
+ <div>
293
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Medium</h4>
294
+ <div className="space-y-2">
295
+ <Input size="md" placeholder="Medium text input" />
296
+ <Input size="md" type="password" placeholder="Medium password input" />
297
+ <Input size="md" mask="(___) ___-____" placeholder="(123) 456-7890" />
298
+ </div>
299
+ </div>
300
+
301
+ <div>
302
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Large</h4>
303
+ <div className="space-y-2">
304
+ <Input size="lg" placeholder="Large text input" />
305
+ <Input size="lg" type="password" placeholder="Large password input" />
306
+ <Input size="lg" mask="(___) ___-____" placeholder="(123) 456-7890" />
307
+ </div>
308
+ </div>
309
+ </div>
310
+ ),
311
+ parameters: {
312
+ docs: {
313
+ description: {
314
+ story: 'Comparison of all available sizes with different input types.',
315
+ },
316
+ },
317
+ },
318
+ };
319
+
320
+ export const AllSizesWithMasks: Story = {
321
+ name: 'All Sizes with Masks',
322
+ render: () => (
323
+ <div className="space-y-6">
324
+ <div>
325
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Small</h4>
326
+ <div className="space-y-2">
327
+ <Input size="sm" mask={MASKS.CPF} placeholder="000.000.000-00" />
328
+ <Input size="sm" mask={MASKS.PHONE_MOBILE} placeholder="(11) 9 9999-9999" />
329
+ <Input size="sm" mask={MASKS.CEP} placeholder="00000-000" />
330
+ </div>
331
+ </div>
332
+
333
+ <div>
334
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Medium</h4>
335
+ <div className="space-y-2">
336
+ <Input size="md" mask={MASKS.CPF} placeholder="000.000.000-00" />
337
+ <Input size="md" mask={MASKS.PHONE_MOBILE} placeholder="(11) 9 9999-9999" />
338
+ <Input size="md" mask={MASKS.CEP} placeholder="00000-000" />
339
+ </div>
340
+ </div>
341
+
342
+ <div>
343
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Large</h4>
344
+ <div className="space-y-2">
345
+ <Input size="lg" mask={MASKS.CPF} placeholder="000.000.000-00" />
346
+ <Input size="lg" mask={MASKS.PHONE_MOBILE} placeholder="(11) 9 9999-9999" />
347
+ <Input size="lg" mask={MASKS.CEP} placeholder="00000-000" />
348
+ </div>
349
+ </div>
350
+ </div>
351
+ ),
352
+ parameters: {
353
+ docs: {
354
+ description: {
355
+ story: 'All input sizes with common Brazilian masks applied.',
356
+ },
357
+ },
358
+ },
359
+ };
360
+
361
+ export const AllStatesBasic: Story = {
362
+ name: 'All States Showcase',
363
+ render: () => (
364
+ <div className="space-y-4">
365
+ <div>
366
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Normal</h4>
367
+ <Input placeholder="Normal state" defaultValue="Normal input" />
368
+ </div>
369
+
370
+ <div>
371
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Error</h4>
372
+ <Input error placeholder="Error state" defaultValue="Invalid input" />
373
+ </div>
374
+
375
+ <div>
376
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Success</h4>
377
+ <Input success placeholder="Success state" defaultValue="Valid input" />
378
+ </div>
379
+
380
+ <div>
381
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Loading</h4>
382
+ <Input loading placeholder="Loading state" defaultValue="Processing..." />
383
+ </div>
384
+
385
+ <div>
386
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Disabled</h4>
387
+ <Input disabled placeholder="Disabled state" defaultValue="Cannot edit" />
388
+ </div>
389
+ </div>
390
+ ),
391
+ parameters: {
392
+ docs: {
393
+ description: {
394
+ story: 'Showcase of all available states and their visual feedback.',
395
+ },
396
+ },
397
+ },
398
+ };
399
+
400
+ export const AllStatesWithMasks: Story = {
401
+ name: 'All States with CPF Mask',
402
+ render: () => (
403
+ <div className="space-y-4">
404
+ <div>
405
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Normal</h4>
406
+ <Input mask={MASKS.CPF} placeholder="000.000.000-00" defaultValue="123.456.789" />
407
+ </div>
408
+
409
+ <div>
410
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Error</h4>
411
+ <Input mask={MASKS.CPF} error placeholder="000.000.000-00" defaultValue="123.456.789-00" />
412
+ </div>
413
+
414
+ <div>
415
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Success</h4>
416
+ <Input mask={MASKS.CPF} success placeholder="000.000.000-00" defaultValue="111.444.777-35" />
417
+ </div>
418
+
419
+ <div>
420
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Loading</h4>
421
+ <Input mask={MASKS.CPF} loading placeholder="000.000.000-00" defaultValue="111.444.777-35" />
422
+ </div>
423
+
424
+ <div>
425
+ <h4 className="text-sm font-medium text-gray-700 mb-2">Disabled</h4>
426
+ <Input mask={MASKS.CPF} disabled placeholder="000.000.000-00" defaultValue="111.444.777-35" />
427
+ </div>
428
+ </div>
429
+ ),
430
+ parameters: {
431
+ docs: {
432
+ description: {
433
+ story: 'All input states with CPF mask applied for consistency.',
434
+ },
435
+ },
436
+ },
437
+ };
438
+
439
+ export const BrazilianDocuments: Story = {
440
+ name: 'Brazilian Documents Showcase',
441
+ render: () => (
442
+ <div className="space-y-4 w-80">
443
+ <div>
444
+ <label className="block text-sm font-medium text-gray-700 mb-1">CPF</label>
445
+ <Input mask={MASKS.CPF} placeholder="000.000.000-00" />
446
+ </div>
447
+ <div>
448
+ <label className="block text-sm font-medium text-gray-700 mb-1">CNPJ</label>
449
+ <Input mask={MASKS.CNPJ} placeholder="00.000.000/0000-00" />
450
+ </div>
451
+ <div>
452
+ <label className="block text-sm font-medium text-gray-700 mb-1">RG</label>
453
+ <Input mask={MASKS.RG} placeholder="00.000.000-0" />
454
+ </div>
455
+ <div>
456
+ <label className="block text-sm font-medium text-gray-700 mb-1">PIS</label>
457
+ <Input mask={MASKS.PIS} placeholder="000.00000.00-0" />
458
+ </div>
459
+ </div>
460
+ ),
461
+ parameters: {
462
+ docs: {
463
+ description: {
464
+ story: 'Common Brazilian document masks using the masks utility.',
465
+ },
466
+ },
467
+ },
468
+ };
469
+
470
+ export const ContactMasks: Story = {
471
+ name: 'Contact Masks Showcase',
472
+ render: () => (
473
+ <div className="space-y-4 w-80">
474
+ <div>
475
+ <label className="block text-sm font-medium text-gray-700 mb-1">Mobile Phone</label>
476
+ <Input mask={MASKS.PHONE_MOBILE} placeholder="(11) 9 9999-9999" type="tel" />
477
+ </div>
478
+ <div>
479
+ <label className="block text-sm font-medium text-gray-700 mb-1">Fixed Phone</label>
480
+ <Input mask={MASKS.PHONE_BR_FIXED} placeholder="(11) 9999-9999" type="tel" />
481
+ </div>
482
+ <div>
483
+ <label className="block text-sm font-medium text-gray-700 mb-1">CEP</label>
484
+ <Input mask={MASKS.CEP} placeholder="00000-000" />
485
+ </div>
486
+ </div>
487
+ ),
488
+ parameters: {
489
+ docs: {
490
+ description: {
491
+ story: 'Contact information masks for phone numbers and address.',
492
+ },
493
+ },
494
+ },
495
+ };
496
+
497
+ export const CPFMask: Story = {
498
+ name: 'With CPF Mask',
499
+ args: {
500
+ mask: MASKS.CPF,
501
+ placeholder: '000.000.000-00',
502
+ },
503
+ };
504
+
505
+ // Stories
506
+ export const Default: Story = {
507
+ args: {
508
+ placeholder: 'Enter text...',
509
+ },
510
+ };
511
+
512
+ export const Disabled: Story = {
513
+ args: {
514
+ disabled: true,
515
+ placeholder: 'Disabled input...',
516
+ defaultValue: 'Cannot edit this',
517
+ },
518
+ };
519
+
520
+ export const ErrorState: Story = {
521
+ name: 'Error State',
522
+ args: {
523
+ error: true,
524
+ placeholder: 'Invalid input...',
525
+ defaultValue: 'invalid@email',
526
+ },
527
+ };
528
+
529
+ export const FinancialMasks: Story = {
530
+ name: 'Financial Masks Showcase',
531
+ render: () => (
532
+ <div className="space-y-4 w-80">
533
+ <div>
534
+ <label className="block text-sm font-medium text-gray-700 mb-1">Credit Card</label>
535
+ <Input mask={MASKS.CREDIT_CARD} placeholder="0000 0000 0000 0000" />
536
+ </div>
537
+ <div className="flex gap-2">
538
+ <div className="flex-1">
539
+ <label className="block text-sm font-medium text-gray-700 mb-1">Expiry</label>
540
+ <Input mask={MASKS.CREDIT_CARD_EXPIRY} placeholder="00/00" />
541
+ </div>
542
+ <div className="w-20">
543
+ <label className="block text-sm font-medium text-gray-700 mb-1">CVV</label>
544
+ <Input mask={MASKS.CREDIT_CARD_CVV} placeholder="000" />
545
+ </div>
546
+ </div>
547
+ <div>
548
+ <label className="block text-sm font-medium text-gray-700 mb-1">Bank Account</label>
549
+ <Input mask={MASKS.BANK_ACCOUNT} placeholder="000000-0" />
550
+ </div>
551
+ <div>
552
+ <label className="block text-sm font-medium text-gray-700 mb-1">Bank Agency</label>
553
+ <Input mask={MASKS.BANK_AGENCY} placeholder="0000-0" />
554
+ </div>
555
+ </div>
556
+ ),
557
+ parameters: {
558
+ docs: {
559
+ description: {
560
+ story: 'Financial information masks for cards and banking.',
561
+ },
562
+ },
563
+ },
564
+ };
565
+
566
+ export const FormWithValidationStory: Story = {
567
+ name: 'Form with Real-time Validation',
568
+ render: () => <FormWithValidation />,
569
+ parameters: {
570
+ docs: {
571
+ description: {
572
+ story: 'A complete form example with real-time validation using masks and validation helpers.',
573
+ },
574
+ },
575
+ },
576
+ };
577
+
578
+ export const Interactive: Story = {
579
+ name: 'Interactive Form Example',
580
+ render: () => <InteractiveExample />,
581
+ parameters: {
582
+ docs: {
583
+ description: {
584
+ story: 'A complete form example showing different input types, masks, states, and validation.',
585
+ },
586
+ },
587
+ },
588
+ };
589
+
590
+ export const Large: Story = {
591
+ args: {
592
+ size: 'lg',
593
+ placeholder: 'Large input...',
594
+ },
595
+ };
596
+
597
+ export const LoadingState: Story = {
598
+ name: 'Loading State',
599
+ args: {
600
+ loading: true,
601
+ placeholder: 'Processing...',
602
+ defaultValue: 'example@email.com',
603
+ },
604
+ };
605
+
606
+ export const Medium: Story = {
607
+ args: {
608
+ size: 'md',
609
+ placeholder: 'Medium input...',
610
+ },
611
+ };
612
+
613
+ export const Password: Story = {
614
+ args: {
615
+ type: 'password',
616
+ placeholder: 'Enter password...',
617
+ },
618
+ };
619
+
620
+ export const PasswordWithLoading: Story = {
621
+ name: 'Password with Loading',
622
+ args: {
623
+ type: 'password',
624
+ loading: true,
625
+ placeholder: 'Validating password...',
626
+ defaultValue: 'mypassword123',
627
+ },
628
+ };
629
+
630
+ // Individual component stories
631
+ export const Small: Story = {
632
+ args: {
633
+ size: 'sm',
634
+ placeholder: 'Small input...',
635
+ },
636
+ };
637
+
638
+ export const SuccessState: Story = {
639
+ name: 'Success State',
640
+ args: {
641
+ success: true,
642
+ placeholder: 'Valid input...',
643
+ defaultValue: 'valid@email.com',
644
+ },
645
+ };
646
+
647
+ export const WithCEPMask: Story = {
648
+ name: 'CEP Mask',
649
+ args: {
650
+ mask: MASKS.CEP,
651
+ placeholder: '00000-000',
652
+ },
653
+ };
654
+
655
+ export const WithCNPJMask: Story = {
656
+ name: 'CNPJ Mask',
657
+ args: {
658
+ mask: MASKS.CNPJ,
659
+ placeholder: '00.000.000/0000-00',
660
+ },
661
+ };
662
+
663
+ export const WithCPFMask: Story = {
664
+ name: 'CPF Mask',
665
+ args: {
666
+ mask: MASKS.CPF,
667
+ placeholder: '000.000.000-00',
668
+ },
669
+ };
670
+
671
+ export const WithCreditCardMask: Story = {
672
+ name: 'Credit Card Mask',
673
+ args: {
674
+ mask: MASKS.CREDIT_CARD,
675
+ placeholder: '0000 0000 0000 0000',
676
+ },
677
+ };
678
+
679
+ export const WithDateMask: Story = {
680
+ name: 'Date Mask',
681
+ args: {
682
+ mask: MASKS.DATE_BR,
683
+ placeholder: '00/00/0000',
684
+ },
685
+ };
686
+
687
+ // Mask examples
688
+ export const WithMask: Story = {
689
+ name: 'With Phone Mask',
690
+ args: {
691
+ mask: MASKS.PHONE_MOBILE,
692
+ placeholder: '(123) 456-7890',
693
+ type: 'tel',
694
+ },
695
+ };
696
+
697
+ export const WithPhoneMask: Story = {
698
+ name: 'Phone Mask',
699
+ args: {
700
+ mask: MASKS.PHONE_MOBILE,
701
+ placeholder: '(11) 9 9999-9999',
702
+ type: 'tel',
703
+ },
704
+ };