@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,154 @@
1
+ import {
2
+ DropdownMenu,
3
+ DropdownMenuTrigger,
4
+ DropdownMenuContent,
5
+ DropdownMenuLabel,
6
+ DropdownMenuItem,
7
+ DropdownMenuSeparator,
8
+ DropdownMenuCheckboxItem,
9
+ DropdownMenuRadioGroup,
10
+ DropdownMenuRadioItem,
11
+ DropdownMenuSub,
12
+ DropdownMenuSubTrigger,
13
+ DropdownMenuSubContent,
14
+ } from './dropdown-menu';
15
+
16
+ import type { Meta, StoryObj } from '@storybook/react';
17
+
18
+ import { CheckCircle, HelpCircle, User01 } from '@/components';
19
+
20
+ const meta: Meta<typeof DropdownMenu> = {
21
+ title: 'Components/Navigation/DropdownMenu',
22
+ component: DropdownMenu,
23
+ tags: [ 'autodocs' ],
24
+ parameters: {
25
+ layout: 'centered',
26
+ docs: {
27
+ description: {
28
+ component:
29
+ 'The DropdownMenu is a contextual menu component based on the Radix library. It supports items, separators, groups, selection states, and submenus with full accessibility.',
30
+ },
31
+ },
32
+ },
33
+ argTypes: {
34
+ children: {
35
+ control: false,
36
+ },
37
+ modal: {
38
+ control: false,
39
+ },
40
+ },
41
+ };
42
+
43
+ export default meta;
44
+ type Story = StoryObj<typeof DropdownMenu>;
45
+
46
+ export const Default: Story = {
47
+ args: {
48
+ children: (
49
+ <>
50
+ <DropdownMenuTrigger asChild>
51
+ <button className="btn-primary">Open Menu</button>
52
+ </DropdownMenuTrigger>
53
+ <DropdownMenuContent>
54
+ <DropdownMenuLabel>Options</DropdownMenuLabel>
55
+ <DropdownMenuItem>New file</DropdownMenuItem>
56
+ <DropdownMenuItem>Open folder</DropdownMenuItem>
57
+ <DropdownMenuItem>Save as</DropdownMenuItem>
58
+ <DropdownMenuSeparator />
59
+ <DropdownMenuItem>Logout</DropdownMenuItem>
60
+ </DropdownMenuContent>
61
+ </>
62
+ ),
63
+ },
64
+ };
65
+
66
+ export const WithCheckboxItems: Story = {
67
+ args: {
68
+ children: (
69
+ <>
70
+ <DropdownMenuTrigger asChild>
71
+ <button className="btn-secondary">Preferences</button>
72
+ </DropdownMenuTrigger>
73
+ <DropdownMenuContent>
74
+ <DropdownMenuLabel>Visual settings</DropdownMenuLabel>
75
+ <DropdownMenuCheckboxItem checked>Show lines</DropdownMenuCheckboxItem>
76
+ <DropdownMenuCheckboxItem>Enable minimap</DropdownMenuCheckboxItem>
77
+ <DropdownMenuCheckboxItem checked>Use dark theme</DropdownMenuCheckboxItem>
78
+ </DropdownMenuContent>
79
+ </>
80
+ ),
81
+ },
82
+ };
83
+
84
+ export const WithRadioGroup: Story = {
85
+ args: {
86
+ children: (
87
+ <>
88
+ <DropdownMenuTrigger asChild>
89
+ <button className="btn-outline">Select layout</button>
90
+ </DropdownMenuTrigger>
91
+ <DropdownMenuContent>
92
+ <DropdownMenuLabel>Layout</DropdownMenuLabel>
93
+ <DropdownMenuRadioGroup defaultValue="grid">
94
+ <DropdownMenuRadioItem value="grid">Grid</DropdownMenuRadioItem>
95
+ <DropdownMenuRadioItem value="list">List</DropdownMenuRadioItem>
96
+ <DropdownMenuRadioItem value="columns">Columns</DropdownMenuRadioItem>
97
+ </DropdownMenuRadioGroup>
98
+ </DropdownMenuContent>
99
+ </>
100
+ ),
101
+ },
102
+ };
103
+
104
+ export const WithSubMenu: Story = {
105
+ args: {
106
+ children: (
107
+ <>
108
+ <DropdownMenuTrigger asChild>
109
+ <button className="btn-outline">Menu with Submenu</button>
110
+ </DropdownMenuTrigger>
111
+ <DropdownMenuContent>
112
+ <DropdownMenuLabel>Dropdown Menu Label</DropdownMenuLabel>
113
+ <DropdownMenuSeparator />
114
+ <DropdownMenuItem variant="default">Dropdown Menu Item Default</DropdownMenuItem>
115
+ <DropdownMenuItem variant="light">Dropdown Menu Item Light</DropdownMenuItem>
116
+ <DropdownMenuItem variant="error">Dropdown Menu Item Error</DropdownMenuItem>
117
+ <DropdownMenuItem variant="success">Dropdown Menu Item Success</DropdownMenuItem>
118
+ <DropdownMenuSeparator />
119
+ <DropdownMenuSub>
120
+ <DropdownMenuSubTrigger variant="error">Dropdown Menu Submenu Error</DropdownMenuSubTrigger>
121
+ <DropdownMenuSubContent>
122
+ <DropdownMenuItem variant="error"><HelpCircle/> Dropdown Menu Submenu Item Error</DropdownMenuItem>
123
+ <DropdownMenuItem variant="error"><HelpCircle/> Dropdown Menu Submenu Item Error</DropdownMenuItem>
124
+ </DropdownMenuSubContent>
125
+ </DropdownMenuSub>
126
+ <DropdownMenuSeparator />
127
+ <DropdownMenuSub>
128
+ <DropdownMenuSubTrigger variant="success">Dropdown Menu Submenu Success</DropdownMenuSubTrigger>
129
+ <DropdownMenuSubContent>
130
+ <DropdownMenuItem variant="success"><CheckCircle/> Dropdown Menu Submenu Item Success</DropdownMenuItem>
131
+ <DropdownMenuItem variant="success"><CheckCircle/> Dropdown Menu Submenu Item Success</DropdownMenuItem>
132
+ </DropdownMenuSubContent>
133
+ </DropdownMenuSub>
134
+ <DropdownMenuSeparator />
135
+ <DropdownMenuSub>
136
+ <DropdownMenuSubTrigger variant="light">Dropdown Menu Submenu Light</DropdownMenuSubTrigger>
137
+ <DropdownMenuSubContent>
138
+ <DropdownMenuItem variant="light"><User01/> Dropdown Menu Submenu Item Light</DropdownMenuItem>
139
+ <DropdownMenuItem variant="light"><User01/> Dropdown Menu Submenu Item Light</DropdownMenuItem>
140
+ </DropdownMenuSubContent>
141
+ </DropdownMenuSub>
142
+ <DropdownMenuSeparator />
143
+ <DropdownMenuSub>
144
+ <DropdownMenuSubTrigger variant="default">Dropdown Menu Submenu Default</DropdownMenuSubTrigger>
145
+ <DropdownMenuSubContent>
146
+ <DropdownMenuItem variant="default"><User01/> Dropdown Menu Submenu Item Default</DropdownMenuItem>
147
+ <DropdownMenuItem variant="default"><User01/> Dropdown Menu Submenu Item Default</DropdownMenuItem>
148
+ </DropdownMenuSubContent>
149
+ </DropdownMenuSub>
150
+ </DropdownMenuContent>
151
+ </>
152
+ ),
153
+ },
154
+ };
@@ -0,0 +1,163 @@
1
+ import { fireEvent, render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+
5
+ import {
6
+ DropdownMenu,
7
+ DropdownMenuCheckboxItem,
8
+ DropdownMenuContent,
9
+ DropdownMenuItem,
10
+ DropdownMenuLabel,
11
+ DropdownMenuRadioGroup,
12
+ DropdownMenuRadioItem,
13
+ DropdownMenuSeparator,
14
+ DropdownMenuSub,
15
+ DropdownMenuSubContent,
16
+ DropdownMenuSubTrigger,
17
+ DropdownMenuTrigger,
18
+ } from './dropdown-menu';
19
+
20
+ const renderDropdownMenu = ({
21
+ onCheckedChange,
22
+ onSelect,
23
+ onValueChange,
24
+ }: {
25
+ onSelect?: () => void;
26
+ onCheckedChange?: () => void;
27
+ onValueChange?: () => void;
28
+ } = {}) => {
29
+ render(
30
+ <DropdownMenu>
31
+ <DropdownMenuTrigger>Trigger</DropdownMenuTrigger>
32
+ <DropdownMenuContent>
33
+ <DropdownMenuLabel>Label</DropdownMenuLabel>
34
+ <DropdownMenuItem onSelect={onSelect}>Option 1</DropdownMenuItem>
35
+ <DropdownMenuItem>Option 2</DropdownMenuItem>
36
+ <DropdownMenuSeparator />
37
+ <DropdownMenuCheckboxItem checked onCheckedChange={onCheckedChange}>
38
+ Checkbox Item
39
+ </DropdownMenuCheckboxItem>
40
+ <DropdownMenuRadioGroup onValueChange={onValueChange} value="b">
41
+ <DropdownMenuRadioItem value="a">Option A</DropdownMenuRadioItem>
42
+ <DropdownMenuRadioItem value="b">Option B</DropdownMenuRadioItem>
43
+ </DropdownMenuRadioGroup>
44
+ <DropdownMenuSub>
45
+ <DropdownMenuSubTrigger>More Options</DropdownMenuSubTrigger>
46
+ <DropdownMenuSubContent>
47
+ <DropdownMenuItem>Sub Item 1</DropdownMenuItem>
48
+ </DropdownMenuSubContent>
49
+ </DropdownMenuSub>
50
+ </DropdownMenuContent>
51
+ </DropdownMenu>
52
+ );
53
+ };
54
+
55
+ const openDropdownMenu = async () => {
56
+ const user = userEvent.setup();
57
+
58
+ await user.click(screen.getByText('Trigger'));
59
+ };
60
+
61
+ describe('<DropdownMenu />', () => {
62
+ const user = userEvent.setup();
63
+
64
+ it('renders trigger and opens the menu on click', async () => {
65
+ renderDropdownMenu();
66
+
67
+ expect(screen.queryByText('Option 1')).not.toBeInTheDocument();
68
+
69
+ await openDropdownMenu();
70
+
71
+ expect(await screen.findByText('Option 1')).toBeVisible();
72
+ });
73
+
74
+ it('fires onSelect when DropdownMenuItem is clicked', async () => {
75
+ const onSelect = vi.fn();
76
+
77
+ renderDropdownMenu({ onSelect });
78
+ await openDropdownMenu();
79
+
80
+ await user.click(screen.getByText('Option 1'));
81
+
82
+ expect(onSelect).toHaveBeenCalledOnce();
83
+ });
84
+
85
+ it('toggles checked state in DropdownMenuCheckboxItem', async () => {
86
+ const onCheckedChange = vi.fn();
87
+
88
+ renderDropdownMenu({ onCheckedChange });
89
+ await openDropdownMenu();
90
+
91
+ const checkbox = await screen.findByText('Checkbox Item');
92
+
93
+ await user.click(checkbox);
94
+
95
+ expect(onCheckedChange).toHaveBeenCalledWith(false);
96
+ });
97
+
98
+ it('selects the correct item in a DropdownMenuRadioGroup', async () => {
99
+ const onValueChange = vi.fn();
100
+
101
+ renderDropdownMenu({ onValueChange });
102
+ await openDropdownMenu();
103
+
104
+ const optionA = await screen.findByText('Option A');
105
+
106
+ await user.click(optionA);
107
+
108
+ expect(onValueChange).toHaveBeenCalledWith('a');
109
+ });
110
+
111
+ it('renders label and separator correctly', async () => {
112
+ renderDropdownMenu();
113
+ await openDropdownMenu();
114
+
115
+ expect(screen.getByText('Label')).toBeVisible();
116
+ expect(screen.getByRole('separator')).toBeVisible();
117
+ });
118
+
119
+ it('renders sub menu and handles sub trigger click', async () => {
120
+ renderDropdownMenu();
121
+ await openDropdownMenu();
122
+
123
+ await user.click(screen.getByText('More Options'));
124
+
125
+ const firstSubItem = await screen.findByText('Sub Item 1');
126
+
127
+ expect(firstSubItem).toBeVisible();
128
+ });
129
+
130
+ it('closes menu on item selection', async () => {
131
+ renderDropdownMenu();
132
+ await openDropdownMenu();
133
+
134
+ const firstOption = await screen.findByText('Option 1');
135
+
136
+ expect(firstOption).toBeInTheDocument();
137
+
138
+ await user.click(firstOption);
139
+
140
+ expect(firstOption).not.toBeInTheDocument();
141
+ });
142
+
143
+ it('supports keyboard navigation', async () => {
144
+ renderDropdownMenu();
145
+
146
+ const trigger = screen.getByText('Trigger');
147
+
148
+ trigger.focus();
149
+ fireEvent.keyDown(trigger, { key: 'Enter' });
150
+
151
+ const firstOption = await screen.findByText('Option 1');
152
+ expect(firstOption).toBeVisible();
153
+
154
+ fireEvent.keyDown(firstOption, { key: 'ArrowDown' });
155
+ const secondOption = await screen.findByText('Option 2');
156
+ expect(secondOption).toHaveFocus();
157
+ });
158
+
159
+ it('should match snapshot', () => {
160
+ const { container } = render(<DropdownMenu />);
161
+ expect(container).toMatchSnapshot();
162
+ });
163
+ });
@@ -0,0 +1,313 @@
1
+ import * as React from 'react';
2
+
3
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
4
+ import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';
5
+
6
+ import { cn } from '@/utils';
7
+
8
+ function DropdownMenu ({
9
+ ...props
10
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
11
+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
12
+ }
13
+
14
+ function DropdownMenuPortal ({
15
+ ...props
16
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
17
+ return <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />;
18
+ }
19
+
20
+ function DropdownMenuTrigger ({
21
+ ...props
22
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
23
+ return <DropdownMenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />;
24
+ }
25
+
26
+ function DropdownMenuContent ({
27
+ className,
28
+ sideOffset = 4,
29
+ ...props
30
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
31
+ return (
32
+ <DropdownMenuPrimitive.Portal>
33
+ <DropdownMenuPrimitive.Content
34
+ data-slot="dropdown-menu-content"
35
+ sideOffset={sideOffset}
36
+ className={cn(
37
+ 'z-50 min-w-[8rem] max-h-(--radix-dropdown-menu-content-available-height)',
38
+ 'origin-(--radix-dropdown-menu-content-transform-origin)',
39
+ 'overflow-x-hidden overflow-y-auto',
40
+ 'bg-blur rounded-md p-1 shadow-md',
41
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out',
42
+ 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
43
+ 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
44
+ 'data-[side=bottom]:slide-in-from-top-2',
45
+ 'data-[side=left]:slide-in-from-right-2',
46
+ 'data-[side=right]:slide-in-from-left-2',
47
+ 'data-[side=top]:slide-in-from-bottom-2',
48
+ className
49
+ )}
50
+ {...props}
51
+ />
52
+ </DropdownMenuPrimitive.Portal>
53
+ );
54
+ }
55
+
56
+ function DropdownMenuGroup ({
57
+ ...props
58
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
59
+ return <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />;
60
+ }
61
+
62
+ function DropdownMenuItem ({
63
+ className,
64
+ inset,
65
+ variant = 'default',
66
+ ...props
67
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
68
+ inset?: boolean;
69
+ variant?: 'default' | 'light' | 'error' | 'success';
70
+ }) {
71
+ return (
72
+ <DropdownMenuPrimitive.Item
73
+ data-slot="dropdown-menu-item"
74
+ data-inset={inset}
75
+ data-variant={variant}
76
+ className={cn(
77
+ 'relative flex items-center gap-2',
78
+ 'rounded-sm px-2 py-1.5',
79
+ 'text-sm font-semibold',
80
+ 'cursor-pointer select-none outline-hidden',
81
+ 'focus:bg-gray focus:text-primary focus:bg-white',
82
+ 'data-[variant=light]:text-gray-700 data-[variant=error]:text-error-600 data-[variant=success]:text-success-600',
83
+ 'data-[variant=light]:focus:text-gray-800 data-[variant=error]:focus:text-error-600 data-[variant=success]:focus:text-success-600',
84
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
85
+ 'data-[inset]:pl-8',
86
+ '[&_svg]:shrink-0',
87
+ '[&_svg]:text-primary',
88
+ 'data-[variant=light]:[&_svg]:text-gray-400 data-[variant=error]:[&_svg]:text-error-600 data-[variant=success]:[&_svg]:text-success-600',
89
+ '[&_svg:not([class*=\'size-\'])]:size-4',
90
+ className
91
+ )}
92
+ {...props}
93
+ />
94
+ );
95
+ }
96
+
97
+ function DropdownMenuCheckboxItem ({
98
+ className,
99
+ children,
100
+ checked,
101
+ ...props
102
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
103
+ return (
104
+ <DropdownMenuPrimitive.CheckboxItem
105
+ data-slot="dropdown-menu-checkbox-item"
106
+ className={cn(
107
+ 'relative flex items-center gap-2',
108
+ 'rounded-sm py-1.5 pr-2 pl-8',
109
+ 'text-sm',
110
+ 'cursor-default select-none outline-hidden',
111
+ 'focus:bg-accent focus:text-accent-foreground',
112
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
113
+ '[&_svg]:shrink-0 [&_svg]:pointer-events-none',
114
+ '[&_svg:not([class*=\'size-\'])]:size-4',
115
+ className
116
+ )}
117
+ checked={checked}
118
+ {...props}
119
+ >
120
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
121
+ <DropdownMenuPrimitive.ItemIndicator>
122
+ <CheckIcon className="size-4" />
123
+ </DropdownMenuPrimitive.ItemIndicator>
124
+ </span>
125
+ {children}
126
+ </DropdownMenuPrimitive.CheckboxItem>
127
+ );
128
+ }
129
+
130
+ function DropdownMenuRadioGroup ({
131
+ ...props
132
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
133
+ return (
134
+ <DropdownMenuPrimitive.RadioGroup data-slot="dropdown-menu-radio-group" {...props} />
135
+ );
136
+ }
137
+
138
+ function DropdownMenuRadioItem ({
139
+ className,
140
+ children,
141
+ ...props
142
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
143
+ return (
144
+ <DropdownMenuPrimitive.RadioItem
145
+ data-slot="dropdown-menu-radio-item"
146
+ className={cn(
147
+ 'relative flex items-center gap-2',
148
+ 'rounded-sm py-1.5 pr-2 pl-8',
149
+ 'text-sm',
150
+ 'cursor-default select-none outline-hidden',
151
+ 'focus:bg-accent focus:text-accent-foreground',
152
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
153
+ '[&_svg]:shrink-0 [&_svg]:pointer-events-none',
154
+ '[&_svg:not([class*=\'size-\'])]:size-4',
155
+ className
156
+ )}
157
+ {...props}
158
+ >
159
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
160
+ <DropdownMenuPrimitive.ItemIndicator>
161
+ <CircleIcon className="size-2 fill-current" />
162
+ </DropdownMenuPrimitive.ItemIndicator>
163
+ </span>
164
+ {children}
165
+ </DropdownMenuPrimitive.RadioItem>
166
+ );
167
+ }
168
+
169
+ function DropdownMenuLabel ({
170
+ className,
171
+ inset,
172
+ ...props
173
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
174
+ inset?: boolean;
175
+ }) {
176
+ return (
177
+ <DropdownMenuPrimitive.Label
178
+ data-slot="dropdown-menu-label"
179
+ data-inset={inset}
180
+ className={cn(
181
+ 'px-2 py-1.5',
182
+ 'text-sm font-medium',
183
+ 'data-[inset]:pl-8',
184
+ className
185
+ )}
186
+ {...props}
187
+ />
188
+ );
189
+ }
190
+
191
+ function DropdownMenuSeparator ({
192
+ className,
193
+ ...props
194
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
195
+ return (
196
+ <DropdownMenuPrimitive.Separator
197
+ data-slot="dropdown-menu-separator"
198
+ className={cn(
199
+ 'bg-border h-px',
200
+ '-mx-1 my-1',
201
+ className
202
+ )}
203
+ {...props}
204
+ />
205
+ );
206
+ }
207
+
208
+ function DropdownMenuShortcut ({ className, ...props }: React.ComponentProps<'span'>) {
209
+ return (
210
+ <span
211
+ data-slot="dropdown-menu-shortcut"
212
+ className={cn(
213
+ 'text-xs tracking-widest',
214
+ 'text-muted-foreground',
215
+ 'ml-auto',
216
+ className
217
+ )}
218
+ {...props}
219
+ />
220
+ );
221
+ }
222
+
223
+ function DropdownMenuSub ({
224
+ ...props
225
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
226
+ return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />;
227
+ }
228
+
229
+ function DropdownMenuSubTrigger ({
230
+ className,
231
+ inset,
232
+ children,
233
+ variant = 'default',
234
+ ...props
235
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
236
+ inset?: boolean;
237
+ variant?: 'default' | 'light' | 'error' | 'success';
238
+ }) {
239
+ return (
240
+ <DropdownMenuPrimitive.SubTrigger
241
+ data-slot="dropdown-menu-sub-trigger"
242
+ data-inset={inset}
243
+ data-variant={variant}
244
+ className={cn(
245
+ 'flex items-center gap-2 rounded-sm px-2 py-1.5',
246
+ 'text-sm font-semibold',
247
+ 'cursor-pointer select-none outline-hidden',
248
+ 'focus:bg-white focus:text-primary data-[variant=default]:focus:[&_svg]:!text-primary data-[variant=error]:focus:[&_svg]:!text-error-600 data-[variant=success]:focus:[&_svg]:!text-success-600',
249
+ 'data-[state=open]:bg-white data-[state=open]:text-primary data-[variant=light]:data-[state=open]:text-gray-800',
250
+ 'data-[variant=light]:text-gray-700 data-[variant=error]:text-error-600 data-[variant=success]:text-success-600',
251
+ 'data-[variant=light]:focus:text-gray-800 data-[variant=error]:focus:text-error-600 data-[variant=success]:focus:text-success-600',
252
+ 'data-[inset]:pl-8',
253
+ '[&_svg]:shrink-0',
254
+ '[&_svg:not([class*=\'text-\'])]:text-primary data-[variant=error]:[&_svg]:text-error-600 data-[variant=success]:[&_svg]:text-success-600',
255
+ 'data-[variant=light]:[&_svg]:text-gray-400 data-[variant=error]:[&_svg]:text-error-600 data-[variant=success]:[&_svg]:text-success-600',
256
+ '[&_svg:not([class*=\'size-\'])]:size-4',
257
+ className
258
+ )}
259
+ {...props}
260
+ >
261
+ {children}
262
+ {variant === 'default' && (
263
+ <ChevronRightIcon className="ml-auto size-4 text-gray-400" />
264
+ )}
265
+ </DropdownMenuPrimitive.SubTrigger>
266
+ );
267
+ }
268
+
269
+ function DropdownMenuSubContent ({
270
+ className,
271
+ ...props
272
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
273
+ return (
274
+ <DropdownMenuPrimitive.Portal>
275
+ <DropdownMenuPrimitive.SubContent
276
+ data-slot="dropdown-menu-sub-content"
277
+ className={cn(
278
+ 'z-50 min-w-[8rem]',
279
+ 'origin-(--radix-dropdown-menu-content-transform-origin)',
280
+ 'overflow-hidden rounded-md p-1',
281
+ 'bg-blur shadow-lg',
282
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out',
283
+ 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
284
+ 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
285
+ 'data-[side=bottom]:slide-in-from-top-2',
286
+ 'data-[side=left]:slide-in-from-right-2',
287
+ 'data-[side=right]:slide-in-from-left-2',
288
+ 'data-[side=top]:slide-in-from-bottom-2',
289
+ className
290
+ )}
291
+ {...props}
292
+ />
293
+ </DropdownMenuPrimitive.Portal>
294
+ );
295
+ }
296
+
297
+ export {
298
+ DropdownMenu,
299
+ DropdownMenuCheckboxItem,
300
+ DropdownMenuContent,
301
+ DropdownMenuGroup,
302
+ DropdownMenuItem,
303
+ DropdownMenuLabel,
304
+ DropdownMenuPortal,
305
+ DropdownMenuRadioGroup,
306
+ DropdownMenuRadioItem,
307
+ DropdownMenuSeparator,
308
+ DropdownMenuShortcut,
309
+ DropdownMenuSub,
310
+ DropdownMenuSubContent,
311
+ DropdownMenuSubTrigger,
312
+ DropdownMenuTrigger,
313
+ };
@@ -0,0 +1 @@
1
+ export * from '@/components/molecules/DropdownMenu/dropdown-menu';
@@ -0,0 +1,48 @@
1
+ import { HoverCard, HoverCardContent, HoverCardTrigger } from './hover-card';
2
+
3
+ import type { Meta, StoryObj } from '@storybook/react';
4
+
5
+ import { Button } from '@/components';
6
+
7
+ const meta: Meta<typeof HoverCard> = {
8
+ title: 'Components/Data Display/HoverCard',
9
+ component: HoverCard,
10
+ tags: [ 'autodocs' ],
11
+ parameters: {
12
+ docs: {
13
+ description: {
14
+ component: 'HoverCard is a component that displays a hover card.',
15
+ },
16
+ },
17
+ controls: {
18
+ expanded: true,
19
+ },
20
+ },
21
+ argTypes: {
22
+ openDelay: {
23
+ control: 'number',
24
+ description: 'Delay in milliseconds before the hover card is opened.',
25
+ },
26
+ closeDelay: {
27
+ control: 'number',
28
+ description: 'Delay in milliseconds before the hover card is closed.',
29
+ },
30
+ },
31
+ };
32
+
33
+ export default meta;
34
+
35
+ type Story = StoryObj<typeof meta>;
36
+
37
+ export const Default: Story = {
38
+ render: (args) => (
39
+ <HoverCard {...args}>
40
+ <HoverCardTrigger asChild><Button>Hover me</Button></HoverCardTrigger>
41
+ <HoverCardContent>Hover card content</HoverCardContent>
42
+ </HoverCard>
43
+ ),
44
+ args: {
45
+ openDelay: 0,
46
+ closeDelay: 0,
47
+ },
48
+ };