@customafk/lunas-ui 0.0.7 → 0.0.8

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 (625) hide show
  1. package/dist/{add-new-BaABbnol.js → add-new-C--Ee4bj.js} +1 -2
  2. package/dist/{add-new-DUoS_-n2.cjs → add-new-pfLdk0Hp.cjs} +1 -2
  3. package/dist/{alert-dialog-0KwdjY-6.js → alert-dialog-CQa0TLlF.js} +1 -2
  4. package/dist/{alert-dialog-D5ZqgIiC.cjs → alert-dialog-D1DFrl-0.cjs} +1 -2
  5. package/dist/badge-D_qEoSL8.js +1 -2
  6. package/dist/{badge-CRXT2dH_.cjs → badge-DfSj5nwV.cjs} +1 -2
  7. package/dist/button-Bku3bKv9.js +1 -2
  8. package/dist/button-CS0x-mYR.d.cts +22 -0
  9. package/dist/button-CxHABSnr.d.ts +22 -0
  10. package/dist/{button-Dzv_nos1.cjs → button-CycE0WzB.cjs} +1 -2
  11. package/dist/calendar-DaYVxwJx.js +1 -0
  12. package/dist/calendar-DzAxQqFI.cjs +1 -0
  13. package/dist/{card-Dta5eW8u.cjs → card-D7C05tvk.cjs} +1 -2
  14. package/dist/card-D8cxRC5y.js +1 -2
  15. package/dist/cards/simple-card.cjs +1 -2
  16. package/dist/cards/simple-card.d.cts +3 -3
  17. package/dist/cards/simple-card.d.ts +3 -3
  18. package/dist/cards/simple-card.js +1 -2
  19. package/dist/chunk-hhQzssFb.cjs +1 -0
  20. package/dist/command-BfYiUikG.d.cts +52 -0
  21. package/dist/{command-CsntVmEz.cjs → command-CkGJbvFq.cjs} +1 -2
  22. package/dist/command-CycGGWOh.d.ts +52 -0
  23. package/dist/{command-_L9bD9a-.js → command-Ir_Vqgds.js} +1 -2
  24. package/dist/data-display/country.cjs +1 -2
  25. package/dist/data-display/country.d.cts +1 -2
  26. package/dist/data-display/country.d.ts +2 -3
  27. package/dist/data-display/country.js +1 -2
  28. package/dist/data-display/data-list.cjs +1 -2
  29. package/dist/data-display/data-list.d.cts +1 -2
  30. package/dist/data-display/data-list.d.ts +1 -2
  31. package/dist/data-display/data-list.js +1 -2
  32. package/dist/data-display/date.cjs +1 -1
  33. package/dist/data-display/date.d.cts +1 -2
  34. package/dist/data-display/date.d.ts +1 -2
  35. package/dist/data-display/empty.cjs +1 -2
  36. package/dist/data-display/empty.d.cts +4 -3
  37. package/dist/data-display/empty.d.ts +4 -3
  38. package/dist/data-display/empty.js +1 -2
  39. package/dist/data-display/name.cjs +1 -2
  40. package/dist/data-display/name.d.cts +1 -2
  41. package/dist/data-display/name.d.ts +1 -2
  42. package/dist/data-display/name.js +1 -2
  43. package/dist/data-display/phone-number.cjs +1 -2
  44. package/dist/data-display/phone-number.d.cts +1 -2
  45. package/dist/data-display/phone-number.d.ts +1 -2
  46. package/dist/data-display/phone-number.js +1 -2
  47. package/dist/data-display/role-badge.cjs +1 -2
  48. package/dist/data-display/role-badge.d.cts +1 -2
  49. package/dist/data-display/role-badge.d.ts +2 -3
  50. package/dist/data-display/role-badge.js +1 -2
  51. package/dist/data-display/statistic.cjs +1 -2
  52. package/dist/data-display/statistic.d.cts +26 -3
  53. package/dist/data-display/statistic.d.ts +26 -3
  54. package/dist/data-display/statistic.js +1 -2
  55. package/dist/date-BMq_DNsv.js +1 -2
  56. package/dist/{date-nd8WkPlx.cjs → date-ByLOGsKl.cjs} +1 -2
  57. package/dist/{dialog-D3VF5qxy.d.cts → dialog-B13T--98.d.ts} +12 -12
  58. package/dist/{dialog-W-DmDMEE.cjs → dialog-B3cQOpjg.cjs} +1 -2
  59. package/dist/{dialog-C4hf-Puw.js → dialog-BLDh3Gqw.js} +1 -2
  60. package/dist/{dialog-MLCAvDJH.d.ts → dialog-Dspjpsjh.d.cts} +12 -12
  61. package/dist/dialogs/confirm-dialog.cjs +1 -2
  62. package/dist/dialogs/confirm-dialog.d.cts +1 -2
  63. package/dist/dialogs/confirm-dialog.d.ts +1 -2
  64. package/dist/dialogs/confirm-dialog.js +1 -2
  65. package/dist/dialogs/detail-dialog/index.cjs +1 -2
  66. package/dist/dialogs/detail-dialog/index.d.cts +1 -2
  67. package/dist/dialogs/detail-dialog/index.d.ts +1 -2
  68. package/dist/dialogs/detail-dialog/index.js +1 -2
  69. package/dist/dialogs/error-dialog.cjs +1 -1
  70. package/dist/dialogs/error-dialog.d.cts +1 -2
  71. package/dist/dialogs/error-dialog.d.ts +1 -2
  72. package/dist/dialogs/error-dialog.js +1 -1
  73. package/dist/dialogs/form-dialog.cjs +1 -2
  74. package/dist/dialogs/form-dialog.d.cts +3 -3
  75. package/dist/dialogs/form-dialog.d.ts +3 -3
  76. package/dist/dialogs/form-dialog.js +1 -2
  77. package/dist/dialogs/loading-dialog.cjs +1 -2
  78. package/dist/dialogs/loading-dialog.d.cts +1 -2
  79. package/dist/dialogs/loading-dialog.d.ts +1 -2
  80. package/dist/dialogs/loading-dialog.js +1 -2
  81. package/dist/{dropdown-menu-Bv18S56o.cjs → dropdown-menu-CPvB_jOC.cjs} +1 -2
  82. package/dist/{dropdown-menu-jCQwh2rG.js → dropdown-menu-Cx-Wime0.js} +1 -2
  83. package/dist/{error-dialog-DpQgL5Hy.cjs → error-dialog-BTjeT7x-.cjs} +1 -2
  84. package/dist/{error-dialog-D_4WL-Hj.js → error-dialog-DlhosP10.js} +1 -2
  85. package/dist/flex-ILvQrYMJ.js +1 -2
  86. package/dist/{flex-CNA_SId-.cjs → flex-yTyoLpgH.cjs} +1 -2
  87. package/dist/form-CA4hhSV5.js +1 -2
  88. package/dist/{form-CYZkgobJ.cjs → form-C_PCHrpx.cjs} +1 -2
  89. package/dist/{form-wrapper-BYbwt1zC.cjs → form-wrapper-CCqogufb.cjs} +1 -2
  90. package/dist/{form-wrapper-D-2Uz518.js → form-wrapper-YPIbD8rh.js} +1 -2
  91. package/dist/forms/combobox-field.cjs +41 -0
  92. package/dist/forms/combobox-field.d.cts +27 -0
  93. package/dist/forms/combobox-field.d.ts +27 -0
  94. package/dist/forms/combobox-field.js +41 -0
  95. package/dist/forms/date-field.cjs +1 -0
  96. package/dist/forms/date-field.d.cts +21 -0
  97. package/dist/forms/date-field.d.ts +21 -0
  98. package/dist/forms/date-field.js +1 -0
  99. package/dist/forms/form-wrapper.cjs +1 -1
  100. package/dist/forms/form-wrapper.d.cts +3 -3
  101. package/dist/forms/form-wrapper.d.ts +3 -3
  102. package/dist/forms/form-wrapper.js +1 -1
  103. package/dist/forms/multi-select-field.cjs +1 -0
  104. package/dist/forms/multi-select-field.d.cts +29 -0
  105. package/dist/forms/multi-select-field.d.ts +29 -0
  106. package/dist/forms/multi-select-field.js +1 -0
  107. package/dist/forms/number-field.cjs +1 -0
  108. package/dist/forms/number-field.d.cts +27 -0
  109. package/dist/forms/number-field.d.ts +27 -0
  110. package/dist/forms/number-field.js +1 -0
  111. package/dist/forms/password-field.cjs +1 -0
  112. package/dist/forms/password-field.d.cts +22 -0
  113. package/dist/forms/password-field.d.ts +22 -0
  114. package/dist/forms/password-field.js +1 -0
  115. package/dist/forms/select-field.cjs +1 -0
  116. package/dist/forms/select-field.d.cts +32 -0
  117. package/dist/forms/select-field.d.ts +32 -0
  118. package/dist/forms/select-field.js +1 -0
  119. package/dist/forms/switch-field.cjs +1 -0
  120. package/dist/forms/switch-field.d.cts +18 -0
  121. package/dist/forms/switch-field.d.ts +18 -0
  122. package/dist/forms/switch-field.js +1 -0
  123. package/dist/forms/text-field.cjs +1 -0
  124. package/dist/forms/text-field.d.cts +30 -0
  125. package/dist/forms/text-field.d.ts +30 -0
  126. package/dist/forms/text-field.js +1 -0
  127. package/dist/forms/textarea-field.cjs +1 -0
  128. package/dist/forms/textarea-field.d.cts +26 -0
  129. package/dist/forms/textarea-field.d.ts +26 -0
  130. package/dist/forms/textarea-field.js +1 -0
  131. package/dist/{input-D0Phuz25.d.cts → input-BcIy0lq8.d.cts} +3 -3
  132. package/dist/{input-DXEBB91E.cjs → input-C8Sebaue.cjs} +1 -2
  133. package/dist/{input-tHIKXxVS.d.ts → input-Cux9upuQ.d.ts} +3 -3
  134. package/dist/{input-FzKbxUq2.js → input-Dmaq3fzf.js} +1 -2
  135. package/dist/label-Cxbctr6x.js +1 -2
  136. package/dist/{label-CunjD1rx.cjs → label-i858Jr98.cjs} +1 -2
  137. package/dist/layouts/flex.cjs +1 -1
  138. package/dist/layouts/flex.d.cts +14 -4
  139. package/dist/layouts/flex.d.ts +14 -4
  140. package/dist/layouts/main/index.cjs +1 -2
  141. package/dist/layouts/main/index.d.cts +14 -5
  142. package/dist/layouts/main/index.d.ts +14 -5
  143. package/dist/layouts/main/index.js +1 -2
  144. package/dist/multi-select-DZBXSr7F.cjs +1 -0
  145. package/dist/multi-select-LYl29d4h.js +1 -0
  146. package/dist/paragraph-Bey03JkA.js +1 -2
  147. package/dist/{paragraph-ZxI8zxuf.cjs → paragraph-DWQ0PZt_.cjs} +1 -2
  148. package/dist/popover-Ce0OTSQL.cjs +1 -0
  149. package/dist/popover-tDri6Ded.js +1 -0
  150. package/dist/{progress-BnnOfAZN.cjs → progress-CHh9eRZi.cjs} +1 -2
  151. package/dist/{progress-CBccqUUJ.js → progress-CeXKNvJc.js} +1 -2
  152. package/dist/{refresh-BHt_h3N_.js → refresh-BPlmkCzH.js} +1 -2
  153. package/dist/{refresh-DrolZxuC.cjs → refresh-Dtz354hW.cjs} +1 -2
  154. package/dist/{scroll-area-DWWpaz5j.cjs → scroll-area-Ba9RvkDf.cjs} +1 -2
  155. package/dist/{scroll-area-Bdb_LSFF.js → scroll-area-D-IhBWqm.js} +1 -2
  156. package/dist/{search-input-L2sq0eB0.js → search-input-BG4-fO9W.js} +1 -2
  157. package/dist/{search-input-Bf4-FeWu.cjs → search-input-DVMQEBvb.cjs} +1 -2
  158. package/dist/{select-CWUsisI0.js → select-4IO3vAjO.js} +1 -2
  159. package/dist/{select-ZSyt5zCe.cjs → select-UsiicIRo.cjs} +1 -2
  160. package/dist/{separator-DTB3sDNG.cjs → separator-D4iTmsID.cjs} +1 -2
  161. package/dist/{separator-BpsL0PlX.js → separator-DMdqEz29.js} +1 -2
  162. package/dist/{separator-COXs-I-Q.d.cts → separator-DtZ0fiIK.d.cts} +3 -3
  163. package/dist/{separator-2cwfp8qT.d.ts → separator-J8f9PdbI.d.ts} +3 -3
  164. package/dist/{sheet-C8r2QGpq.js → sheet-2JqHfdYi.js} +1 -2
  165. package/dist/{sheet-CCwbAaA6.cjs → sheet-Dr-a3-o2.cjs} +1 -2
  166. package/dist/{sidebar-C166f_9B.js → sidebar-COBzB7S8.js} +1 -2
  167. package/dist/{sidebar-BLPMNltJ.cjs → sidebar-gXuaHBie.cjs} +1 -2
  168. package/dist/skeleton-BTQm_mtV.cjs +1 -0
  169. package/dist/{skeleton-DYmX0k94.js → skeleton-D1_Brnl9.js} +1 -2
  170. package/dist/switch-BlK-TC1h.js +1 -0
  171. package/dist/switch-CoP3UwNk.cjs +1 -0
  172. package/dist/table/index.cjs +1 -2
  173. package/dist/table/index.d.cts +3 -3
  174. package/dist/table/index.d.ts +3 -3
  175. package/dist/table/index.js +1 -2
  176. package/dist/{table-BSeev7T0.cjs → table-C46bXpzd.cjs} +1 -2
  177. package/dist/{table-BvA64mE8.js → table-nHFRC3DG.js} +1 -2
  178. package/dist/textarea-Dz6npuI4.cjs +1 -0
  179. package/dist/textarea-dM1DYNfF.js +1 -0
  180. package/dist/{title-xsPZpQpb.cjs → title-BlLBscIg.cjs} +1 -2
  181. package/dist/title-DTkABsIG.js +1 -2
  182. package/dist/toggle-3yC7NgOb.d.ts +19 -0
  183. package/dist/toggle-8wPArWPq.d.cts +19 -0
  184. package/dist/{toggle-D_MDMruK.js → toggle-CHJ2edke.js} +1 -2
  185. package/dist/{toggle-CfL3GVe2.cjs → toggle-CzMYdDvC.cjs} +1 -2
  186. package/dist/{tooltip-Cjuu_Ld4.d.ts → tooltip-Bo9id3nz.d.ts} +6 -6
  187. package/dist/tooltip-Dzyf5smh.js +1 -2
  188. package/dist/{tooltip-Dk4HsZVR.d.cts → tooltip-JbjxxBNd.d.cts} +6 -6
  189. package/dist/{tooltip-Beb-_EPp.cjs → tooltip-MgToVOzy.cjs} +1 -2
  190. package/dist/types-B0V1F4Ml.d.cts +1 -2
  191. package/dist/{types-DLrIc2fL.d.ts → types-CmcNT14g.d.ts} +1 -2
  192. package/dist/types-CrbWxjnp.cjs +1 -2
  193. package/dist/types-DaIHddx7.js +1 -2
  194. package/dist/typography/paragraph.cjs +1 -1
  195. package/dist/typography/paragraph.d.cts +3 -3
  196. package/dist/typography/paragraph.d.ts +3 -3
  197. package/dist/typography/title.cjs +1 -1
  198. package/dist/typography/title.d.cts +4 -3
  199. package/dist/typography/title.d.ts +4 -3
  200. package/dist/ui/alert-dialog.cjs +1 -1
  201. package/dist/ui/alert-dialog.d.cts +13 -13
  202. package/dist/ui/alert-dialog.d.ts +13 -13
  203. package/dist/ui/alert-dialog.js +1 -1
  204. package/dist/ui/alert.cjs +1 -2
  205. package/dist/ui/alert.d.cts +9 -6
  206. package/dist/ui/alert.d.ts +9 -6
  207. package/dist/ui/alert.js +1 -2
  208. package/dist/ui/aspect-ratio.cjs +1 -2
  209. package/dist/ui/aspect-ratio.d.cts +3 -3
  210. package/dist/ui/aspect-ratio.d.ts +3 -3
  211. package/dist/ui/aspect-ratio.js +1 -2
  212. package/dist/ui/avatar.cjs +1 -2
  213. package/dist/ui/avatar.d.cts +5 -5
  214. package/dist/ui/avatar.d.ts +5 -5
  215. package/dist/ui/avatar.js +1 -2
  216. package/dist/ui/badge.cjs +1 -1
  217. package/dist/ui/badge.d.cts +9 -4
  218. package/dist/ui/badge.d.ts +9 -4
  219. package/dist/ui/breadcrumb.cjs +1 -2
  220. package/dist/ui/breadcrumb.d.cts +9 -9
  221. package/dist/ui/breadcrumb.d.ts +9 -9
  222. package/dist/ui/breadcrumb.js +1 -2
  223. package/dist/ui/button.cjs +1 -1
  224. package/dist/ui/button.d.cts +1 -1
  225. package/dist/ui/button.d.ts +1 -1
  226. package/dist/ui/buttons/add-new.cjs +1 -1
  227. package/dist/ui/buttons/add-new.d.cts +1 -2
  228. package/dist/ui/buttons/add-new.d.ts +1 -2
  229. package/dist/ui/buttons/add-new.js +1 -1
  230. package/dist/ui/buttons/refresh.cjs +1 -1
  231. package/dist/ui/buttons/refresh.d.cts +1 -2
  232. package/dist/ui/buttons/refresh.d.ts +1 -2
  233. package/dist/ui/buttons/refresh.js +1 -1
  234. package/dist/ui/calendar.cjs +1 -2
  235. package/dist/ui/calendar.d.cts +5 -5
  236. package/dist/ui/calendar.d.ts +5 -5
  237. package/dist/ui/calendar.js +1 -2
  238. package/dist/ui/card.cjs +1 -1
  239. package/dist/ui/card.d.cts +9 -9
  240. package/dist/ui/card.d.ts +9 -9
  241. package/dist/ui/carousel.cjs +1 -2
  242. package/dist/ui/carousel.d.cts +8 -8
  243. package/dist/ui/carousel.d.ts +8 -8
  244. package/dist/ui/carousel.js +1 -2
  245. package/dist/ui/collapsible.cjs +1 -2
  246. package/dist/ui/collapsible.d.cts +5 -5
  247. package/dist/ui/collapsible.d.ts +5 -5
  248. package/dist/ui/collapsible.js +1 -2
  249. package/dist/ui/command.cjs +1 -1
  250. package/dist/ui/command.d.cts +3 -52
  251. package/dist/ui/command.d.ts +3 -52
  252. package/dist/ui/command.js +1 -1
  253. package/dist/ui/context-menu.cjs +1 -2
  254. package/dist/ui/context-menu.d.cts +17 -17
  255. package/dist/ui/context-menu.d.ts +17 -17
  256. package/dist/ui/context-menu.js +1 -2
  257. package/dist/ui/dialog.cjs +1 -1
  258. package/dist/ui/dialog.d.cts +1 -1
  259. package/dist/ui/dialog.d.ts +1 -1
  260. package/dist/ui/dialog.js +1 -1
  261. package/dist/ui/dropdown-menu.cjs +1 -1
  262. package/dist/ui/dropdown-menu.d.cts +17 -17
  263. package/dist/ui/dropdown-menu.d.ts +17 -17
  264. package/dist/ui/dropdown-menu.js +1 -1
  265. package/dist/ui/file-uploader.cjs +2 -3
  266. package/dist/ui/file-uploader.d.cts +3 -3
  267. package/dist/ui/file-uploader.d.ts +3 -3
  268. package/dist/ui/file-uploader.js +2 -3
  269. package/dist/ui/form.cjs +1 -1
  270. package/dist/ui/form.d.cts +24 -10
  271. package/dist/ui/form.d.ts +24 -10
  272. package/dist/ui/hover-card.cjs +1 -2
  273. package/dist/ui/hover-card.d.cts +5 -5
  274. package/dist/ui/hover-card.d.ts +5 -5
  275. package/dist/ui/hover-card.js +1 -2
  276. package/dist/ui/input-otp.cjs +1 -2
  277. package/dist/ui/input-otp.d.cts +6 -6
  278. package/dist/ui/input-otp.d.ts +6 -6
  279. package/dist/ui/input-otp.js +1 -2
  280. package/dist/ui/input.cjs +1 -1
  281. package/dist/ui/input.d.cts +1 -1
  282. package/dist/ui/input.d.ts +1 -1
  283. package/dist/ui/input.js +1 -1
  284. package/dist/ui/inputs/search-input.cjs +1 -1
  285. package/dist/ui/inputs/search-input.d.cts +4 -4
  286. package/dist/ui/inputs/search-input.d.ts +4 -4
  287. package/dist/ui/inputs/search-input.js +1 -1
  288. package/dist/ui/label.cjs +1 -1
  289. package/dist/ui/label.d.cts +3 -3
  290. package/dist/ui/label.d.ts +3 -3
  291. package/dist/ui/menubar.cjs +1 -2
  292. package/dist/ui/menubar.d.cts +18 -18
  293. package/dist/ui/menubar.d.ts +18 -18
  294. package/dist/ui/menubar.js +1 -2
  295. package/dist/ui/multi-select.cjs +1 -2
  296. package/dist/ui/multi-select.d.cts +62 -3
  297. package/dist/ui/multi-select.d.ts +62 -3
  298. package/dist/ui/multi-select.js +1 -2
  299. package/dist/ui/navigation-menu.cjs +1 -2
  300. package/dist/ui/navigation-menu.d.cts +12 -11
  301. package/dist/ui/navigation-menu.d.ts +12 -11
  302. package/dist/ui/navigation-menu.js +1 -2
  303. package/dist/ui/pagination.cjs +1 -2
  304. package/dist/ui/pagination.d.cts +10 -10
  305. package/dist/ui/pagination.d.ts +10 -10
  306. package/dist/ui/pagination.js +1 -2
  307. package/dist/ui/popover.cjs +1 -2
  308. package/dist/ui/popover.d.cts +6 -6
  309. package/dist/ui/popover.d.ts +6 -6
  310. package/dist/ui/popover.js +1 -2
  311. package/dist/ui/progress.cjs +1 -1
  312. package/dist/ui/progress.d.cts +3 -3
  313. package/dist/ui/progress.d.ts +3 -3
  314. package/dist/ui/progress.js +1 -1
  315. package/dist/ui/radio-group.cjs +1 -2
  316. package/dist/ui/radio-group.d.cts +4 -4
  317. package/dist/ui/radio-group.d.ts +4 -4
  318. package/dist/ui/radio-group.js +1 -2
  319. package/dist/ui/resizable.cjs +1 -2
  320. package/dist/ui/resizable.d.cts +5 -5
  321. package/dist/ui/resizable.d.ts +5 -5
  322. package/dist/ui/resizable.js +1 -2
  323. package/dist/ui/scroll-area.cjs +1 -1
  324. package/dist/ui/scroll-area.d.cts +4 -4
  325. package/dist/ui/scroll-area.d.ts +4 -4
  326. package/dist/ui/scroll-area.js +1 -1
  327. package/dist/ui/select.cjs +1 -1
  328. package/dist/ui/select.d.cts +12 -12
  329. package/dist/ui/select.d.ts +12 -12
  330. package/dist/ui/select.js +1 -1
  331. package/dist/ui/separator.cjs +1 -1
  332. package/dist/ui/separator.d.cts +1 -1
  333. package/dist/ui/separator.d.ts +1 -1
  334. package/dist/ui/separator.js +1 -1
  335. package/dist/ui/sheet.cjs +1 -1
  336. package/dist/ui/sheet.d.cts +10 -10
  337. package/dist/ui/sheet.d.ts +10 -10
  338. package/dist/ui/sheet.js +1 -1
  339. package/dist/ui/sidebar.cjs +1 -1
  340. package/dist/ui/sidebar.d.cts +44 -31
  341. package/dist/ui/sidebar.d.ts +44 -31
  342. package/dist/ui/sidebar.js +1 -1
  343. package/dist/ui/skeleton.cjs +1 -1
  344. package/dist/ui/skeleton.d.cts +3 -3
  345. package/dist/ui/skeleton.d.ts +3 -3
  346. package/dist/ui/skeleton.js +1 -1
  347. package/dist/ui/slider.cjs +1 -2
  348. package/dist/ui/slider.d.cts +3 -3
  349. package/dist/ui/slider.d.ts +3 -3
  350. package/dist/ui/slider.js +1 -2
  351. package/dist/ui/sonner.cjs +1 -2
  352. package/dist/ui/sonner.d.cts +4 -3
  353. package/dist/ui/sonner.d.ts +4 -3
  354. package/dist/ui/sonner.js +1 -2
  355. package/dist/ui/switch.cjs +1 -2
  356. package/dist/ui/switch.d.cts +3 -3
  357. package/dist/ui/switch.d.ts +3 -3
  358. package/dist/ui/switch.js +1 -2
  359. package/dist/ui/table.cjs +1 -1
  360. package/dist/ui/table.d.cts +10 -10
  361. package/dist/ui/table.d.ts +10 -10
  362. package/dist/ui/table.js +1 -1
  363. package/dist/ui/tabs.cjs +1 -2
  364. package/dist/ui/tabs.d.cts +6 -6
  365. package/dist/ui/tabs.d.ts +6 -6
  366. package/dist/ui/tabs.js +1 -2
  367. package/dist/ui/textarea.cjs +1 -2
  368. package/dist/ui/textarea.d.cts +3 -3
  369. package/dist/ui/textarea.d.ts +3 -3
  370. package/dist/ui/textarea.js +1 -2
  371. package/dist/ui/toggle-group.cjs +1 -2
  372. package/dist/ui/toggle-group.d.cts +5 -5
  373. package/dist/ui/toggle-group.d.ts +5 -5
  374. package/dist/ui/toggle-group.js +1 -2
  375. package/dist/ui/toggle.cjs +1 -1
  376. package/dist/ui/toggle.d.cts +1 -1
  377. package/dist/ui/toggle.d.ts +1 -1
  378. package/dist/ui/toggle.js +1 -1
  379. package/dist/ui/tooltip.cjs +1 -1
  380. package/dist/ui/tooltip.d.cts +1 -1
  381. package/dist/ui/tooltip.d.ts +1 -1
  382. package/dist/utils-D9AH0PUV.js +1 -2
  383. package/dist/utils-DaJ1XZgX.cjs +1 -0
  384. package/package.json +51 -4
  385. package/packages/components/cards/simple-card.tsx +37 -0
  386. package/packages/components/data-display/country.tsx +59 -0
  387. package/packages/components/data-display/data-list.tsx +38 -0
  388. package/packages/components/data-display/date.tsx +215 -0
  389. package/packages/components/data-display/empty.tsx +25 -0
  390. package/packages/components/data-display/name.tsx +25 -0
  391. package/packages/components/data-display/phone-number.tsx +22 -0
  392. package/packages/components/data-display/role-badge.tsx +33 -0
  393. package/packages/components/data-display/statistic.tsx +141 -0
  394. package/packages/components/dialogs/confirm-dialog.tsx +51 -0
  395. package/packages/components/dialogs/detail-dialog/component/header.tsx +14 -0
  396. package/packages/components/dialogs/detail-dialog/component/main.tsx +39 -0
  397. package/packages/components/dialogs/detail-dialog/component/sidebar.tsx +747 -0
  398. package/packages/components/dialogs/detail-dialog/component/wrapper.tsx +17 -0
  399. package/packages/components/dialogs/detail-dialog/index.tsx +100 -0
  400. package/packages/components/dialogs/error-dialog.tsx +48 -0
  401. package/packages/components/dialogs/form-dialog.tsx +106 -0
  402. package/packages/components/dialogs/loading-dialog.tsx +23 -0
  403. package/packages/components/forms/combobox-field.tsx +113 -0
  404. package/packages/components/forms/date-field.tsx +65 -0
  405. package/packages/components/forms/form-wrapper.tsx +146 -0
  406. package/packages/components/forms/multi-select-field.tsx +56 -0
  407. package/packages/components/forms/number-field.tsx +56 -0
  408. package/packages/components/forms/password-field.tsx +38 -0
  409. package/packages/components/forms/select-field.tsx +58 -0
  410. package/packages/components/forms/switch-field.tsx +42 -0
  411. package/packages/components/forms/text-field.tsx +80 -0
  412. package/packages/components/forms/textarea-field.tsx +53 -0
  413. package/packages/components/index.tsx +0 -0
  414. package/packages/components/layouts/flex.tsx +110 -0
  415. package/packages/components/layouts/main/content.tsx +11 -0
  416. package/packages/components/layouts/main/header.tsx +53 -0
  417. package/packages/components/layouts/main/index.tsx +3 -0
  418. package/packages/components/layouts/main/wrapper.tsx +5 -0
  419. package/packages/components/table/data-table-pagination.tsx +99 -0
  420. package/packages/components/table/data-table.tsx +328 -0
  421. package/packages/components/table/index.tsx +126 -0
  422. package/packages/components/typography/paragraph.tsx +32 -0
  423. package/packages/components/typography/title.tsx +36 -0
  424. package/packages/components/ui/alert-dialog.tsx +173 -0
  425. package/packages/components/ui/alert.tsx +71 -0
  426. package/packages/components/ui/aspect-ratio.tsx +20 -0
  427. package/packages/components/ui/avatar.tsx +52 -0
  428. package/packages/components/ui/badge.tsx +63 -0
  429. package/packages/components/ui/breadcrumb.tsx +110 -0
  430. package/packages/components/ui/button.tsx +88 -0
  431. package/packages/components/ui/buttons/add-new.tsx +26 -0
  432. package/packages/components/ui/buttons/refresh.tsx +30 -0
  433. package/packages/components/ui/calendar.tsx +209 -0
  434. package/packages/components/ui/card.tsx +95 -0
  435. package/packages/components/ui/carousel.tsx +241 -0
  436. package/packages/components/ui/checkbox.tsx +44 -0
  437. package/packages/components/ui/collapsible.tsx +33 -0
  438. package/packages/components/ui/command.tsx +217 -0
  439. package/packages/components/ui/context-menu.tsx +258 -0
  440. package/packages/components/ui/dialog.tsx +174 -0
  441. package/packages/components/ui/dropdown-menu.tsx +318 -0
  442. package/packages/components/ui/file-uploader.tsx +372 -0
  443. package/packages/components/ui/form.tsx +168 -0
  444. package/packages/components/ui/hover-card.tsx +43 -0
  445. package/packages/components/ui/input-otp.tsx +76 -0
  446. package/packages/components/ui/input.tsx +59 -0
  447. package/packages/components/ui/inputs/number-input.tsx +325 -0
  448. package/packages/components/ui/inputs/password-input.tsx +35 -0
  449. package/packages/components/ui/inputs/search-input.tsx +24 -0
  450. package/packages/components/ui/label.tsx +29 -0
  451. package/packages/components/ui/menubar.tsx +275 -0
  452. package/packages/components/ui/multi-select.tsx +693 -0
  453. package/packages/components/ui/navigation-menu.tsx +170 -0
  454. package/packages/components/ui/pagination.tsx +128 -0
  455. package/packages/components/ui/popover.tsx +64 -0
  456. package/packages/components/ui/progress.tsx +30 -0
  457. package/packages/components/ui/radio-group.tsx +53 -0
  458. package/packages/components/ui/resizable.tsx +55 -0
  459. package/packages/components/ui/scroll-area.tsx +51 -0
  460. package/packages/components/ui/select.tsx +246 -0
  461. package/packages/components/ui/separator.tsx +27 -0
  462. package/packages/components/ui/sheet.tsx +155 -0
  463. package/packages/components/ui/sidebar.tsx +751 -0
  464. package/packages/components/ui/skeleton.tsx +15 -0
  465. package/packages/components/ui/slider.tsx +62 -0
  466. package/packages/components/ui/sonner.tsx +43 -0
  467. package/packages/components/ui/switch.tsx +52 -0
  468. package/packages/components/ui/table.tsx +118 -0
  469. package/packages/components/ui/tabs.tsx +85 -0
  470. package/packages/components/ui/textarea.tsx +47 -0
  471. package/packages/components/ui/toggle-group.tsx +72 -0
  472. package/packages/components/ui/toggle.tsx +47 -0
  473. package/packages/components/ui/tooltip.tsx +71 -0
  474. package/packages/constants.tsx +79 -0
  475. package/packages/hooks/use-callback-ref.ts +27 -0
  476. package/packages/hooks/use-controllable-state.ts +67 -0
  477. package/packages/hooks/use-mobile.ts +21 -0
  478. package/packages/index.css +392 -0
  479. package/packages/lib/utils.ts +28 -0
  480. package/packages/types.ts +50 -0
  481. package/dist/add-new-BaABbnol.js.map +0 -1
  482. package/dist/add-new-DUoS_-n2.cjs.map +0 -1
  483. package/dist/alert-dialog-0KwdjY-6.js.map +0 -1
  484. package/dist/alert-dialog-D5ZqgIiC.cjs.map +0 -1
  485. package/dist/badge-CRXT2dH_.cjs.map +0 -1
  486. package/dist/badge-D_qEoSL8.js.map +0 -1
  487. package/dist/button-Bku3bKv9.js.map +0 -1
  488. package/dist/button-D_E_bNRb.d.ts +0 -18
  489. package/dist/button-Dzv_nos1.cjs.map +0 -1
  490. package/dist/button-YHI7I64h.d.cts +0 -18
  491. package/dist/card-D8cxRC5y.js.map +0 -1
  492. package/dist/card-Dta5eW8u.cjs.map +0 -1
  493. package/dist/cards/simple-card.cjs.map +0 -1
  494. package/dist/cards/simple-card.js.map +0 -1
  495. package/dist/chunk-CUT6urMc.cjs +0 -1
  496. package/dist/command-CsntVmEz.cjs.map +0 -1
  497. package/dist/command-_L9bD9a-.js.map +0 -1
  498. package/dist/data-display/country.cjs.map +0 -1
  499. package/dist/data-display/country.js.map +0 -1
  500. package/dist/data-display/data-list.cjs.map +0 -1
  501. package/dist/data-display/data-list.js.map +0 -1
  502. package/dist/data-display/empty.cjs.map +0 -1
  503. package/dist/data-display/empty.js.map +0 -1
  504. package/dist/data-display/name.cjs.map +0 -1
  505. package/dist/data-display/name.js.map +0 -1
  506. package/dist/data-display/phone-number.cjs.map +0 -1
  507. package/dist/data-display/phone-number.js.map +0 -1
  508. package/dist/data-display/role-badge.cjs.map +0 -1
  509. package/dist/data-display/role-badge.js.map +0 -1
  510. package/dist/data-display/statistic.cjs.map +0 -1
  511. package/dist/data-display/statistic.js.map +0 -1
  512. package/dist/date-BMq_DNsv.js.map +0 -1
  513. package/dist/date-nd8WkPlx.cjs.map +0 -1
  514. package/dist/dialog-C4hf-Puw.js.map +0 -1
  515. package/dist/dialog-W-DmDMEE.cjs.map +0 -1
  516. package/dist/dialogs/confirm-dialog.cjs.map +0 -1
  517. package/dist/dialogs/confirm-dialog.js.map +0 -1
  518. package/dist/dialogs/detail-dialog/index.cjs.map +0 -1
  519. package/dist/dialogs/detail-dialog/index.js.map +0 -1
  520. package/dist/dialogs/form-dialog.cjs.map +0 -1
  521. package/dist/dialogs/form-dialog.js.map +0 -1
  522. package/dist/dialogs/loading-dialog.cjs.map +0 -1
  523. package/dist/dialogs/loading-dialog.js.map +0 -1
  524. package/dist/dropdown-menu-Bv18S56o.cjs.map +0 -1
  525. package/dist/dropdown-menu-jCQwh2rG.js.map +0 -1
  526. package/dist/error-dialog-D_4WL-Hj.js.map +0 -1
  527. package/dist/error-dialog-DpQgL5Hy.cjs.map +0 -1
  528. package/dist/flex-CNA_SId-.cjs.map +0 -1
  529. package/dist/flex-ILvQrYMJ.js.map +0 -1
  530. package/dist/form-CA4hhSV5.js.map +0 -1
  531. package/dist/form-CYZkgobJ.cjs.map +0 -1
  532. package/dist/form-wrapper-BYbwt1zC.cjs.map +0 -1
  533. package/dist/form-wrapper-D-2Uz518.js.map +0 -1
  534. package/dist/input-DXEBB91E.cjs.map +0 -1
  535. package/dist/input-FzKbxUq2.js.map +0 -1
  536. package/dist/label-CunjD1rx.cjs.map +0 -1
  537. package/dist/label-Cxbctr6x.js.map +0 -1
  538. package/dist/layouts/main/index.cjs.map +0 -1
  539. package/dist/layouts/main/index.js.map +0 -1
  540. package/dist/paragraph-Bey03JkA.js.map +0 -1
  541. package/dist/paragraph-ZxI8zxuf.cjs.map +0 -1
  542. package/dist/progress-BnnOfAZN.cjs.map +0 -1
  543. package/dist/progress-CBccqUUJ.js.map +0 -1
  544. package/dist/refresh-BHt_h3N_.js.map +0 -1
  545. package/dist/refresh-DrolZxuC.cjs.map +0 -1
  546. package/dist/scroll-area-Bdb_LSFF.js.map +0 -1
  547. package/dist/scroll-area-DWWpaz5j.cjs.map +0 -1
  548. package/dist/search-input-Bf4-FeWu.cjs.map +0 -1
  549. package/dist/search-input-L2sq0eB0.js.map +0 -1
  550. package/dist/select-CWUsisI0.js.map +0 -1
  551. package/dist/select-ZSyt5zCe.cjs.map +0 -1
  552. package/dist/separator-BpsL0PlX.js.map +0 -1
  553. package/dist/separator-DTB3sDNG.cjs.map +0 -1
  554. package/dist/sheet-C8r2QGpq.js.map +0 -1
  555. package/dist/sheet-CCwbAaA6.cjs.map +0 -1
  556. package/dist/sidebar-BLPMNltJ.cjs.map +0 -1
  557. package/dist/sidebar-C166f_9B.js.map +0 -1
  558. package/dist/skeleton-DYmX0k94.js.map +0 -1
  559. package/dist/skeleton-m3giaF4T.cjs +0 -2
  560. package/dist/skeleton-m3giaF4T.cjs.map +0 -1
  561. package/dist/table/index.cjs.map +0 -1
  562. package/dist/table/index.js.map +0 -1
  563. package/dist/table-BSeev7T0.cjs.map +0 -1
  564. package/dist/table-BvA64mE8.js.map +0 -1
  565. package/dist/title-DTkABsIG.js.map +0 -1
  566. package/dist/title-xsPZpQpb.cjs.map +0 -1
  567. package/dist/toggle-BVkMTVAz.d.ts +0 -15
  568. package/dist/toggle-CW-ZnYMy.d.cts +0 -15
  569. package/dist/toggle-CfL3GVe2.cjs.map +0 -1
  570. package/dist/toggle-D_MDMruK.js.map +0 -1
  571. package/dist/tooltip-Beb-_EPp.cjs.map +0 -1
  572. package/dist/tooltip-Dzyf5smh.js.map +0 -1
  573. package/dist/types-CrbWxjnp.cjs.map +0 -1
  574. package/dist/types-DaIHddx7.js.map +0 -1
  575. package/dist/ui/alert.cjs.map +0 -1
  576. package/dist/ui/alert.js.map +0 -1
  577. package/dist/ui/aspect-ratio.cjs.map +0 -1
  578. package/dist/ui/aspect-ratio.js.map +0 -1
  579. package/dist/ui/avatar.cjs.map +0 -1
  580. package/dist/ui/avatar.js.map +0 -1
  581. package/dist/ui/breadcrumb.cjs.map +0 -1
  582. package/dist/ui/breadcrumb.js.map +0 -1
  583. package/dist/ui/calendar.cjs.map +0 -1
  584. package/dist/ui/calendar.js.map +0 -1
  585. package/dist/ui/carousel.cjs.map +0 -1
  586. package/dist/ui/carousel.js.map +0 -1
  587. package/dist/ui/collapsible.cjs.map +0 -1
  588. package/dist/ui/collapsible.js.map +0 -1
  589. package/dist/ui/context-menu.cjs.map +0 -1
  590. package/dist/ui/context-menu.js.map +0 -1
  591. package/dist/ui/file-uploader.cjs.map +0 -1
  592. package/dist/ui/file-uploader.js.map +0 -1
  593. package/dist/ui/hover-card.cjs.map +0 -1
  594. package/dist/ui/hover-card.js.map +0 -1
  595. package/dist/ui/input-otp.cjs.map +0 -1
  596. package/dist/ui/input-otp.js.map +0 -1
  597. package/dist/ui/menubar.cjs.map +0 -1
  598. package/dist/ui/menubar.js.map +0 -1
  599. package/dist/ui/multi-select.cjs.map +0 -1
  600. package/dist/ui/multi-select.js.map +0 -1
  601. package/dist/ui/navigation-menu.cjs.map +0 -1
  602. package/dist/ui/navigation-menu.js.map +0 -1
  603. package/dist/ui/pagination.cjs.map +0 -1
  604. package/dist/ui/pagination.js.map +0 -1
  605. package/dist/ui/popover.cjs.map +0 -1
  606. package/dist/ui/popover.js.map +0 -1
  607. package/dist/ui/radio-group.cjs.map +0 -1
  608. package/dist/ui/radio-group.js.map +0 -1
  609. package/dist/ui/resizable.cjs.map +0 -1
  610. package/dist/ui/resizable.js.map +0 -1
  611. package/dist/ui/slider.cjs.map +0 -1
  612. package/dist/ui/slider.js.map +0 -1
  613. package/dist/ui/sonner.cjs.map +0 -1
  614. package/dist/ui/sonner.js.map +0 -1
  615. package/dist/ui/switch.cjs.map +0 -1
  616. package/dist/ui/switch.js.map +0 -1
  617. package/dist/ui/tabs.cjs.map +0 -1
  618. package/dist/ui/tabs.js.map +0 -1
  619. package/dist/ui/textarea.cjs.map +0 -1
  620. package/dist/ui/textarea.js.map +0 -1
  621. package/dist/ui/toggle-group.cjs.map +0 -1
  622. package/dist/ui/toggle-group.js.map +0 -1
  623. package/dist/utils-BsjVK5EW.cjs +0 -2
  624. package/dist/utils-BsjVK5EW.cjs.map +0 -1
  625. package/dist/utils-D9AH0PUV.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ "use client";
2
+ import React from "react";
3
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
4
+ import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
5
+
6
+ import { cn } from "@/lib/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 (
18
+ <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
19
+ );
20
+ }
21
+
22
+ function DropdownMenuTrigger({
23
+ ...props
24
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
25
+ return (
26
+ <DropdownMenuPrimitive.Trigger
27
+ data-slot="dropdown-menu-trigger"
28
+ {...props}
29
+ />
30
+ );
31
+ }
32
+
33
+ function DropdownMenuContent({
34
+ className,
35
+ sideOffset = 4,
36
+ align = "start",
37
+ ...props
38
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
39
+ return (
40
+ <DropdownMenuPrimitive.Portal>
41
+ <DropdownMenuPrimitive.Content
42
+ data-slot="dropdown-menu-content"
43
+ sideOffset={sideOffset}
44
+ className={cn(
45
+ "bg-popover text-popover-foreground",
46
+ "z-50",
47
+ "min-w-32",
48
+ "overflow-x-hidden overflow-y-auto",
49
+ "rounded-md border p-1.5 shadow-md",
50
+ "max-h-(--radix-dropdown-menu-content-available-height)",
51
+ "origin-(--radix-dropdown-menu-content-transform-origin)",
52
+ "data-[state=open]:animate-in",
53
+ "data-[state=open]:fade-in-0",
54
+ "data-[state=open]:zoom-in-95",
55
+ "data-[state=closed]:animate-out",
56
+ "data-[state=closed]:fade-out-0",
57
+ "data-[state=closed]:zoom-out-95",
58
+ "data-[side=bottom]:slide-in-from-top-2",
59
+ "data-[side=left]:slide-in-from-right-2",
60
+ "data-[side=right]:slide-in-from-left-2",
61
+ "data-[side=top]:slide-in-from-bottom-2",
62
+ className,
63
+ )}
64
+ {...props}
65
+ align={align}
66
+ />
67
+ </DropdownMenuPrimitive.Portal>
68
+ );
69
+ }
70
+
71
+ function DropdownMenuGroup({
72
+ ...props
73
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
74
+ return (
75
+ <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
76
+ );
77
+ }
78
+
79
+ function DropdownMenuItem({
80
+ className,
81
+ inset,
82
+ variant = "default",
83
+ ...props
84
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
85
+ inset?: boolean;
86
+ variant?: "default" | "destructive";
87
+ }) {
88
+ return (
89
+ <DropdownMenuPrimitive.Item
90
+ data-slot="dropdown-menu-item"
91
+ data-inset={inset}
92
+ data-variant={variant}
93
+ className={cn(
94
+ "relative flex cursor-pointer items-center gap-2 rounded-md px-2 py-2.5 text-sm outline-hidden transition-all select-none",
95
+ "focus:bg-accent/70",
96
+ "focus:text-accent-foreground",
97
+ "dark:data-[variant=destructive]:focus:bg-destructive/20",
98
+ "data-[inset]:pl-8",
99
+ "data-[disabled]:pointer-events-none",
100
+ "data-[disabled]:opacity-50",
101
+ "data-[variant=destructive]:text-destructive",
102
+ "data-[variant=destructive]:focus:bg-destructive/10",
103
+ "data-[variant=destructive]:focus:text-destructive",
104
+ "data-[variant=destructive]:*:[svg]:!text-destructive",
105
+ "[&_svg]:shrink-0",
106
+ "[&_svg]:pointer-events-none",
107
+ "[&_svg:not([class*='size-'])]:size-4",
108
+ "[&_svg:not([class*='text-'])]:text-muted-foreground",
109
+ className,
110
+ )}
111
+ {...props}
112
+ />
113
+ );
114
+ }
115
+
116
+ function DropdownMenuCheckboxItem({
117
+ className,
118
+ children,
119
+ checked,
120
+ ...props
121
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
122
+ return (
123
+ <DropdownMenuPrimitive.CheckboxItem
124
+ data-slot="dropdown-menu-checkbox-item"
125
+ className={cn(
126
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none",
127
+ "focus:bg-accent",
128
+ "focus:text-accent-foreground",
129
+ "data-[disabled]:opacity-50",
130
+ "data-[disabled]:pointer-events-none",
131
+ "[&_svg]:pointer-events-none",
132
+ "[&_svg]:shrink-0",
133
+ "[&_svg:not([class*='size-'])]:size-4",
134
+ className,
135
+ )}
136
+ checked={checked}
137
+ {...props}
138
+ >
139
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
140
+ <DropdownMenuPrimitive.ItemIndicator>
141
+ <CheckIcon size={16} />
142
+ </DropdownMenuPrimitive.ItemIndicator>
143
+ </span>
144
+ {children}
145
+ </DropdownMenuPrimitive.CheckboxItem>
146
+ );
147
+ }
148
+
149
+ function DropdownMenuRadioGroup({
150
+ ...props
151
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
152
+ return (
153
+ <DropdownMenuPrimitive.RadioGroup
154
+ data-slot="dropdown-menu-radio-group"
155
+ {...props}
156
+ />
157
+ );
158
+ }
159
+
160
+ function DropdownMenuRadioItem({
161
+ className,
162
+ children,
163
+ ...props
164
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
165
+ return (
166
+ <DropdownMenuPrimitive.RadioItem
167
+ data-slot="dropdown-menu-radio-item"
168
+ className={cn(
169
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none",
170
+ "focus:bg-accent",
171
+ "focus:text-accent-foreground",
172
+ "data-[disabled]:pointer-events-none",
173
+ "data-[disabled]:opacity-50",
174
+ "[&_svg]:pointer-events-none",
175
+ "[&_svg]:shrink-0",
176
+ "[&_svg:not([class*='size-'])]:size-4",
177
+ className,
178
+ )}
179
+ {...props}
180
+ >
181
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
182
+ <DropdownMenuPrimitive.ItemIndicator>
183
+ <CircleIcon className="size-2 fill-current" />
184
+ </DropdownMenuPrimitive.ItemIndicator>
185
+ </span>
186
+ {children}
187
+ </DropdownMenuPrimitive.RadioItem>
188
+ );
189
+ }
190
+
191
+ function DropdownMenuLabel({
192
+ className,
193
+ inset,
194
+ ...props
195
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
196
+ inset?: boolean;
197
+ }) {
198
+ return (
199
+ <DropdownMenuPrimitive.Label
200
+ data-slot="dropdown-menu-label"
201
+ data-inset={inset}
202
+ className={cn(
203
+ "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
204
+ className,
205
+ )}
206
+ {...props}
207
+ />
208
+ );
209
+ }
210
+
211
+ function DropdownMenuSeparator({
212
+ className,
213
+ ...props
214
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
215
+ return (
216
+ <DropdownMenuPrimitive.Separator
217
+ data-slot="dropdown-menu-separator"
218
+ className={cn("bg-border -mx-1 my-1 h-px", className)}
219
+ {...props}
220
+ />
221
+ );
222
+ }
223
+
224
+ function DropdownMenuShortcut({
225
+ className,
226
+ ...props
227
+ }: React.ComponentProps<"span">) {
228
+ return (
229
+ <span
230
+ data-slot="dropdown-menu-shortcut"
231
+ className={cn(
232
+ "text-muted-foreground ml-auto text-xs tracking-widest",
233
+ className,
234
+ )}
235
+ {...props}
236
+ />
237
+ );
238
+ }
239
+
240
+ function DropdownMenuSub({
241
+ ...props
242
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
243
+ return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />;
244
+ }
245
+
246
+ function DropdownMenuSubTrigger({
247
+ className,
248
+ inset,
249
+ children,
250
+ ...props
251
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
252
+ inset?: boolean;
253
+ }) {
254
+ return (
255
+ <DropdownMenuPrimitive.SubTrigger
256
+ data-slot="dropdown-menu-sub-trigger"
257
+ data-inset={inset}
258
+ className={cn(
259
+ "flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none",
260
+ "focus:bg-accent",
261
+ "focus:text-accent-foreground",
262
+ "data-[state=open]:bg-accent",
263
+ "data-[state=open]:text-accent-foreground",
264
+ "data-[inset]:pl-8",
265
+ className,
266
+ )}
267
+ {...props}
268
+ >
269
+ {children}
270
+ <ChevronRightIcon className="ml-auto size-4" />
271
+ </DropdownMenuPrimitive.SubTrigger>
272
+ );
273
+ }
274
+
275
+ function DropdownMenuSubContent({
276
+ className,
277
+ ...props
278
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
279
+ return (
280
+ <DropdownMenuPrimitive.SubContent
281
+ data-slot="dropdown-menu-sub-content"
282
+ className={cn(
283
+ "bg-popover text-popover-foreground",
284
+ "z-50 min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
285
+ "data-[state=open]:animate-in",
286
+ "data-[state=closed]:animate-out",
287
+ "data-[state=closed]:fade-out-0",
288
+ "data-[state=open]:fade-in-0",
289
+ "data-[state=closed]:zoom-out-95",
290
+ "data-[state=open]:zoom-in-95",
291
+ "data-[side=bottom]:slide-in-from-top-2",
292
+ "data-[side=left]:slide-in-from-right-2",
293
+ "data-[side=right]:slide-in-from-left-2",
294
+ "data-[side=top]:slide-in-from-bottom-2",
295
+ className,
296
+ )}
297
+ {...props}
298
+ />
299
+ );
300
+ }
301
+
302
+ export {
303
+ DropdownMenu,
304
+ DropdownMenuCheckboxItem,
305
+ DropdownMenuContent,
306
+ DropdownMenuGroup,
307
+ DropdownMenuItem,
308
+ DropdownMenuLabel,
309
+ DropdownMenuPortal,
310
+ DropdownMenuRadioGroup,
311
+ DropdownMenuRadioItem,
312
+ DropdownMenuSeparator,
313
+ DropdownMenuShortcut,
314
+ DropdownMenuSub,
315
+ DropdownMenuSubContent,
316
+ DropdownMenuSubTrigger,
317
+ DropdownMenuTrigger,
318
+ };
@@ -0,0 +1,372 @@
1
+ "use client";
2
+ import React from "react";
3
+ import { FileText, Image, Trash2, Upload } from "lucide-react";
4
+ import Dropzone, {
5
+ type DropzoneProps,
6
+ type FileRejection,
7
+ } from "react-dropzone";
8
+ import { toast } from "sonner";
9
+
10
+ import { Button } from "@/components/ui/button";
11
+ import { Progress } from "@/components/ui/progress";
12
+ import { useControllableState } from "@/hooks/use-controllable-state";
13
+ import { cn, formatBytes } from "@/lib/utils";
14
+
15
+ interface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {
16
+ /**
17
+ * Value of the uploader.
18
+ * @type File[]
19
+ * @default undefined
20
+ * @example value={files}
21
+ */
22
+ value?: File[];
23
+
24
+ /**
25
+ * Function to be called when the value changes.
26
+ * @type (files: File[]) => void
27
+ * @default undefined
28
+ * @example onValueChange={(files) => setFiles(files)}
29
+ */
30
+ onValueChange?: (files: File[]) => void;
31
+
32
+ /**
33
+ * Function to be called when files are uploaded.
34
+ * @type (files: File[]) => Promise<void>
35
+ * @default undefined
36
+ * @example onUpload={(files) => uploadFiles(files)}
37
+ */
38
+ onUpload?: (files: File[]) => Promise<void>;
39
+
40
+ /**
41
+ * Progress of the uploaded files.
42
+ * @type Record<string, number> | undefined
43
+ * @default undefined
44
+ * @example progresses={{ "file1.png": 50 }}
45
+ */
46
+ progresses?: Record<string, number>;
47
+
48
+ /**
49
+ * Accepted file types for the uploader.
50
+ * @type { [key: string]: string[]}
51
+ * @default
52
+ * ```ts
53
+ * { "image/*": [] }
54
+ * ```
55
+ * @example accept={["image/png", "image/jpeg"]}
56
+ */
57
+ accept?: DropzoneProps["accept"];
58
+
59
+ /**
60
+ * Maximum file size for the uploader.
61
+ * @type number | undefined
62
+ * @default 1024 * 1024 * 2 // 2MB
63
+ * @example maxSize={1024 * 1024 * 2} // 2MB
64
+ */
65
+ maxSize?: DropzoneProps["maxSize"];
66
+
67
+ /**
68
+ * Maximum number of files for the uploader.
69
+ * @type number | undefined
70
+ * @default 1
71
+ * @example maxFileCount={4}
72
+ */
73
+ maxFileCount?: DropzoneProps["maxFiles"];
74
+
75
+ /**
76
+ * Whether the uploader should accept multiple files.
77
+ * @type boolean
78
+ * @default false
79
+ * @example multiple
80
+ */
81
+ multiple?: boolean;
82
+
83
+ /**
84
+ * Whether the uploader is disabled.
85
+ * @type boolean
86
+ * @default false
87
+ * @example disabled
88
+ */
89
+ disabled?: boolean;
90
+
91
+ showText?: boolean;
92
+ iconSize?: number;
93
+ }
94
+
95
+ export function FileUploader(props: FileUploaderProps) {
96
+ const {
97
+ value: valueProp,
98
+ onValueChange,
99
+ onUpload,
100
+ progresses,
101
+ accept = {
102
+ "image/*": [],
103
+ },
104
+ maxSize = 1024 * 1024 * 2,
105
+ maxFileCount = 1,
106
+ multiple = false,
107
+ disabled = false,
108
+ showText = true,
109
+ iconSize,
110
+ className,
111
+ ...dropzoneProps
112
+ } = props;
113
+
114
+ const [files, setFiles] = useControllableState({
115
+ prop: valueProp,
116
+ onChange: onValueChange,
117
+ });
118
+
119
+ const onDrop = React.useCallback(
120
+ (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {
121
+ if (!multiple && maxFileCount === 1 && acceptedFiles.length > 1) {
122
+ toast.error("Cannot upload more than 1 file at a time");
123
+
124
+ return;
125
+ }
126
+
127
+ if ((files?.length ?? 0) + acceptedFiles.length > maxFileCount) {
128
+ toast.error(`Cannot upload more than ${maxFileCount} files`);
129
+ return;
130
+ }
131
+
132
+ const newFiles = acceptedFiles.map((file) =>
133
+ Object.assign(file, {
134
+ preview: URL.createObjectURL(file),
135
+ }),
136
+ );
137
+
138
+ const updatedFiles = files ? [...files, ...newFiles] : newFiles;
139
+
140
+ setFiles(updatedFiles);
141
+
142
+ if (rejectedFiles.length > 0) {
143
+ rejectedFiles.forEach(({ file }) => {
144
+ toast.error(`File ${file.name} was rejected`);
145
+ });
146
+ }
147
+
148
+ if (
149
+ onUpload &&
150
+ updatedFiles.length > 0 &&
151
+ updatedFiles.length <= maxFileCount
152
+ ) {
153
+ const target =
154
+ updatedFiles.length > 0 ? `${updatedFiles.length} files` : `file`;
155
+
156
+ onUpload(updatedFiles).then(() => {
157
+ setFiles([]);
158
+ toast(`${target} uploaded`);
159
+ });
160
+ }
161
+ },
162
+
163
+ [files, maxFileCount, multiple, onUpload, setFiles],
164
+ );
165
+
166
+ function onRemove(index: number) {
167
+ if (!files) return;
168
+
169
+ if (isFileWithPreview(files[index])) {
170
+ URL.revokeObjectURL(files[index].preview);
171
+ }
172
+
173
+ const newFiles = files.filter((_, i) => i !== index);
174
+ setFiles(newFiles);
175
+ onValueChange?.(newFiles);
176
+ }
177
+
178
+ // Revoke preview url when component unmounts
179
+ React.useEffect(() => {
180
+ return () => {
181
+ if (!files) return;
182
+ files.forEach((file) => {
183
+ if (isFileWithPreview(file)) {
184
+ URL.revokeObjectURL(file.preview);
185
+ }
186
+ });
187
+ };
188
+ // eslint-disable-next-line react-hooks/exhaustive-deps
189
+ }, []);
190
+
191
+ const isDisabled = disabled || (files?.length ?? 0) >= maxFileCount;
192
+
193
+ return (
194
+ <div className="relative flex w-full flex-col gap-6">
195
+ <Dropzone
196
+ onDrop={onDrop}
197
+ accept={accept}
198
+ maxSize={maxSize}
199
+ maxFiles={maxFileCount}
200
+ multiple={maxFileCount > 1 || multiple}
201
+ disabled={isDisabled}
202
+ >
203
+ {({ getRootProps, getInputProps, isDragActive }) => (
204
+ <div
205
+ {...getRootProps()}
206
+ className={cn(
207
+ "group",
208
+ "border-muted-foreground/25",
209
+ "hover:bg-muted/25",
210
+ "relative grid h-52 w-full cursor-pointer place-items-center rounded-lg border-2 border-dashed px-5 py-2.5 text-center transition",
211
+ "ring-offset-background",
212
+ "focus-visible:ring-ring",
213
+ "focus-visible:ring-2",
214
+ "focus-visible:ring-offset-2",
215
+ "focus-visible:outline-hidden",
216
+ isDragActive && "border-muted-foreground/50",
217
+ isDisabled && "pointer-events-none opacity-60",
218
+ className,
219
+ )}
220
+ {...dropzoneProps}
221
+ >
222
+ <input {...getInputProps()} />
223
+ {isDragActive ? (
224
+ <div className="flex flex-col items-center justify-center gap-4 sm:px-5">
225
+ <div className="rounded-full border border-dashed p-3">
226
+ <Upload
227
+ className="text-muted-foreground size-7"
228
+ aria-hidden="true"
229
+ />
230
+ </div>
231
+ <p className="text-muted-foreground font-medium">
232
+ Drop the files here
233
+ </p>
234
+ </div>
235
+ ) : (
236
+ <div className="flex flex-col items-center justify-center gap-4 sm:px-5">
237
+ <div className="rounded-full border border-dashed p-3">
238
+ <Upload
239
+ size={iconSize || 24}
240
+ className="text-muted-foreground"
241
+ aria-hidden="true"
242
+ />
243
+ </div>
244
+ {showText && (
245
+ <div className="flex flex-col gap-px">
246
+ <p className="text-muted-foreground text-xs font-medium">
247
+ Drag {`'n'`} drop files here, or click to select files
248
+ </p>
249
+ <p className="text-muted-foreground/70 text-xs">
250
+ You can upload
251
+ {maxFileCount > 1
252
+ ? ` ${maxFileCount === Infinity ? "multiple" : maxFileCount}
253
+ files (up to ${formatBytes(maxSize)} each)`
254
+ : ` a file with ${formatBytes(maxSize)}`}
255
+ </p>
256
+ </div>
257
+ )}
258
+ </div>
259
+ )}
260
+ </div>
261
+ )}
262
+ </Dropzone>
263
+ {files?.length ? (
264
+ <div className="h-fit w-full overflow-y-auto">
265
+ <div className="flex items-center justify-between px-3 py-2.5">
266
+ <div className="flex items-center gap-1">
267
+ <Image
268
+ className="text-muted-foreground size-4"
269
+ aria-hidden="true"
270
+ />
271
+ <p className="text-sm">Ảnh đã tải lên ({files.length})</p>
272
+ </div>
273
+ <button
274
+ className="hover:text-muted-foreground text-muted-foreground/60 flex cursor-pointer items-center gap-1 transition-colors duration-200"
275
+ onClick={() => {
276
+ if (!files) return;
277
+ files.forEach((file) => {
278
+ if (!isFileWithPreview(file)) return;
279
+ URL.revokeObjectURL(file.preview);
280
+ });
281
+ setFiles([]);
282
+ onValueChange?.([]);
283
+ }}
284
+ >
285
+ <Trash2 size={16} aria-hidden="true" />
286
+ <p className="text-sm">Xóa tất cả</p>
287
+ </button>
288
+ </div>
289
+ <div className="flex flex-col gap-2.5">
290
+ {files?.map((file, index) => (
291
+ <FileCard
292
+ key={index}
293
+ file={file}
294
+ onRemove={() => onRemove(index)}
295
+ progress={progresses?.[file.name]}
296
+ />
297
+ ))}
298
+ </div>
299
+ </div>
300
+ ) : null}
301
+ </div>
302
+ );
303
+ }
304
+
305
+ interface FileCardProps {
306
+ file: File;
307
+ onRemove: () => void;
308
+ progress?: number;
309
+ }
310
+
311
+ function FileCard({ file, progress, onRemove }: FileCardProps) {
312
+ return (
313
+ <div className="border-border/40 hover:border-border relative flex items-center gap-4 rounded-md border py-2 pr-3 pl-2 shadow-xs">
314
+ <div className="flex flex-1 gap-2.5">
315
+ {isFileWithPreview(file) ? <FilePreview file={file} /> : null}
316
+ <div className="flex w-full flex-col gap-2">
317
+ <div className="flex flex-col gap-y-0.5">
318
+ <p className="text-accent-foreground line-clamp-1 text-sm">
319
+ {file.name}
320
+ </p>
321
+ <p className="text-muted-foreground text-xs">
322
+ {formatBytes(file.size)}
323
+ </p>
324
+ </div>
325
+ {progress ? <Progress value={progress} /> : null}
326
+ </div>
327
+ </div>
328
+ <div className="flex items-center gap-2">
329
+ <Button
330
+ type="button"
331
+ variant="ghost"
332
+ size="icon"
333
+ className="size-7"
334
+ onClick={onRemove}
335
+ >
336
+ <Trash2
337
+ size={16}
338
+ className="text-muted-foreground/60"
339
+ aria-hidden="true"
340
+ />
341
+ <span className="sr-only">Remove file</span>
342
+ </Button>
343
+ </div>
344
+ </div>
345
+ );
346
+ }
347
+
348
+ function isFileWithPreview(file: File): file is File & { preview: string } {
349
+ return "preview" in file && typeof file.preview === "string";
350
+ }
351
+
352
+ interface FilePreviewProps {
353
+ file: File & { preview: string };
354
+ }
355
+
356
+ function FilePreview({ file }: FilePreviewProps) {
357
+ if (file.type.startsWith("image/")) {
358
+ return (
359
+ <img
360
+ src={file.preview}
361
+ className="border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm"
362
+ />
363
+ );
364
+ }
365
+
366
+ return (
367
+ <FileText
368
+ className="text-muted-foreground size-10 border"
369
+ aria-hidden="true"
370
+ />
371
+ );
372
+ }