@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,214 @@
1
+ import { useState } from 'react';
2
+
3
+ import { RichTextEditor } from './rich-text-editor';
4
+
5
+ import type { Meta, StoryObj } from '@storybook/react';
6
+
7
+ const meta: Meta<typeof RichTextEditor> = {
8
+ title: 'Components/Data Entry/RichTextEditor',
9
+ component: RichTextEditor,
10
+ tags: [ 'autodocs' ],
11
+ parameters: {
12
+ layout: 'centered',
13
+ docs: {
14
+ description: {
15
+ component: 'Editor de texto rico construído com TipTap, oferecendo opções de formatação como negrito, itálico, sublinhado, alinhamento e listas. Interface limpa para criação de conteúdo com suporte a HTML.',
16
+ },
17
+ },
18
+ },
19
+ argTypes: {
20
+ editorContent: {
21
+ control: { type: 'text' },
22
+ description: 'Conteúdo HTML inicial para o editor',
23
+ },
24
+ onChange: {
25
+ description: 'Função callback chamada quando o conteúdo é alterado',
26
+ action: 'content changed',
27
+ },
28
+ label: {
29
+ control: { type: 'text' },
30
+ description: 'Rótulo do campo',
31
+ },
32
+ placeholder: {
33
+ control: { type: 'text' },
34
+ description: 'Texto de placeholder quando vazio',
35
+ },
36
+ isDisabled: {
37
+ control: { type: 'boolean' },
38
+ description: 'Define se o editor está desabilitado',
39
+ },
40
+ },
41
+ };
42
+ export default meta;
43
+
44
+ type Story = StoryObj<typeof meta>;
45
+
46
+ const InteractiveExample = () => {
47
+ const [ content, setContent ] = useState('<p>Digite aqui para testar o editor...</p>');
48
+
49
+ return (
50
+ <div className="w-[600px] space-y-4">
51
+ <RichTextEditor
52
+ label="Editor Interativo"
53
+ editorContent={content}
54
+ onChange={setContent}
55
+ placeholder="Comece a digitar aqui..."
56
+ />
57
+
58
+ <div className="mt-4">
59
+ <h4 className="text-sm font-medium text-gray-700 mb-2">HTML Gerado:</h4>
60
+ <div className="p-3 bg-gray-100 rounded border text-sm font-mono max-h-32 overflow-y-auto">
61
+ {content}
62
+ </div>
63
+ </div>
64
+ </div>
65
+ );
66
+ };
67
+
68
+ export const Default: Story = {
69
+ name: '1. Padrão',
70
+ args: {
71
+ editorContent: '<p>Conteúdo inicial do editor</p>',
72
+ label: 'Editor de Texto',
73
+ placeholder: 'Digite aqui...',
74
+ },
75
+ parameters: {
76
+ docs: {
77
+ description: {
78
+ story: 'Estado padrão do editor com conteúdo inicial.',
79
+ },
80
+ },
81
+ },
82
+ };
83
+ export const Disabled: Story = {
84
+ name: '2. Desabilitado',
85
+ args: {
86
+ editorContent: '<p>Este editor está <strong>desabilitado</strong> e não pode ser editado.</p>',
87
+ label: 'Editor Desabilitado',
88
+ isDisabled: true,
89
+ },
90
+ parameters: {
91
+ docs: {
92
+ description: {
93
+ story: 'Editor no estado desabilitado - não permite edição.',
94
+ },
95
+ },
96
+ },
97
+ };
98
+ export const Empty: Story = {
99
+ name: '3. Vazio',
100
+ args: {
101
+ editorContent: '',
102
+ label: 'Editor Vazio',
103
+ placeholder: 'Comece a digitar...',
104
+ },
105
+ parameters: {
106
+ docs: {
107
+ description: {
108
+ story: 'Editor vazio mostrando o placeholder.',
109
+ },
110
+ },
111
+ },
112
+ };
113
+ export const FormattingExamples: Story = {
114
+ name: '4. Exemplo de Formatação',
115
+ args: {
116
+ editorContent: `
117
+ <p>Este texto demonstra as <strong>formatações disponíveis</strong>:</p>
118
+ <p><strong>Texto em negrito</strong></p>
119
+ <p><em>Texto em itálico</em></p>
120
+ <p><u>Texto sublinhado</u></p>
121
+ <p style="text-align: center">Texto centralizado</p>
122
+ <p style="text-align: left">Texto alinhado à esquerda</p>
123
+ `,
124
+ label: 'Formatações de Texto',
125
+ },
126
+ parameters: {
127
+ docs: {
128
+ description: {
129
+ story: 'Demonstra as opções de formatação de texto disponíveis.',
130
+ },
131
+ },
132
+ },
133
+ };
134
+ export const Interactive: Story = {
135
+ name: '5. Exemplo Interativo',
136
+ render: () => <InteractiveExample />,
137
+ parameters: {
138
+ docs: {
139
+ description: {
140
+ story: 'Editor interativo que mostra o HTML gerado em tempo real.',
141
+ },
142
+ },
143
+ },
144
+ };
145
+ export const ListExamples: Story = {
146
+ name: '6. Exemplo de Listas',
147
+ args: {
148
+ editorContent: `
149
+ <p>Exemplos de listas:</p>
150
+ <ul>
151
+ <li>Item de lista não ordenada 1</li>
152
+ <li>Item de lista não ordenada 2</li>
153
+ <li>Item de lista não ordenada 3</li>
154
+ </ul>
155
+ <p>Lista ordenada:</p>
156
+ <ol>
157
+ <li>Primeiro item</li>
158
+ <li>Segundo item</li>
159
+ <li>Terceiro item</li>
160
+ </ol>
161
+ `,
162
+ label: 'Listas',
163
+ },
164
+ parameters: {
165
+ docs: {
166
+ description: {
167
+ story: 'Demonstra os tipos de listas suportados pelo editor.',
168
+ },
169
+ },
170
+ },
171
+ };
172
+ export const LongContent: Story = {
173
+ name: '7. Conteúdo Longo',
174
+ args: {
175
+ editorContent: `
176
+ <p>Este é um exemplo de conteúdo mais longo para testar a performance e usabilidade do editor.</p>
177
+ <p><strong>Primeiro parágrafo:</strong> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
178
+ <ul>
179
+ <li>Item importante 1</li>
180
+ <li>Item importante 2</li>
181
+ <li>Item importante 3</li>
182
+ </ul>
183
+ <p><em>Segundo parágrafo:</em> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
184
+ <ol>
185
+ <li>Passo 1 do processo</li>
186
+ <li>Passo 2 do processo</li>
187
+ <li>Passo 3 do processo</li>
188
+ </ol>
189
+ <p>Parágrafo final demonstrando que o editor mantém boa performance mesmo com conteúdo substancial.</p>
190
+ `,
191
+ label: 'Conteúdo Extenso',
192
+ },
193
+ parameters: {
194
+ docs: {
195
+ description: {
196
+ story: 'Teste de performance com conteúdo mais longo.',
197
+ },
198
+ },
199
+ },
200
+ };
201
+ export const WithoutLabel: Story = {
202
+ name: '8. Sem Rótulo',
203
+ args: {
204
+ editorContent: '<p>Editor sem rótulo</p>',
205
+ placeholder: 'Digite aqui...',
206
+ },
207
+ parameters: {
208
+ docs: {
209
+ description: {
210
+ story: 'Editor funcionando sem rótulo.',
211
+ },
212
+ },
213
+ },
214
+ };
@@ -0,0 +1,442 @@
1
+ import React from 'react';
2
+
3
+ import { composeStories } from '@storybook/react';
4
+ import { render, screen, waitFor } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+
8
+ import { RichTextEditor } from './rich-text-editor';
9
+ import * as RichTextEditorStories from './rich-text-editor.stories';
10
+
11
+ const {
12
+ Default,
13
+ Disabled,
14
+ Empty,
15
+ FormattingExamples,
16
+ Interactive,
17
+ ListExamples,
18
+ LongContent,
19
+ WithoutLabel,
20
+ } = composeStories(RichTextEditorStories);
21
+
22
+ vi.mock('@/hooks', () => ({
23
+ useEditorActiveMarks: vi.fn(() => ({
24
+ bold: false,
25
+ italic: false,
26
+ underline: false,
27
+ bulletList: false,
28
+ align: 'left',
29
+ })),
30
+ }));
31
+
32
+ vi.mock('@/components', () => ({
33
+ AlignCenter: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="align-center" {...props} />,
34
+ AlignLeft: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="align-left" {...props} />,
35
+ Bold01: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="bold-icon" {...props} />,
36
+ Box: ({ children, className, ...props }: React.ComponentProps<'div'>) => <div className={className} {...props}>{children}</div>,
37
+ Dotpoints01: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="bullet-list-icon" {...props} />,
38
+ Flex: ({ children, className, ...props }: React.ComponentProps<'div'>) => <div className={className} {...props}>{children}</div>,
39
+ Italic01: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="italic-icon" {...props} />,
40
+ Label: ({ children, required, ...props }: React.ComponentProps<'label'> & { required?: boolean }) => (
41
+ <label {...props}>
42
+ {children}
43
+ {required && <span data-testid="required-asterisk">*</span>}
44
+ </label>
45
+ ),
46
+ Separator: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="separator" {...props} />,
47
+ Underline01: ({ className, ...props }: React.ComponentProps<'div'>) => <div className={className} data-testid="underline-icon" {...props} />,
48
+ }));
49
+
50
+ describe('<RichTextEditor />', () => {
51
+ beforeEach(() => {
52
+ vi.clearAllMocks();
53
+ });
54
+
55
+ afterEach(() => {
56
+ vi.restoreAllMocks();
57
+ });
58
+
59
+ describe('Rendering', () => {
60
+ it('should render with default props', async () => {
61
+ render(<RichTextEditor editorContent="<p>Test content</p>" />);
62
+
63
+ await waitFor(() => {
64
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
65
+ });
66
+ });
67
+
68
+ it('should render label when provided', async () => {
69
+ render(
70
+ <RichTextEditor
71
+ editorContent="<p>Test</p>"
72
+ label="Rich Text Editor"
73
+ />
74
+ );
75
+
76
+ expect(screen.getByText('Rich Text Editor')).toBeInTheDocument();
77
+ });
78
+
79
+ it('should render required asterisk when isRequired is true', () => {
80
+ render(
81
+ <RichTextEditor
82
+ editorContent="<p>Test</p>"
83
+ label="Required Editor"
84
+ isRequired={true}
85
+ />
86
+ );
87
+
88
+ expect(screen.getByTestId('required-asterisk')).toBeInTheDocument();
89
+ });
90
+
91
+ it('should not render required asterisk when isRequired is false', () => {
92
+ render(
93
+ <RichTextEditor
94
+ editorContent="<p>Test</p>"
95
+ label="Optional Editor"
96
+ isRequired={false}
97
+ />
98
+ );
99
+
100
+ expect(screen.queryByTestId('required-asterisk')).not.toBeInTheDocument();
101
+ });
102
+
103
+ it('should render all formatting buttons', () => {
104
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
105
+
106
+ expect(screen.getByTestId('bold-icon')).toBeInTheDocument();
107
+ expect(screen.getByTestId('italic-icon')).toBeInTheDocument();
108
+ expect(screen.getByTestId('underline-icon')).toBeInTheDocument();
109
+ expect(screen.getByTestId('align-left')).toBeInTheDocument();
110
+ expect(screen.getByTestId('align-center')).toBeInTheDocument();
111
+ expect(screen.getByTestId('bullet-list-icon')).toBeInTheDocument();
112
+ });
113
+
114
+ it('should render separator between text formatting and alignment buttons', () => {
115
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
116
+
117
+ expect(screen.getByTestId('separator')).toBeInTheDocument();
118
+ });
119
+ });
120
+
121
+ describe('Props Behavior', () => {
122
+ it('should handle editorContent prop correctly', async () => {
123
+ const content = '<p><strong>Bold text</strong> and normal text</p>';
124
+ render(<RichTextEditor editorContent={content} />);
125
+
126
+ await waitFor(() => {
127
+ const editor = screen.getByTestId('rich-text-editor');
128
+ expect(editor).toBeInTheDocument();
129
+ });
130
+ });
131
+
132
+ it('should apply placeholder when provided', () => {
133
+ render(
134
+ <RichTextEditor
135
+ editorContent=""
136
+ placeholder="Digite seu texto aqui..."
137
+ />
138
+ );
139
+
140
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
141
+ });
142
+
143
+ it('should be disabled when isDisabled is true', () => {
144
+ render(
145
+ <RichTextEditor
146
+ editorContent="<p>Test</p>"
147
+ isDisabled={true}
148
+ />
149
+ );
150
+
151
+ const buttons = screen.getAllByRole('button');
152
+ buttons.forEach(button => {
153
+ expect(button).toBeDisabled();
154
+ });
155
+ });
156
+
157
+ it('should be enabled when isDisabled is false', () => {
158
+ render(
159
+ <RichTextEditor
160
+ editorContent="<p>Test</p>"
161
+ isDisabled={false}
162
+ />
163
+ );
164
+
165
+ const buttons = screen.getAllByRole('button');
166
+ buttons.forEach(button => {
167
+ expect(button).not.toBeDisabled();
168
+ });
169
+ });
170
+ });
171
+
172
+ describe('Formatting Buttons', () => {
173
+ it('should have correct titles for accessibility', () => {
174
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
175
+
176
+ expect(screen.getByTitle('Bold (Ctrl+B)')).toBeInTheDocument();
177
+ expect(screen.getByTitle('Italic (Ctrl+I)')).toBeInTheDocument();
178
+ expect(screen.getByTitle('Underline (Ctrl+U)')).toBeInTheDocument();
179
+ expect(screen.getByTitle('Align Left')).toBeInTheDocument();
180
+ expect(screen.getByTitle('Align Center')).toBeInTheDocument();
181
+ expect(screen.getByTitle('Bullet List')).toBeInTheDocument();
182
+ });
183
+
184
+ it('should handle bold button click', async () => {
185
+ const user = userEvent.setup();
186
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
187
+
188
+ const boldButton = screen.getByTitle('Bold (Ctrl+B)');
189
+ await user.click(boldButton);
190
+
191
+ expect(boldButton).toBeInTheDocument();
192
+ });
193
+
194
+ it('should handle italic button click', async () => {
195
+ const user = userEvent.setup();
196
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
197
+
198
+ const italicButton = screen.getByTitle('Italic (Ctrl+I)');
199
+ await user.click(italicButton);
200
+
201
+ expect(italicButton).toBeInTheDocument();
202
+ });
203
+
204
+ it('should handle underline button click', async () => {
205
+ const user = userEvent.setup();
206
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
207
+
208
+ const underlineButton = screen.getByTitle('Underline (Ctrl+U)');
209
+ await user.click(underlineButton);
210
+
211
+ expect(underlineButton).toBeInTheDocument();
212
+ });
213
+
214
+ it('should handle align left button click', async () => {
215
+ const user = userEvent.setup();
216
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
217
+
218
+ const alignLeftButton = screen.getByTitle('Align Left');
219
+ await user.click(alignLeftButton);
220
+
221
+ expect(alignLeftButton).toBeInTheDocument();
222
+ });
223
+
224
+ it('should handle align center button click', async () => {
225
+ const user = userEvent.setup();
226
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
227
+
228
+ const alignCenterButton = screen.getByTitle('Align Center');
229
+ await user.click(alignCenterButton);
230
+
231
+ expect(alignCenterButton).toBeInTheDocument();
232
+ });
233
+
234
+ it('should handle bullet list button click', async () => {
235
+ const user = userEvent.setup();
236
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
237
+
238
+ const bulletListButton = screen.getByTitle('Bullet List');
239
+ await user.click(bulletListButton);
240
+
241
+ expect(bulletListButton).toBeInTheDocument();
242
+ });
243
+ });
244
+
245
+ describe('Edge Cases', () => {
246
+ it('should handle empty content', async () => {
247
+ render(<RichTextEditor editorContent="" />);
248
+
249
+ await waitFor(() => {
250
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
251
+ });
252
+ });
253
+
254
+ it('should handle very long content', async () => {
255
+ const longContent = `<p>${'Very long text content. '.repeat(100)}</p>`;
256
+ render(<RichTextEditor editorContent={longContent} />);
257
+
258
+ await waitFor(() => {
259
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
260
+ });
261
+ });
262
+
263
+ it('should handle HTML with formatting', async () => {
264
+ const formattedContent = `
265
+ <p><strong>Bold text</strong></p>
266
+ <p><em>Italic text</em></p>
267
+ <ul>
268
+ <li>List item 1</li>
269
+ <li>List item 2</li>
270
+ </ul>
271
+ `;
272
+ render(<RichTextEditor editorContent={formattedContent} />);
273
+
274
+ await waitFor(() => {
275
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
276
+ });
277
+ });
278
+
279
+ it('should handle special characters in content', async () => {
280
+ const specialContent = '<p>Texto com acentos: ação, coração, não</p>';
281
+ render(<RichTextEditor editorContent={specialContent} />);
282
+
283
+ await waitFor(() => {
284
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
285
+ });
286
+ });
287
+ });
288
+
289
+ describe('Accessibility', () => {
290
+ it('should have proper button types', () => {
291
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
292
+
293
+ const buttons = screen.getAllByRole('button');
294
+ buttons.forEach(button => {
295
+ expect(button).toHaveAttribute('type', 'button');
296
+ });
297
+ });
298
+
299
+ it('should maintain focus management', async () => {
300
+ const user = userEvent.setup();
301
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
302
+
303
+ await waitFor(() => {
304
+ const editor = screen.getByTestId('rich-text-editor');
305
+ expect(editor).toBeInTheDocument();
306
+ });
307
+
308
+ const editor = screen.getByTestId('rich-text-editor');
309
+ await user.click(editor);
310
+
311
+ expect(editor).toBeInTheDocument();
312
+ });
313
+
314
+ it('should support keyboard navigation between buttons', async () => {
315
+ const user = userEvent.setup();
316
+ render(<RichTextEditor editorContent="<p>Test</p>" />);
317
+
318
+ const firstButton = screen.getByTitle('Bold (Ctrl+B)');
319
+ await user.tab();
320
+
321
+ expect(firstButton).toBeInTheDocument();
322
+ });
323
+ });
324
+
325
+ describe('Integration', () => {
326
+ it('should work with form integration', async () => {
327
+ const FormComponent = () => {
328
+ const [ content, setContent ] = React.useState('<p>Initial</p>');
329
+ return (
330
+ <form>
331
+ <RichTextEditor
332
+ editorContent={content}
333
+ onChange={setContent}
334
+ label="Form Editor"
335
+ />
336
+ </form>
337
+ );
338
+ };
339
+
340
+ render(<FormComponent />);
341
+
342
+ expect(screen.getByText('Form Editor')).toBeInTheDocument();
343
+ await waitFor(() => {
344
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
345
+ });
346
+ });
347
+ });
348
+
349
+ describe('Storybook Stories', () => {
350
+ it('should render Default story correctly', () => {
351
+ render(<Default />);
352
+
353
+ expect(screen.getByText('Editor de Texto')).toBeInTheDocument();
354
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
355
+ });
356
+
357
+ it('should render Disabled story correctly', () => {
358
+ render(<Disabled />);
359
+
360
+ expect(screen.getByText('Editor Desabilitado')).toBeInTheDocument();
361
+
362
+ const buttons = screen.getAllByRole('button');
363
+ buttons.forEach(button => {
364
+ expect(button).toBeDisabled();
365
+ });
366
+ });
367
+
368
+ it('should render Empty story correctly', () => {
369
+ render(<Empty />);
370
+
371
+ expect(screen.getByText('Editor Vazio')).toBeInTheDocument();
372
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
373
+ });
374
+
375
+ it('should render FormattingExamples story correctly', () => {
376
+ render(<FormattingExamples />);
377
+
378
+ expect(screen.getByText('Formatações de Texto')).toBeInTheDocument();
379
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
380
+ });
381
+
382
+ it('should render Interactive story correctly', () => {
383
+ render(<Interactive />);
384
+
385
+ expect(screen.getByText('Editor Interativo')).toBeInTheDocument();
386
+ expect(screen.getByText('HTML Gerado:')).toBeInTheDocument();
387
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
388
+ });
389
+
390
+ it('should render ListExamples story correctly', () => {
391
+ render(<ListExamples />);
392
+
393
+ expect(screen.getByText('Listas')).toBeInTheDocument();
394
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
395
+ });
396
+
397
+ it('should render LongContent story correctly', () => {
398
+ render(<LongContent />);
399
+
400
+ expect(screen.getByText('Conteúdo Extenso')).toBeInTheDocument();
401
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
402
+ });
403
+
404
+ it('should render WithoutLabel story correctly', () => {
405
+ render(<WithoutLabel />);
406
+
407
+ expect(screen.getByTestId('rich-text-editor')).toBeInTheDocument();
408
+ expect(screen.queryByText('Editor de Texto')).not.toBeInTheDocument();
409
+ });
410
+ });
411
+
412
+ describe('Snapshot Tests', () => {
413
+ it('should match snapshot for default state', () => {
414
+ const { container } = render(
415
+ <RichTextEditor editorContent="<p>Test content</p>" label="Test Editor" />
416
+ );
417
+ expect(container).toMatchSnapshot();
418
+ });
419
+
420
+ it('should match snapshot for disabled state', () => {
421
+ const { container } = render(
422
+ <RichTextEditor
423
+ editorContent="<p>Disabled content</p>"
424
+ label="Disabled Editor"
425
+ isDisabled={true}
426
+ />
427
+ );
428
+ expect(container).toMatchSnapshot();
429
+ });
430
+
431
+ it('should match snapshot for required state', () => {
432
+ const { container } = render(
433
+ <RichTextEditor
434
+ editorContent="<p>Required content</p>"
435
+ label="Required Editor"
436
+ isRequired={true}
437
+ />
438
+ );
439
+ expect(container).toMatchSnapshot();
440
+ });
441
+ });
442
+ });