@customafk/lunas-ui 0.0.7 → 0.0.9

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 (584) hide show
  1. package/dist/{add-new-BaABbnol.js → add-new-BaTjxsdU.js} +1 -1
  2. package/dist/{add-new-BaABbnol.js.map → add-new-BaTjxsdU.js.map} +1 -1
  3. package/dist/{add-new-DUoS_-n2.cjs → add-new-aIL8RwI8.cjs} +2 -2
  4. package/dist/{add-new-DUoS_-n2.cjs.map → add-new-aIL8RwI8.cjs.map} +1 -1
  5. package/dist/alert-dialog-0KwdjY-6.js.map +1 -1
  6. package/dist/{alert-dialog-D5ZqgIiC.cjs → alert-dialog-BQv-ZvW9.cjs} +2 -2
  7. package/dist/{alert-dialog-D5ZqgIiC.cjs.map → alert-dialog-BQv-ZvW9.cjs.map} +1 -1
  8. package/dist/badge-D_qEoSL8.js.map +1 -1
  9. package/dist/{badge-CRXT2dH_.cjs → badge-DfSj5nwV.cjs} +2 -2
  10. package/dist/{badge-CRXT2dH_.cjs.map → badge-DfSj5nwV.cjs.map} +1 -1
  11. package/dist/button-Bku3bKv9.js.map +1 -1
  12. package/dist/button-Blg2XhHo.d.ts +23 -0
  13. package/dist/{button-Dzv_nos1.cjs → button-CycE0WzB.cjs} +2 -2
  14. package/dist/{button-Dzv_nos1.cjs.map → button-CycE0WzB.cjs.map} +1 -1
  15. package/dist/button-DThtZ8g0.d.cts +23 -0
  16. package/dist/calendar-5D53vIAn.js +2 -0
  17. package/dist/calendar-5D53vIAn.js.map +1 -0
  18. package/dist/calendar-CPFb8F_s.cjs +2 -0
  19. package/dist/calendar-CPFb8F_s.cjs.map +1 -0
  20. package/dist/{card-Dta5eW8u.cjs → card-D7C05tvk.cjs} +2 -2
  21. package/dist/{card-Dta5eW8u.cjs.map → card-D7C05tvk.cjs.map} +1 -1
  22. package/dist/card-D8cxRC5y.js.map +1 -1
  23. package/dist/cards/simple-card.cjs +1 -1
  24. package/dist/cards/simple-card.cjs.map +1 -1
  25. package/dist/cards/simple-card.d.cts +2 -1
  26. package/dist/cards/simple-card.d.ts +2 -1
  27. package/dist/cards/simple-card.js.map +1 -1
  28. package/dist/chunk-hhQzssFb.cjs +1 -0
  29. package/dist/command-ByvjNMyq.d.cts +53 -0
  30. package/dist/{command-CsntVmEz.cjs → command-D8k85t1c.cjs} +2 -2
  31. package/dist/{command-CsntVmEz.cjs.map → command-D8k85t1c.cjs.map} +1 -1
  32. package/dist/command-DXhsKiMq.d.ts +53 -0
  33. package/dist/{command-_L9bD9a-.js → command-DieInaEN.js} +1 -1
  34. package/dist/{command-_L9bD9a-.js.map → command-DieInaEN.js.map} +1 -1
  35. package/dist/data-display/country.cjs +1 -1
  36. package/dist/data-display/country.cjs.map +1 -1
  37. package/dist/data-display/country.d.ts +1 -1
  38. package/dist/data-display/country.js.map +1 -1
  39. package/dist/data-display/data-list.cjs +1 -1
  40. package/dist/data-display/data-list.cjs.map +1 -1
  41. package/dist/data-display/data-list.js.map +1 -1
  42. package/dist/data-display/date.cjs +1 -1
  43. package/dist/data-display/empty.cjs +1 -1
  44. package/dist/data-display/empty.d.cts +3 -1
  45. package/dist/data-display/empty.d.ts +3 -1
  46. package/dist/data-display/name.cjs +1 -1
  47. package/dist/data-display/name.cjs.map +1 -1
  48. package/dist/data-display/name.js.map +1 -1
  49. package/dist/data-display/phone-number.cjs +1 -1
  50. package/dist/data-display/phone-number.cjs.map +1 -1
  51. package/dist/data-display/phone-number.js.map +1 -1
  52. package/dist/data-display/role-badge.cjs +1 -1
  53. package/dist/data-display/role-badge.cjs.map +1 -1
  54. package/dist/data-display/role-badge.d.ts +1 -1
  55. package/dist/data-display/role-badge.js.map +1 -1
  56. package/dist/data-display/statistic.cjs +1 -1
  57. package/dist/data-display/statistic.cjs.map +1 -1
  58. package/dist/data-display/statistic.d.cts +25 -1
  59. package/dist/data-display/statistic.d.ts +25 -1
  60. package/dist/data-display/statistic.js +1 -1
  61. package/dist/data-display/statistic.js.map +1 -1
  62. package/dist/date-BMq_DNsv.js.map +1 -1
  63. package/dist/{date-nd8WkPlx.cjs → date-ByLOGsKl.cjs} +2 -2
  64. package/dist/{date-nd8WkPlx.cjs.map → date-ByLOGsKl.cjs.map} +1 -1
  65. package/dist/{dialog-MLCAvDJH.d.ts → dialog-B3V9xxdD.d.cts} +12 -11
  66. package/dist/dialog-C4hf-Puw.js.map +1 -1
  67. package/dist/{dialog-W-DmDMEE.cjs → dialog-Cn8cFeu-.cjs} +2 -2
  68. package/dist/{dialog-W-DmDMEE.cjs.map → dialog-Cn8cFeu-.cjs.map} +1 -1
  69. package/dist/{dialog-D3VF5qxy.d.cts → dialog-Dlozd6qY.d.ts} +12 -11
  70. package/dist/dialogs/confirm-dialog.cjs +1 -1
  71. package/dist/dialogs/confirm-dialog.cjs.map +1 -1
  72. package/dist/dialogs/confirm-dialog.js.map +1 -1
  73. package/dist/dialogs/detail-dialog/index.cjs +1 -1
  74. package/dist/dialogs/detail-dialog/index.cjs.map +1 -1
  75. package/dist/dialogs/detail-dialog/index.js +1 -1
  76. package/dist/dialogs/detail-dialog/index.js.map +1 -1
  77. package/dist/dialogs/error-dialog.cjs +1 -1
  78. package/dist/dialogs/form-dialog.cjs +1 -1
  79. package/dist/dialogs/form-dialog.cjs.map +1 -1
  80. package/dist/dialogs/form-dialog.d.cts +2 -1
  81. package/dist/dialogs/form-dialog.d.ts +2 -1
  82. package/dist/dialogs/form-dialog.js.map +1 -1
  83. package/dist/dialogs/loading-dialog.cjs +1 -1
  84. package/dist/dialogs/loading-dialog.cjs.map +1 -1
  85. package/dist/dialogs/loading-dialog.js.map +1 -1
  86. package/dist/{dropdown-menu-Bv18S56o.cjs → dropdown-menu-D2Kh77uw.cjs} +2 -2
  87. package/dist/{dropdown-menu-Bv18S56o.cjs.map → dropdown-menu-D2Kh77uw.cjs.map} +1 -1
  88. package/dist/{dropdown-menu-jCQwh2rG.js → dropdown-menu-DTFOCPH_.js} +1 -1
  89. package/dist/{dropdown-menu-jCQwh2rG.js.map → dropdown-menu-DTFOCPH_.js.map} +1 -1
  90. package/dist/{error-dialog-DpQgL5Hy.cjs → error-dialog-DO0Bb-pi.cjs} +2 -2
  91. package/dist/{error-dialog-DpQgL5Hy.cjs.map → error-dialog-DO0Bb-pi.cjs.map} +1 -1
  92. package/dist/error-dialog-D_4WL-Hj.js.map +1 -1
  93. package/dist/flex-ILvQrYMJ.js.map +1 -1
  94. package/dist/{flex-CNA_SId-.cjs → flex-yTyoLpgH.cjs} +2 -2
  95. package/dist/{flex-CNA_SId-.cjs.map → flex-yTyoLpgH.cjs.map} +1 -1
  96. package/dist/form-CA4hhSV5.js.map +1 -1
  97. package/dist/{form-CYZkgobJ.cjs → form-C_PCHrpx.cjs} +2 -2
  98. package/dist/{form-CYZkgobJ.cjs.map → form-C_PCHrpx.cjs.map} +1 -1
  99. package/dist/form-wrapper-D-2Uz518.js.map +1 -1
  100. package/dist/{form-wrapper-BYbwt1zC.cjs → form-wrapper-FYiHHas7.cjs} +2 -2
  101. package/dist/{form-wrapper-BYbwt1zC.cjs.map → form-wrapper-FYiHHas7.cjs.map} +1 -1
  102. package/dist/forms/combobox-field.cjs +42 -0
  103. package/dist/forms/combobox-field.cjs.map +1 -0
  104. package/dist/forms/combobox-field.d.cts +28 -0
  105. package/dist/forms/combobox-field.d.ts +28 -0
  106. package/dist/forms/combobox-field.js +42 -0
  107. package/dist/forms/combobox-field.js.map +1 -0
  108. package/dist/forms/date-field.cjs +2 -0
  109. package/dist/forms/date-field.cjs.map +1 -0
  110. package/dist/forms/date-field.d.cts +22 -0
  111. package/dist/forms/date-field.d.ts +22 -0
  112. package/dist/forms/date-field.js +2 -0
  113. package/dist/forms/date-field.js.map +1 -0
  114. package/dist/forms/form-wrapper.cjs +1 -1
  115. package/dist/forms/form-wrapper.d.cts +2 -1
  116. package/dist/forms/form-wrapper.d.ts +2 -1
  117. package/dist/forms/multi-select-field.cjs +2 -0
  118. package/dist/forms/multi-select-field.cjs.map +1 -0
  119. package/dist/forms/multi-select-field.d.cts +30 -0
  120. package/dist/forms/multi-select-field.d.ts +30 -0
  121. package/dist/forms/multi-select-field.js +2 -0
  122. package/dist/forms/multi-select-field.js.map +1 -0
  123. package/dist/forms/number-field.cjs +2 -0
  124. package/dist/forms/number-field.cjs.map +1 -0
  125. package/dist/forms/number-field.d.cts +28 -0
  126. package/dist/forms/number-field.d.ts +28 -0
  127. package/dist/forms/number-field.js +2 -0
  128. package/dist/forms/number-field.js.map +1 -0
  129. package/dist/forms/password-field.cjs +2 -0
  130. package/dist/forms/password-field.cjs.map +1 -0
  131. package/dist/forms/password-field.d.cts +23 -0
  132. package/dist/forms/password-field.d.ts +23 -0
  133. package/dist/forms/password-field.js +2 -0
  134. package/dist/forms/password-field.js.map +1 -0
  135. package/dist/forms/select-field.cjs +2 -0
  136. package/dist/forms/select-field.cjs.map +1 -0
  137. package/dist/forms/select-field.d.cts +33 -0
  138. package/dist/forms/select-field.d.ts +33 -0
  139. package/dist/forms/select-field.js +2 -0
  140. package/dist/forms/select-field.js.map +1 -0
  141. package/dist/forms/switch-field.cjs +2 -0
  142. package/dist/forms/switch-field.cjs.map +1 -0
  143. package/dist/forms/switch-field.d.cts +19 -0
  144. package/dist/forms/switch-field.d.ts +19 -0
  145. package/dist/forms/switch-field.js +2 -0
  146. package/dist/forms/switch-field.js.map +1 -0
  147. package/dist/forms/text-field.cjs +2 -0
  148. package/dist/forms/text-field.cjs.map +1 -0
  149. package/dist/forms/text-field.d.cts +31 -0
  150. package/dist/forms/text-field.d.ts +31 -0
  151. package/dist/forms/text-field.js +2 -0
  152. package/dist/forms/text-field.js.map +1 -0
  153. package/dist/forms/textarea-field.cjs +2 -0
  154. package/dist/forms/textarea-field.cjs.map +1 -0
  155. package/dist/forms/textarea-field.d.cts +27 -0
  156. package/dist/forms/textarea-field.d.ts +27 -0
  157. package/dist/forms/textarea-field.js +2 -0
  158. package/dist/forms/textarea-field.js.map +1 -0
  159. package/dist/{input-DXEBB91E.cjs → input-C8Sebaue.cjs} +2 -2
  160. package/dist/{input-DXEBB91E.cjs.map → input-C8Sebaue.cjs.map} +1 -1
  161. package/dist/{input-D0Phuz25.d.cts → input-DlRU8OGl.d.cts} +3 -2
  162. package/dist/{input-FzKbxUq2.js → input-Dmaq3fzf.js} +1 -1
  163. package/dist/{input-FzKbxUq2.js.map → input-Dmaq3fzf.js.map} +1 -1
  164. package/dist/{input-tHIKXxVS.d.ts → input-yduNlg8y.d.ts} +3 -2
  165. package/dist/label-Cxbctr6x.js.map +1 -1
  166. package/dist/{label-CunjD1rx.cjs → label-i858Jr98.cjs} +2 -2
  167. package/dist/{label-CunjD1rx.cjs.map → label-i858Jr98.cjs.map} +1 -1
  168. package/dist/layouts/flex.cjs +1 -1
  169. package/dist/layouts/flex.d.cts +13 -2
  170. package/dist/layouts/flex.d.ts +13 -2
  171. package/dist/layouts/main/index.cjs +1 -1
  172. package/dist/layouts/main/index.cjs.map +1 -1
  173. package/dist/layouts/main/index.d.cts +14 -4
  174. package/dist/layouts/main/index.d.ts +14 -4
  175. package/dist/layouts/main/index.js +1 -1
  176. package/dist/layouts/main/index.js.map +1 -1
  177. package/dist/multi-select-Bbv0Z0TP.js +2 -0
  178. package/dist/multi-select-Bbv0Z0TP.js.map +1 -0
  179. package/dist/multi-select-EqlnkO5V.cjs +2 -0
  180. package/dist/multi-select-EqlnkO5V.cjs.map +1 -0
  181. package/dist/paragraph-Bey03JkA.js.map +1 -1
  182. package/dist/{paragraph-ZxI8zxuf.cjs → paragraph-DWQ0PZt_.cjs} +2 -2
  183. package/dist/{paragraph-ZxI8zxuf.cjs.map → paragraph-DWQ0PZt_.cjs.map} +1 -1
  184. package/dist/popover-B8j86VQv.js +2 -0
  185. package/dist/popover-B8j86VQv.js.map +1 -0
  186. package/dist/popover-CAokgoc_.cjs +2 -0
  187. package/dist/popover-CAokgoc_.cjs.map +1 -0
  188. package/dist/{progress-BnnOfAZN.cjs → progress-CHh9eRZi.cjs} +2 -2
  189. package/dist/{progress-BnnOfAZN.cjs.map → progress-CHh9eRZi.cjs.map} +1 -1
  190. package/dist/{progress-CBccqUUJ.js → progress-CeXKNvJc.js} +1 -1
  191. package/dist/{progress-CBccqUUJ.js.map → progress-CeXKNvJc.js.map} +1 -1
  192. package/dist/{refresh-BHt_h3N_.js → refresh-B__T7OFC.js} +1 -1
  193. package/dist/{refresh-BHt_h3N_.js.map → refresh-B__T7OFC.js.map} +1 -1
  194. package/dist/{refresh-DrolZxuC.cjs → refresh-BuL5nDf9.cjs} +2 -2
  195. package/dist/{refresh-DrolZxuC.cjs.map → refresh-BuL5nDf9.cjs.map} +1 -1
  196. package/dist/{scroll-area-Bdb_LSFF.js → scroll-area-C0KQbcG0.js} +1 -1
  197. package/dist/{scroll-area-Bdb_LSFF.js.map → scroll-area-C0KQbcG0.js.map} +1 -1
  198. package/dist/{scroll-area-DWWpaz5j.cjs → scroll-area-fNeFxa8L.cjs} +2 -2
  199. package/dist/{scroll-area-DWWpaz5j.cjs.map → scroll-area-fNeFxa8L.cjs.map} +1 -1
  200. package/dist/{search-input-L2sq0eB0.js → search-input-BGmx8sXy.js} +2 -2
  201. package/dist/{search-input-L2sq0eB0.js.map → search-input-BGmx8sXy.js.map} +1 -1
  202. package/dist/{search-input-Bf4-FeWu.cjs → search-input-CWCcWgmA.cjs} +2 -2
  203. package/dist/{search-input-Bf4-FeWu.cjs.map → search-input-CWCcWgmA.cjs.map} +1 -1
  204. package/dist/{select-CWUsisI0.js → select-4IO3vAjO.js} +1 -1
  205. package/dist/{select-CWUsisI0.js.map → select-4IO3vAjO.js.map} +1 -1
  206. package/dist/{select-ZSyt5zCe.cjs → select-UsiicIRo.cjs} +2 -2
  207. package/dist/{select-ZSyt5zCe.cjs.map → select-UsiicIRo.cjs.map} +1 -1
  208. package/dist/{separator-2cwfp8qT.d.ts → separator-C4XPc_2Y.d.cts} +3 -2
  209. package/dist/{separator-DTB3sDNG.cjs → separator-D4iTmsID.cjs} +2 -2
  210. package/dist/{separator-DTB3sDNG.cjs.map → separator-D4iTmsID.cjs.map} +1 -1
  211. package/dist/{separator-BpsL0PlX.js → separator-DMdqEz29.js} +1 -1
  212. package/dist/{separator-BpsL0PlX.js.map → separator-DMdqEz29.js.map} +1 -1
  213. package/dist/{separator-COXs-I-Q.d.cts → separator-o7tKOtGF.d.ts} +3 -2
  214. package/dist/{sheet-C8r2QGpq.js → sheet-2JqHfdYi.js} +1 -1
  215. package/dist/{sheet-C8r2QGpq.js.map → sheet-2JqHfdYi.js.map} +1 -1
  216. package/dist/{sheet-CCwbAaA6.cjs → sheet-Dr-a3-o2.cjs} +2 -2
  217. package/dist/{sheet-CCwbAaA6.cjs.map → sheet-Dr-a3-o2.cjs.map} +1 -1
  218. package/dist/{sidebar-C166f_9B.js → sidebar-COBzB7S8.js} +2 -2
  219. package/dist/{sidebar-C166f_9B.js.map → sidebar-COBzB7S8.js.map} +1 -1
  220. package/dist/{sidebar-BLPMNltJ.cjs → sidebar-gXuaHBie.cjs} +2 -2
  221. package/dist/{sidebar-BLPMNltJ.cjs.map → sidebar-gXuaHBie.cjs.map} +1 -1
  222. package/dist/{skeleton-m3giaF4T.cjs → skeleton-BTQm_mtV.cjs} +2 -2
  223. package/dist/{skeleton-m3giaF4T.cjs.map → skeleton-BTQm_mtV.cjs.map} +1 -1
  224. package/dist/{skeleton-DYmX0k94.js → skeleton-D1_Brnl9.js} +1 -1
  225. package/dist/{skeleton-DYmX0k94.js.map → skeleton-D1_Brnl9.js.map} +1 -1
  226. package/dist/switch-BlK-TC1h.js +2 -0
  227. package/dist/switch-BlK-TC1h.js.map +1 -0
  228. package/dist/switch-CoP3UwNk.cjs +2 -0
  229. package/dist/switch-CoP3UwNk.cjs.map +1 -0
  230. package/dist/table/index.cjs +1 -1
  231. package/dist/table/index.cjs.map +1 -1
  232. package/dist/table/index.d.cts +2 -1
  233. package/dist/table/index.d.ts +2 -1
  234. package/dist/table/index.js +1 -1
  235. package/dist/table/index.js.map +1 -1
  236. package/dist/{table-BSeev7T0.cjs → table-CFqnfTKO.cjs} +2 -2
  237. package/dist/{table-BSeev7T0.cjs.map → table-CFqnfTKO.cjs.map} +1 -1
  238. package/dist/{table-BvA64mE8.js → table-DrnU8YJP.js} +1 -1
  239. package/dist/{table-BvA64mE8.js.map → table-DrnU8YJP.js.map} +1 -1
  240. package/dist/textarea-Dz6npuI4.cjs +2 -0
  241. package/dist/textarea-Dz6npuI4.cjs.map +1 -0
  242. package/dist/textarea-dM1DYNfF.js +2 -0
  243. package/dist/textarea-dM1DYNfF.js.map +1 -0
  244. package/dist/{title-DTkABsIG.js → title-CA6PvqiD.js} +1 -1
  245. package/dist/{title-DTkABsIG.js.map → title-CA6PvqiD.js.map} +1 -1
  246. package/dist/{title-xsPZpQpb.cjs → title-CIQdEGOd.cjs} +2 -2
  247. package/dist/{title-xsPZpQpb.cjs.map → title-CIQdEGOd.cjs.map} +1 -1
  248. package/dist/toggle-BCSHdzP0.d.cts +20 -0
  249. package/dist/{toggle-D_MDMruK.js → toggle-CHJ2edke.js} +1 -1
  250. package/dist/{toggle-D_MDMruK.js.map → toggle-CHJ2edke.js.map} +1 -1
  251. package/dist/{toggle-CfL3GVe2.cjs → toggle-CzMYdDvC.cjs} +2 -2
  252. package/dist/{toggle-CfL3GVe2.cjs.map → toggle-CzMYdDvC.cjs.map} +1 -1
  253. package/dist/toggle-D42pqCTD.d.ts +20 -0
  254. package/dist/tooltip-DZ2Shzgg.d.ts +24 -0
  255. package/dist/tooltip-Dn8AOhc4.d.cts +24 -0
  256. package/dist/tooltip-Dzyf5smh.js.map +1 -1
  257. package/dist/{tooltip-Beb-_EPp.cjs → tooltip-MgToVOzy.cjs} +2 -2
  258. package/dist/{tooltip-Beb-_EPp.cjs.map → tooltip-MgToVOzy.cjs.map} +1 -1
  259. package/dist/{types-DLrIc2fL.d.ts → types-CmcNT14g.d.ts} +1 -1
  260. package/dist/types-CrbWxjnp.cjs.map +1 -1
  261. package/dist/types-DaIHddx7.js.map +1 -1
  262. package/dist/typography/paragraph.cjs +1 -1
  263. package/dist/typography/paragraph.d.cts +2 -1
  264. package/dist/typography/paragraph.d.ts +2 -1
  265. package/dist/typography/title.cjs +1 -1
  266. package/dist/typography/title.d.cts +3 -1
  267. package/dist/typography/title.d.ts +3 -1
  268. package/dist/typography/title.js +1 -1
  269. package/dist/ui/alert-dialog.cjs +1 -1
  270. package/dist/ui/alert-dialog.d.cts +12 -11
  271. package/dist/ui/alert-dialog.d.ts +12 -11
  272. package/dist/ui/alert.cjs +1 -1
  273. package/dist/ui/alert.cjs.map +1 -1
  274. package/dist/ui/alert.d.cts +8 -4
  275. package/dist/ui/alert.d.ts +8 -4
  276. package/dist/ui/alert.js.map +1 -1
  277. package/dist/ui/aspect-ratio.cjs +1 -1
  278. package/dist/ui/aspect-ratio.cjs.map +1 -1
  279. package/dist/ui/aspect-ratio.d.cts +2 -1
  280. package/dist/ui/aspect-ratio.d.ts +2 -1
  281. package/dist/ui/aspect-ratio.js.map +1 -1
  282. package/dist/ui/avatar.cjs +1 -1
  283. package/dist/ui/avatar.cjs.map +1 -1
  284. package/dist/ui/avatar.d.cts +4 -3
  285. package/dist/ui/avatar.d.ts +4 -3
  286. package/dist/ui/avatar.js.map +1 -1
  287. package/dist/ui/badge.cjs +1 -1
  288. package/dist/ui/badge.d.cts +8 -2
  289. package/dist/ui/badge.d.ts +8 -2
  290. package/dist/ui/breadcrumb.cjs +1 -1
  291. package/dist/ui/breadcrumb.cjs.map +1 -1
  292. package/dist/ui/breadcrumb.d.cts +8 -7
  293. package/dist/ui/breadcrumb.d.ts +8 -7
  294. package/dist/ui/breadcrumb.js.map +1 -1
  295. package/dist/ui/button.cjs +1 -1
  296. package/dist/ui/button.d.cts +1 -1
  297. package/dist/ui/button.d.ts +1 -1
  298. package/dist/ui/buttons/add-new.cjs +1 -1
  299. package/dist/ui/buttons/add-new.js +1 -1
  300. package/dist/ui/buttons/refresh.cjs +1 -1
  301. package/dist/ui/buttons/refresh.js +1 -1
  302. package/dist/ui/calendar.cjs +1 -2
  303. package/dist/ui/calendar.d.cts +4 -3
  304. package/dist/ui/calendar.d.ts +4 -3
  305. package/dist/ui/calendar.js +1 -2
  306. package/dist/ui/card.cjs +1 -1
  307. package/dist/ui/card.d.cts +8 -7
  308. package/dist/ui/card.d.ts +8 -7
  309. package/dist/ui/carousel.cjs +1 -1
  310. package/dist/ui/carousel.cjs.map +1 -1
  311. package/dist/ui/carousel.d.cts +7 -6
  312. package/dist/ui/carousel.d.ts +7 -6
  313. package/dist/ui/carousel.js.map +1 -1
  314. package/dist/ui/collapsible.cjs +1 -1
  315. package/dist/ui/collapsible.cjs.map +1 -1
  316. package/dist/ui/collapsible.d.cts +4 -3
  317. package/dist/ui/collapsible.d.ts +4 -3
  318. package/dist/ui/collapsible.js.map +1 -1
  319. package/dist/ui/command.cjs +1 -1
  320. package/dist/ui/command.d.cts +3 -52
  321. package/dist/ui/command.d.ts +3 -52
  322. package/dist/ui/command.js +1 -1
  323. package/dist/ui/context-menu.cjs +1 -1
  324. package/dist/ui/context-menu.cjs.map +1 -1
  325. package/dist/ui/context-menu.d.cts +16 -15
  326. package/dist/ui/context-menu.d.ts +16 -15
  327. package/dist/ui/context-menu.js.map +1 -1
  328. package/dist/ui/dialog.cjs +1 -1
  329. package/dist/ui/dialog.d.cts +1 -1
  330. package/dist/ui/dialog.d.ts +1 -1
  331. package/dist/ui/dropdown-menu.cjs +1 -1
  332. package/dist/ui/dropdown-menu.d.cts +16 -15
  333. package/dist/ui/dropdown-menu.d.ts +16 -15
  334. package/dist/ui/dropdown-menu.js +1 -1
  335. package/dist/ui/file-uploader.cjs +1 -1
  336. package/dist/ui/file-uploader.cjs.map +1 -1
  337. package/dist/ui/file-uploader.d.cts +2 -1
  338. package/dist/ui/file-uploader.d.ts +2 -1
  339. package/dist/ui/file-uploader.js +1 -1
  340. package/dist/ui/file-uploader.js.map +1 -1
  341. package/dist/ui/form.cjs +1 -1
  342. package/dist/ui/form.d.cts +23 -8
  343. package/dist/ui/form.d.ts +23 -8
  344. package/dist/ui/hover-card.cjs +1 -1
  345. package/dist/ui/hover-card.cjs.map +1 -1
  346. package/dist/ui/hover-card.d.cts +4 -3
  347. package/dist/ui/hover-card.d.ts +4 -3
  348. package/dist/ui/hover-card.js.map +1 -1
  349. package/dist/ui/input-otp.cjs +1 -1
  350. package/dist/ui/input-otp.cjs.map +1 -1
  351. package/dist/ui/input-otp.d.cts +5 -4
  352. package/dist/ui/input-otp.d.ts +5 -4
  353. package/dist/ui/input-otp.js.map +1 -1
  354. package/dist/ui/input.cjs +1 -1
  355. package/dist/ui/input.d.cts +1 -1
  356. package/dist/ui/input.d.ts +1 -1
  357. package/dist/ui/input.js +1 -1
  358. package/dist/ui/inputs/search-input.cjs +1 -1
  359. package/dist/ui/inputs/search-input.d.cts +3 -2
  360. package/dist/ui/inputs/search-input.d.ts +3 -2
  361. package/dist/ui/inputs/search-input.js +1 -1
  362. package/dist/ui/label.cjs +1 -1
  363. package/dist/ui/label.d.cts +2 -1
  364. package/dist/ui/label.d.ts +2 -1
  365. package/dist/ui/menubar.cjs +1 -1
  366. package/dist/ui/menubar.cjs.map +1 -1
  367. package/dist/ui/menubar.d.cts +17 -16
  368. package/dist/ui/menubar.d.ts +17 -16
  369. package/dist/ui/menubar.js.map +1 -1
  370. package/dist/ui/multi-select.cjs +1 -2
  371. package/dist/ui/multi-select.d.cts +61 -1
  372. package/dist/ui/multi-select.d.ts +61 -1
  373. package/dist/ui/multi-select.js +1 -2
  374. package/dist/ui/navigation-menu.cjs +1 -1
  375. package/dist/ui/navigation-menu.cjs.map +1 -1
  376. package/dist/ui/navigation-menu.d.cts +11 -9
  377. package/dist/ui/navigation-menu.d.ts +11 -9
  378. package/dist/ui/navigation-menu.js.map +1 -1
  379. package/dist/ui/pagination.cjs +1 -1
  380. package/dist/ui/pagination.cjs.map +1 -1
  381. package/dist/ui/pagination.d.cts +9 -8
  382. package/dist/ui/pagination.d.ts +9 -8
  383. package/dist/ui/pagination.js.map +1 -1
  384. package/dist/ui/popover.cjs +1 -2
  385. package/dist/ui/popover.d.cts +5 -4
  386. package/dist/ui/popover.d.ts +5 -4
  387. package/dist/ui/popover.js +1 -2
  388. package/dist/ui/progress.cjs +1 -1
  389. package/dist/ui/progress.d.cts +2 -1
  390. package/dist/ui/progress.d.ts +2 -1
  391. package/dist/ui/progress.js +1 -1
  392. package/dist/ui/radio-group.cjs +1 -1
  393. package/dist/ui/radio-group.cjs.map +1 -1
  394. package/dist/ui/radio-group.d.cts +3 -2
  395. package/dist/ui/radio-group.d.ts +3 -2
  396. package/dist/ui/radio-group.js.map +1 -1
  397. package/dist/ui/resizable.cjs +1 -1
  398. package/dist/ui/resizable.cjs.map +1 -1
  399. package/dist/ui/resizable.d.cts +4 -3
  400. package/dist/ui/resizable.d.ts +4 -3
  401. package/dist/ui/resizable.js.map +1 -1
  402. package/dist/ui/scroll-area.cjs +1 -1
  403. package/dist/ui/scroll-area.d.cts +3 -2
  404. package/dist/ui/scroll-area.d.ts +3 -2
  405. package/dist/ui/scroll-area.js +1 -1
  406. package/dist/ui/select.cjs +1 -1
  407. package/dist/ui/select.d.cts +11 -10
  408. package/dist/ui/select.d.ts +11 -10
  409. package/dist/ui/select.js +1 -1
  410. package/dist/ui/separator.cjs +1 -1
  411. package/dist/ui/separator.d.cts +1 -1
  412. package/dist/ui/separator.d.ts +1 -1
  413. package/dist/ui/separator.js +1 -1
  414. package/dist/ui/sheet.cjs +1 -1
  415. package/dist/ui/sheet.d.cts +9 -8
  416. package/dist/ui/sheet.d.ts +9 -8
  417. package/dist/ui/sheet.js +1 -1
  418. package/dist/ui/sidebar.cjs +1 -1
  419. package/dist/ui/sidebar.d.cts +43 -29
  420. package/dist/ui/sidebar.d.ts +43 -29
  421. package/dist/ui/sidebar.js +1 -1
  422. package/dist/ui/skeleton.cjs +1 -1
  423. package/dist/ui/skeleton.d.cts +2 -1
  424. package/dist/ui/skeleton.d.ts +2 -1
  425. package/dist/ui/skeleton.js +1 -1
  426. package/dist/ui/slider.cjs +1 -1
  427. package/dist/ui/slider.cjs.map +1 -1
  428. package/dist/ui/slider.d.cts +2 -1
  429. package/dist/ui/slider.d.ts +2 -1
  430. package/dist/ui/slider.js.map +1 -1
  431. package/dist/ui/sonner.cjs +1 -1
  432. package/dist/ui/sonner.cjs.map +1 -1
  433. package/dist/ui/sonner.d.cts +3 -1
  434. package/dist/ui/sonner.d.ts +3 -1
  435. package/dist/ui/sonner.js.map +1 -1
  436. package/dist/ui/switch.cjs +1 -2
  437. package/dist/ui/switch.d.cts +2 -1
  438. package/dist/ui/switch.d.ts +2 -1
  439. package/dist/ui/switch.js +1 -2
  440. package/dist/ui/table.cjs +1 -1
  441. package/dist/ui/table.d.cts +9 -8
  442. package/dist/ui/table.d.ts +9 -8
  443. package/dist/ui/table.js +1 -1
  444. package/dist/ui/tabs.cjs +1 -1
  445. package/dist/ui/tabs.cjs.map +1 -1
  446. package/dist/ui/tabs.d.cts +5 -4
  447. package/dist/ui/tabs.d.ts +5 -4
  448. package/dist/ui/tabs.js.map +1 -1
  449. package/dist/ui/textarea.cjs +1 -2
  450. package/dist/ui/textarea.d.cts +2 -1
  451. package/dist/ui/textarea.d.ts +2 -1
  452. package/dist/ui/textarea.js +1 -2
  453. package/dist/ui/toggle-group.cjs +1 -1
  454. package/dist/ui/toggle-group.cjs.map +1 -1
  455. package/dist/ui/toggle-group.d.cts +4 -3
  456. package/dist/ui/toggle-group.d.ts +4 -3
  457. package/dist/ui/toggle-group.js +1 -1
  458. package/dist/ui/toggle-group.js.map +1 -1
  459. package/dist/ui/toggle.cjs +1 -1
  460. package/dist/ui/toggle.d.cts +1 -1
  461. package/dist/ui/toggle.d.ts +1 -1
  462. package/dist/ui/toggle.js +1 -1
  463. package/dist/ui/tooltip.cjs +1 -1
  464. package/dist/ui/tooltip.d.cts +1 -1
  465. package/dist/ui/tooltip.d.ts +1 -1
  466. package/dist/utils-D9AH0PUV.js +1 -1
  467. package/dist/utils-D9AH0PUV.js.map +1 -1
  468. package/dist/utils-DaJ1XZgX.cjs +2 -0
  469. package/dist/{utils-BsjVK5EW.cjs.map → utils-DaJ1XZgX.cjs.map} +1 -1
  470. package/package.json +51 -4
  471. package/packages/components/cards/simple-card.tsx +37 -0
  472. package/packages/components/data-display/country.tsx +59 -0
  473. package/packages/components/data-display/data-list.tsx +38 -0
  474. package/packages/components/data-display/date.tsx +215 -0
  475. package/packages/components/data-display/empty.tsx +25 -0
  476. package/packages/components/data-display/name.tsx +25 -0
  477. package/packages/components/data-display/phone-number.tsx +22 -0
  478. package/packages/components/data-display/role-badge.tsx +33 -0
  479. package/packages/components/data-display/statistic.tsx +141 -0
  480. package/packages/components/dialogs/confirm-dialog.tsx +51 -0
  481. package/packages/components/dialogs/detail-dialog/component/header.tsx +14 -0
  482. package/packages/components/dialogs/detail-dialog/component/main.tsx +39 -0
  483. package/packages/components/dialogs/detail-dialog/component/sidebar.tsx +747 -0
  484. package/packages/components/dialogs/detail-dialog/component/wrapper.tsx +17 -0
  485. package/packages/components/dialogs/detail-dialog/index.tsx +100 -0
  486. package/packages/components/dialogs/error-dialog.tsx +48 -0
  487. package/packages/components/dialogs/form-dialog.tsx +106 -0
  488. package/packages/components/dialogs/loading-dialog.tsx +23 -0
  489. package/packages/components/forms/combobox-field.tsx +113 -0
  490. package/packages/components/forms/date-field.tsx +65 -0
  491. package/packages/components/forms/form-wrapper.tsx +146 -0
  492. package/packages/components/forms/multi-select-field.tsx +56 -0
  493. package/packages/components/forms/number-field.tsx +56 -0
  494. package/packages/components/forms/password-field.tsx +38 -0
  495. package/packages/components/forms/select-field.tsx +58 -0
  496. package/packages/components/forms/switch-field.tsx +42 -0
  497. package/packages/components/forms/text-field.tsx +80 -0
  498. package/packages/components/forms/textarea-field.tsx +53 -0
  499. package/packages/components/index.tsx +0 -0
  500. package/packages/components/layouts/flex.tsx +110 -0
  501. package/packages/components/layouts/main/content.tsx +11 -0
  502. package/packages/components/layouts/main/header.tsx +53 -0
  503. package/packages/components/layouts/main/index.tsx +3 -0
  504. package/packages/components/layouts/main/wrapper.tsx +5 -0
  505. package/packages/components/table/data-table-pagination.tsx +99 -0
  506. package/packages/components/table/data-table.tsx +328 -0
  507. package/packages/components/table/index.tsx +126 -0
  508. package/packages/components/typography/paragraph.tsx +32 -0
  509. package/packages/components/typography/title.tsx +36 -0
  510. package/packages/components/ui/alert-dialog.tsx +173 -0
  511. package/packages/components/ui/alert.tsx +71 -0
  512. package/packages/components/ui/aspect-ratio.tsx +20 -0
  513. package/packages/components/ui/avatar.tsx +52 -0
  514. package/packages/components/ui/badge.tsx +63 -0
  515. package/packages/components/ui/breadcrumb.tsx +110 -0
  516. package/packages/components/ui/button.tsx +88 -0
  517. package/packages/components/ui/buttons/add-new.tsx +26 -0
  518. package/packages/components/ui/buttons/refresh.tsx +30 -0
  519. package/packages/components/ui/calendar.tsx +209 -0
  520. package/packages/components/ui/card.tsx +95 -0
  521. package/packages/components/ui/carousel.tsx +241 -0
  522. package/packages/components/ui/checkbox.tsx +44 -0
  523. package/packages/components/ui/collapsible.tsx +33 -0
  524. package/packages/components/ui/command.tsx +217 -0
  525. package/packages/components/ui/context-menu.tsx +258 -0
  526. package/packages/components/ui/dialog.tsx +174 -0
  527. package/packages/components/ui/dropdown-menu.tsx +318 -0
  528. package/packages/components/ui/file-uploader.tsx +372 -0
  529. package/packages/components/ui/form.tsx +168 -0
  530. package/packages/components/ui/hover-card.tsx +43 -0
  531. package/packages/components/ui/input-otp.tsx +76 -0
  532. package/packages/components/ui/input.tsx +59 -0
  533. package/packages/components/ui/inputs/number-input.tsx +325 -0
  534. package/packages/components/ui/inputs/password-input.tsx +35 -0
  535. package/packages/components/ui/inputs/search-input.tsx +24 -0
  536. package/packages/components/ui/label.tsx +29 -0
  537. package/packages/components/ui/menubar.tsx +275 -0
  538. package/packages/components/ui/multi-select.tsx +693 -0
  539. package/packages/components/ui/navigation-menu.tsx +170 -0
  540. package/packages/components/ui/pagination.tsx +128 -0
  541. package/packages/components/ui/popover.tsx +64 -0
  542. package/packages/components/ui/progress.tsx +30 -0
  543. package/packages/components/ui/radio-group.tsx +53 -0
  544. package/packages/components/ui/resizable.tsx +55 -0
  545. package/packages/components/ui/scroll-area.tsx +51 -0
  546. package/packages/components/ui/select.tsx +246 -0
  547. package/packages/components/ui/separator.tsx +27 -0
  548. package/packages/components/ui/sheet.tsx +155 -0
  549. package/packages/components/ui/sidebar.tsx +751 -0
  550. package/packages/components/ui/skeleton.tsx +15 -0
  551. package/packages/components/ui/slider.tsx +62 -0
  552. package/packages/components/ui/sonner.tsx +43 -0
  553. package/packages/components/ui/switch.tsx +52 -0
  554. package/packages/components/ui/table.tsx +118 -0
  555. package/packages/components/ui/tabs.tsx +85 -0
  556. package/packages/components/ui/textarea.tsx +47 -0
  557. package/packages/components/ui/toggle-group.tsx +72 -0
  558. package/packages/components/ui/toggle.tsx +47 -0
  559. package/packages/components/ui/tooltip.tsx +71 -0
  560. package/packages/constants.tsx +79 -0
  561. package/packages/hooks/use-callback-ref.ts +27 -0
  562. package/packages/hooks/use-controllable-state.ts +67 -0
  563. package/packages/hooks/use-mobile.ts +21 -0
  564. package/packages/index.css +392 -0
  565. package/packages/lib/utils.ts +28 -0
  566. package/packages/types.ts +50 -0
  567. package/dist/button-D_E_bNRb.d.ts +0 -18
  568. package/dist/button-YHI7I64h.d.cts +0 -18
  569. package/dist/chunk-CUT6urMc.cjs +0 -1
  570. package/dist/toggle-BVkMTVAz.d.ts +0 -15
  571. package/dist/toggle-CW-ZnYMy.d.cts +0 -15
  572. package/dist/tooltip-Cjuu_Ld4.d.ts +0 -23
  573. package/dist/tooltip-Dk4HsZVR.d.cts +0 -23
  574. package/dist/ui/calendar.cjs.map +0 -1
  575. package/dist/ui/calendar.js.map +0 -1
  576. package/dist/ui/multi-select.cjs.map +0 -1
  577. package/dist/ui/multi-select.js.map +0 -1
  578. package/dist/ui/popover.cjs.map +0 -1
  579. package/dist/ui/popover.js.map +0 -1
  580. package/dist/ui/switch.cjs.map +0 -1
  581. package/dist/ui/switch.js.map +0 -1
  582. package/dist/ui/textarea.cjs.map +0 -1
  583. package/dist/ui/textarea.js.map +0 -1
  584. package/dist/utils-BsjVK5EW.cjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.cjs","names":["React","setValue: React.Dispatch<React.SetStateAction<T | undefined>>","React","value","React","Dropzone","cn","Upload","formatBytes","Image","Trash2","Progress","Button","FileText"],"sources":["../../packages/hooks/use-callback-ref.ts","../../packages/hooks/use-controllable-state.ts","../../packages/components/ui/file-uploader.tsx"],"sourcesContent":["import React from \"react\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined,\n): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(\n () => ((...args) => callbackRef.current?.(...args)) as T,\n [],\n );\n}\n\nexport { useCallbackRef };\n","import React from \"react\";\n\nimport { useCallbackRef } from \"./use-callback-ref\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-controllable-state/src/useControllableState.tsx\n */\n\ntype UseControllableStateParams<T> = {\n prop?: T | undefined;\n defaultProp?: T | undefined;\n onChange?: (state: T) => void;\n};\n\ntype SetStateFn<T> = (prevState?: T) => T;\n\nfunction useControllableState<T>({\n prop,\n defaultProp,\n onChange = () => {},\n}: UseControllableStateParams<T>) {\n const [uncontrolledProp, setUncontrolledProp] = useUncontrolledState({\n defaultProp,\n onChange,\n });\n const isControlled = prop !== undefined;\n const value = isControlled ? prop : uncontrolledProp;\n const handleChange = useCallbackRef(onChange);\n\n const setValue: React.Dispatch<React.SetStateAction<T | undefined>> =\n React.useCallback(\n (nextValue) => {\n if (isControlled) {\n const setter = nextValue as SetStateFn<T>;\n const value =\n typeof nextValue === \"function\" ? setter(prop) : nextValue;\n if (value !== prop) handleChange(value as T);\n } else {\n setUncontrolledProp(nextValue);\n }\n },\n [isControlled, prop, setUncontrolledProp, handleChange],\n );\n\n return [value, setValue] as const;\n}\n\nfunction useUncontrolledState<T>({\n defaultProp,\n onChange,\n}: Omit<UseControllableStateParams<T>, \"prop\">) {\n const uncontrolledState = React.useState<T | undefined>(defaultProp);\n const [value] = uncontrolledState;\n const prevValueRef = React.useRef(value);\n const handleChange = useCallbackRef(onChange);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n handleChange(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef, handleChange]);\n\n return uncontrolledState;\n}\n\nexport { useControllableState };\n","\"use client\";\nimport React from \"react\";\nimport { FileText, Image, Trash2, Upload } from \"lucide-react\";\nimport Dropzone, {\n type DropzoneProps,\n type FileRejection,\n} from \"react-dropzone\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useControllableState } from \"@/hooks/use-controllable-state\";\nimport { cn, formatBytes } from \"@/lib/utils\";\n\ninterface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Value of the uploader.\n * @type File[]\n * @default undefined\n * @example value={files}\n */\n value?: File[];\n\n /**\n * Function to be called when the value changes.\n * @type (files: File[]) => void\n * @default undefined\n * @example onValueChange={(files) => setFiles(files)}\n */\n onValueChange?: (files: File[]) => void;\n\n /**\n * Function to be called when files are uploaded.\n * @type (files: File[]) => Promise<void>\n * @default undefined\n * @example onUpload={(files) => uploadFiles(files)}\n */\n onUpload?: (files: File[]) => Promise<void>;\n\n /**\n * Progress of the uploaded files.\n * @type Record<string, number> | undefined\n * @default undefined\n * @example progresses={{ \"file1.png\": 50 }}\n */\n progresses?: Record<string, number>;\n\n /**\n * Accepted file types for the uploader.\n * @type { [key: string]: string[]}\n * @default\n * ```ts\n * { \"image/*\": [] }\n * ```\n * @example accept={[\"image/png\", \"image/jpeg\"]}\n */\n accept?: DropzoneProps[\"accept\"];\n\n /**\n * Maximum file size for the uploader.\n * @type number | undefined\n * @default 1024 * 1024 * 2 // 2MB\n * @example maxSize={1024 * 1024 * 2} // 2MB\n */\n maxSize?: DropzoneProps[\"maxSize\"];\n\n /**\n * Maximum number of files for the uploader.\n * @type number | undefined\n * @default 1\n * @example maxFileCount={4}\n */\n maxFileCount?: DropzoneProps[\"maxFiles\"];\n\n /**\n * Whether the uploader should accept multiple files.\n * @type boolean\n * @default false\n * @example multiple\n */\n multiple?: boolean;\n\n /**\n * Whether the uploader is disabled.\n * @type boolean\n * @default false\n * @example disabled\n */\n disabled?: boolean;\n\n showText?: boolean;\n iconSize?: number;\n}\n\nexport function FileUploader(props: FileUploaderProps) {\n const {\n value: valueProp,\n onValueChange,\n onUpload,\n progresses,\n accept = {\n \"image/*\": [],\n },\n maxSize = 1024 * 1024 * 2,\n maxFileCount = 1,\n multiple = false,\n disabled = false,\n showText = true,\n iconSize,\n className,\n ...dropzoneProps\n } = props;\n\n const [files, setFiles] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n });\n\n const onDrop = React.useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n if (!multiple && maxFileCount === 1 && acceptedFiles.length > 1) {\n toast.error(\"Cannot upload more than 1 file at a time\");\n\n return;\n }\n\n if ((files?.length ?? 0) + acceptedFiles.length > maxFileCount) {\n toast.error(`Cannot upload more than ${maxFileCount} files`);\n return;\n }\n\n const newFiles = acceptedFiles.map((file) =>\n Object.assign(file, {\n preview: URL.createObjectURL(file),\n }),\n );\n\n const updatedFiles = files ? [...files, ...newFiles] : newFiles;\n\n setFiles(updatedFiles);\n\n if (rejectedFiles.length > 0) {\n rejectedFiles.forEach(({ file }) => {\n toast.error(`File ${file.name} was rejected`);\n });\n }\n\n if (\n onUpload &&\n updatedFiles.length > 0 &&\n updatedFiles.length <= maxFileCount\n ) {\n const target =\n updatedFiles.length > 0 ? `${updatedFiles.length} files` : `file`;\n\n onUpload(updatedFiles).then(() => {\n setFiles([]);\n toast(`${target} uploaded`);\n });\n }\n },\n\n [files, maxFileCount, multiple, onUpload, setFiles],\n );\n\n function onRemove(index: number) {\n if (!files) return;\n\n if (isFileWithPreview(files[index])) {\n URL.revokeObjectURL(files[index].preview);\n }\n\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onValueChange?.(newFiles);\n }\n\n // Revoke preview url when component unmounts\n React.useEffect(() => {\n return () => {\n if (!files) return;\n files.forEach((file) => {\n if (isFileWithPreview(file)) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const isDisabled = disabled || (files?.length ?? 0) >= maxFileCount;\n\n return (\n <div className=\"relative flex w-full flex-col gap-6\">\n <Dropzone\n onDrop={onDrop}\n accept={accept}\n maxSize={maxSize}\n maxFiles={maxFileCount}\n multiple={maxFileCount > 1 || multiple}\n disabled={isDisabled}\n >\n {({ getRootProps, getInputProps, isDragActive }) => (\n <div\n {...getRootProps()}\n className={cn(\n \"group\",\n \"border-muted-foreground/25\",\n \"hover:bg-muted/25\",\n \"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\",\n \"ring-offset-background\",\n \"focus-visible:ring-ring\",\n \"focus-visible:ring-2\",\n \"focus-visible:ring-offset-2\",\n \"focus-visible:outline-hidden\",\n isDragActive && \"border-muted-foreground/50\",\n isDisabled && \"pointer-events-none opacity-60\",\n className,\n )}\n {...dropzoneProps}\n >\n <input {...getInputProps()} />\n {isDragActive ? (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n className=\"text-muted-foreground size-7\"\n aria-hidden=\"true\"\n />\n </div>\n <p className=\"text-muted-foreground font-medium\">\n Drop the files here\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n size={iconSize || 24}\n className=\"text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </div>\n {showText && (\n <div className=\"flex flex-col gap-px\">\n <p className=\"text-muted-foreground text-xs font-medium\">\n Drag {`'n'`} drop files here, or click to select files\n </p>\n <p className=\"text-muted-foreground/70 text-xs\">\n You can upload\n {maxFileCount > 1\n ? ` ${maxFileCount === Infinity ? \"multiple\" : maxFileCount}\n files (up to ${formatBytes(maxSize)} each)`\n : ` a file with ${formatBytes(maxSize)}`}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </Dropzone>\n {files?.length ? (\n <div className=\"h-fit w-full overflow-y-auto\">\n <div className=\"flex items-center justify-between px-3 py-2.5\">\n <div className=\"flex items-center gap-1\">\n <Image\n className=\"text-muted-foreground size-4\"\n aria-hidden=\"true\"\n />\n <p className=\"text-sm\">Ảnh đã tải lên ({files.length})</p>\n </div>\n <button\n className=\"hover:text-muted-foreground text-muted-foreground/60 flex cursor-pointer items-center gap-1 transition-colors duration-200\"\n onClick={() => {\n if (!files) return;\n files.forEach((file) => {\n if (!isFileWithPreview(file)) return;\n URL.revokeObjectURL(file.preview);\n });\n setFiles([]);\n onValueChange?.([]);\n }}\n >\n <Trash2 size={16} aria-hidden=\"true\" />\n <p className=\"text-sm\">Xóa tất cả</p>\n </button>\n </div>\n <div className=\"flex flex-col gap-2.5\">\n {files?.map((file, index) => (\n <FileCard\n key={index}\n file={file}\n onRemove={() => onRemove(index)}\n progress={progresses?.[file.name]}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface FileCardProps {\n file: File;\n onRemove: () => void;\n progress?: number;\n}\n\nfunction FileCard({ file, progress, onRemove }: FileCardProps) {\n return (\n <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\">\n <div className=\"flex flex-1 gap-2.5\">\n {isFileWithPreview(file) ? <FilePreview file={file} /> : null}\n <div className=\"flex w-full flex-col gap-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <p className=\"text-accent-foreground line-clamp-1 text-sm\">\n {file.name}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {formatBytes(file.size)}\n </p>\n </div>\n {progress ? <Progress value={progress} /> : null}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onRemove}\n >\n <Trash2\n size={16}\n className=\"text-muted-foreground/60\"\n aria-hidden=\"true\"\n />\n <span className=\"sr-only\">Remove file</span>\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isFileWithPreview(file: File): file is File & { preview: string } {\n return \"preview\" in file && typeof file.preview === \"string\";\n}\n\ninterface FilePreviewProps {\n file: File & { preview: string };\n}\n\nfunction FilePreview({ file }: FilePreviewProps) {\n if (file.type.startsWith(\"image/\")) {\n return (\n <img\n src={file.preview}\n className=\"border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm\"\n />\n );\n }\n\n return (\n <FileText\n className=\"text-muted-foreground size-10 border\"\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"file-uploader.cjs","names":["React","setValue: React.Dispatch<React.SetStateAction<T | undefined>>","React","value","React","Dropzone","cn","Upload","formatBytes","Image","Trash2","Progress","Button","FileText"],"sources":["../../packages/hooks/use-callback-ref.ts","../../packages/hooks/use-controllable-state.ts","../../packages/components/ui/file-uploader.tsx"],"sourcesContent":["import React from \"react\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined,\n): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(\n () => ((...args) => callbackRef.current?.(...args)) as T,\n [],\n );\n}\n\nexport { useCallbackRef };\n","import React from \"react\";\n\nimport { useCallbackRef } from \"./use-callback-ref\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-controllable-state/src/useControllableState.tsx\n */\n\ntype UseControllableStateParams<T> = {\n prop?: T | undefined;\n defaultProp?: T | undefined;\n onChange?: (state: T) => void;\n};\n\ntype SetStateFn<T> = (prevState?: T) => T;\n\nfunction useControllableState<T>({\n prop,\n defaultProp,\n onChange = () => {},\n}: UseControllableStateParams<T>) {\n const [uncontrolledProp, setUncontrolledProp] = useUncontrolledState({\n defaultProp,\n onChange,\n });\n const isControlled = prop !== undefined;\n const value = isControlled ? prop : uncontrolledProp;\n const handleChange = useCallbackRef(onChange);\n\n const setValue: React.Dispatch<React.SetStateAction<T | undefined>> =\n React.useCallback(\n (nextValue) => {\n if (isControlled) {\n const setter = nextValue as SetStateFn<T>;\n const value =\n typeof nextValue === \"function\" ? setter(prop) : nextValue;\n if (value !== prop) handleChange(value as T);\n } else {\n setUncontrolledProp(nextValue);\n }\n },\n [isControlled, prop, setUncontrolledProp, handleChange],\n );\n\n return [value, setValue] as const;\n}\n\nfunction useUncontrolledState<T>({\n defaultProp,\n onChange,\n}: Omit<UseControllableStateParams<T>, \"prop\">) {\n const uncontrolledState = React.useState<T | undefined>(defaultProp);\n const [value] = uncontrolledState;\n const prevValueRef = React.useRef(value);\n const handleChange = useCallbackRef(onChange);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n handleChange(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef, handleChange]);\n\n return uncontrolledState;\n}\n\nexport { useControllableState };\n","\"use client\";\nimport React from \"react\";\nimport { FileText, Image, Trash2, Upload } from \"lucide-react\";\nimport Dropzone, {\n type DropzoneProps,\n type FileRejection,\n} from \"react-dropzone\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useControllableState } from \"@/hooks/use-controllable-state\";\nimport { cn, formatBytes } from \"@/lib/utils\";\n\ninterface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Value of the uploader.\n * @type File[]\n * @default undefined\n * @example value={files}\n */\n value?: File[];\n\n /**\n * Function to be called when the value changes.\n * @type (files: File[]) => void\n * @default undefined\n * @example onValueChange={(files) => setFiles(files)}\n */\n onValueChange?: (files: File[]) => void;\n\n /**\n * Function to be called when files are uploaded.\n * @type (files: File[]) => Promise<void>\n * @default undefined\n * @example onUpload={(files) => uploadFiles(files)}\n */\n onUpload?: (files: File[]) => Promise<void>;\n\n /**\n * Progress of the uploaded files.\n * @type Record<string, number> | undefined\n * @default undefined\n * @example progresses={{ \"file1.png\": 50 }}\n */\n progresses?: Record<string, number>;\n\n /**\n * Accepted file types for the uploader.\n * @type { [key: string]: string[]}\n * @default\n * ```ts\n * { \"image/*\": [] }\n * ```\n * @example accept={[\"image/png\", \"image/jpeg\"]}\n */\n accept?: DropzoneProps[\"accept\"];\n\n /**\n * Maximum file size for the uploader.\n * @type number | undefined\n * @default 1024 * 1024 * 2 // 2MB\n * @example maxSize={1024 * 1024 * 2} // 2MB\n */\n maxSize?: DropzoneProps[\"maxSize\"];\n\n /**\n * Maximum number of files for the uploader.\n * @type number | undefined\n * @default 1\n * @example maxFileCount={4}\n */\n maxFileCount?: DropzoneProps[\"maxFiles\"];\n\n /**\n * Whether the uploader should accept multiple files.\n * @type boolean\n * @default false\n * @example multiple\n */\n multiple?: boolean;\n\n /**\n * Whether the uploader is disabled.\n * @type boolean\n * @default false\n * @example disabled\n */\n disabled?: boolean;\n\n showText?: boolean;\n iconSize?: number;\n}\n\nexport function FileUploader(props: FileUploaderProps) {\n const {\n value: valueProp,\n onValueChange,\n onUpload,\n progresses,\n accept = {\n \"image/*\": [],\n },\n maxSize = 1024 * 1024 * 2,\n maxFileCount = 1,\n multiple = false,\n disabled = false,\n showText = true,\n iconSize,\n className,\n ...dropzoneProps\n } = props;\n\n const [files, setFiles] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n });\n\n const onDrop = React.useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n if (!multiple && maxFileCount === 1 && acceptedFiles.length > 1) {\n toast.error(\"Cannot upload more than 1 file at a time\");\n\n return;\n }\n\n if ((files?.length ?? 0) + acceptedFiles.length > maxFileCount) {\n toast.error(`Cannot upload more than ${maxFileCount} files`);\n return;\n }\n\n const newFiles = acceptedFiles.map((file) =>\n Object.assign(file, {\n preview: URL.createObjectURL(file),\n }),\n );\n\n const updatedFiles = files ? [...files, ...newFiles] : newFiles;\n\n setFiles(updatedFiles);\n\n if (rejectedFiles.length > 0) {\n rejectedFiles.forEach(({ file }) => {\n toast.error(`File ${file.name} was rejected`);\n });\n }\n\n if (\n onUpload &&\n updatedFiles.length > 0 &&\n updatedFiles.length <= maxFileCount\n ) {\n const target =\n updatedFiles.length > 0 ? `${updatedFiles.length} files` : `file`;\n\n onUpload(updatedFiles).then(() => {\n setFiles([]);\n toast(`${target} uploaded`);\n });\n }\n },\n\n [files, maxFileCount, multiple, onUpload, setFiles],\n );\n\n function onRemove(index: number) {\n if (!files) return;\n\n if (isFileWithPreview(files[index])) {\n URL.revokeObjectURL(files[index].preview);\n }\n\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onValueChange?.(newFiles);\n }\n\n // Revoke preview url when component unmounts\n React.useEffect(() => {\n return () => {\n if (!files) return;\n files.forEach((file) => {\n if (isFileWithPreview(file)) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const isDisabled = disabled || (files?.length ?? 0) >= maxFileCount;\n\n return (\n <div className=\"relative flex w-full flex-col gap-6\">\n <Dropzone\n onDrop={onDrop}\n accept={accept}\n maxSize={maxSize}\n maxFiles={maxFileCount}\n multiple={maxFileCount > 1 || multiple}\n disabled={isDisabled}\n >\n {({ getRootProps, getInputProps, isDragActive }) => (\n <div\n {...getRootProps()}\n className={cn(\n \"group\",\n \"border-muted-foreground/25\",\n \"hover:bg-muted/25\",\n \"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\",\n \"ring-offset-background\",\n \"focus-visible:ring-ring\",\n \"focus-visible:ring-2\",\n \"focus-visible:ring-offset-2\",\n \"focus-visible:outline-hidden\",\n isDragActive && \"border-muted-foreground/50\",\n isDisabled && \"pointer-events-none opacity-60\",\n className,\n )}\n {...dropzoneProps}\n >\n <input {...getInputProps()} />\n {isDragActive ? (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n className=\"text-muted-foreground size-7\"\n aria-hidden=\"true\"\n />\n </div>\n <p className=\"text-muted-foreground font-medium\">\n Drop the files here\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n size={iconSize || 24}\n className=\"text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </div>\n {showText && (\n <div className=\"flex flex-col gap-px\">\n <p className=\"text-muted-foreground text-xs font-medium\">\n Drag {`'n'`} drop files here, or click to select files\n </p>\n <p className=\"text-muted-foreground/70 text-xs\">\n You can upload\n {maxFileCount > 1\n ? ` ${maxFileCount === Infinity ? \"multiple\" : maxFileCount}\n files (up to ${formatBytes(maxSize)} each)`\n : ` a file with ${formatBytes(maxSize)}`}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </Dropzone>\n {files?.length ? (\n <div className=\"h-fit w-full overflow-y-auto\">\n <div className=\"flex items-center justify-between px-3 py-2.5\">\n <div className=\"flex items-center gap-1\">\n <Image\n className=\"text-muted-foreground size-4\"\n aria-hidden=\"true\"\n />\n <p className=\"text-sm\">Ảnh đã tải lên ({files.length})</p>\n </div>\n <button\n className=\"hover:text-muted-foreground text-muted-foreground/60 flex cursor-pointer items-center gap-1 transition-colors duration-200\"\n onClick={() => {\n if (!files) return;\n files.forEach((file) => {\n if (!isFileWithPreview(file)) return;\n URL.revokeObjectURL(file.preview);\n });\n setFiles([]);\n onValueChange?.([]);\n }}\n >\n <Trash2 size={16} aria-hidden=\"true\" />\n <p className=\"text-sm\">Xóa tất cả</p>\n </button>\n </div>\n <div className=\"flex flex-col gap-2.5\">\n {files?.map((file, index) => (\n <FileCard\n key={index}\n file={file}\n onRemove={() => onRemove(index)}\n progress={progresses?.[file.name]}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface FileCardProps {\n file: File;\n onRemove: () => void;\n progress?: number;\n}\n\nfunction FileCard({ file, progress, onRemove }: FileCardProps) {\n return (\n <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\">\n <div className=\"flex flex-1 gap-2.5\">\n {isFileWithPreview(file) ? <FilePreview file={file} /> : null}\n <div className=\"flex w-full flex-col gap-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <p className=\"text-accent-foreground line-clamp-1 text-sm\">\n {file.name}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {formatBytes(file.size)}\n </p>\n </div>\n {progress ? <Progress value={progress} /> : null}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onRemove}\n >\n <Trash2\n size={16}\n className=\"text-muted-foreground/60\"\n aria-hidden=\"true\"\n />\n <span className=\"sr-only\">Remove file</span>\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isFileWithPreview(file: File): file is File & { preview: string } {\n return \"preview\" in file && typeof file.preview === \"string\";\n}\n\ninterface FilePreviewProps {\n file: File & { preview: string };\n}\n\nfunction FilePreview({ file }: FilePreviewProps) {\n if (file.type.startsWith(\"image/\")) {\n return (\n <img\n src={file.preview}\n className=\"border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm\"\n />\n );\n }\n\n return (\n <FileText\n className=\"text-muted-foreground size-10 border\"\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import * as react_jsx_runtime79 from "react/jsx-runtime";
1
2
  import React from "react";
2
3
  import { DropzoneProps } from "react-dropzone";
3
4
 
@@ -72,7 +73,7 @@ interface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {
72
73
  showText?: boolean;
73
74
  iconSize?: number;
74
75
  }
75
- declare function FileUploader(props: FileUploaderProps): any;
76
+ declare function FileUploader(props: FileUploaderProps): react_jsx_runtime79.JSX.Element;
76
77
  //#endregion
77
78
  export { FileUploader };
78
79
  //# sourceMappingURL=file-uploader.d.cts.map
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import * as react_jsx_runtime88 from "react/jsx-runtime";
2
3
  import { DropzoneProps } from "react-dropzone";
3
4
 
4
5
  //#region packages/components/ui/file-uploader.d.ts
@@ -72,7 +73,7 @@ interface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {
72
73
  showText?: boolean;
73
74
  iconSize?: number;
74
75
  }
75
- declare function FileUploader(props: FileUploaderProps): any;
76
+ declare function FileUploader(props: FileUploaderProps): react_jsx_runtime88.JSX.Element;
76
77
  //#endregion
77
78
  export { FileUploader };
78
79
  //# sourceMappingURL=file-uploader.d.ts.map
@@ -1,3 +1,3 @@
1
- "use client";import{cn as e,formatBytes as t}from"../utils-D9AH0PUV.js";import{Button as n}from"../button-Bku3bKv9.js";import{Progress as r}from"../progress-CBccqUUJ.js";import i from"react";import{jsx as a,jsxs as o}from"react/jsx-runtime";import{FileText as s,Image as c,Trash2 as l,Upload as u}from"lucide-react";import d from"react-dropzone";import{toast as f}from"sonner";function p(e){let t=i.useRef(e);return i.useEffect(()=>{t.current=e}),i.useMemo(()=>((...e)=>t.current?.(...e)),[])}function m({prop:e,defaultProp:t,onChange:n=()=>{}}){let[r,a]=h({defaultProp:t,onChange:n}),o=e!==void 0,s=o?e:r,c=p(n),l=i.useCallback(t=>{if(o){let n=t,r=typeof t==`function`?n(e):t;r!==e&&c(r)}else a(t)},[o,e,a,c]);return[s,l]}function h({defaultProp:e,onChange:t}){let n=i.useState(e),[r]=n,a=i.useRef(r),o=p(t);return i.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}function g(n){let{value:r,onValueChange:s,onUpload:p,progresses:h,accept:g={"image/*":[]},maxSize:y=1024*1024*2,maxFileCount:b=1,multiple:x=!1,disabled:S=!1,showText:C=!0,iconSize:w,className:T,...E}=n,[D,O]=m({prop:r,onChange:s}),k=i.useCallback((e,t)=>{if(!x&&b===1&&e.length>1){f.error(`Cannot upload more than 1 file at a time`);return}if((D?.length??0)+e.length>b){f.error(`Cannot upload more than ${b} files`);return}let n=e.map(e=>Object.assign(e,{preview:URL.createObjectURL(e)})),r=D?[...D,...n]:n;if(O(r),t.length>0&&t.forEach(({file:e})=>{f.error(`File ${e.name} was rejected`)}),p&&r.length>0&&r.length<=b){let e=r.length>0?`${r.length} files`:`file`;p(r).then(()=>{O([]),f(`${e} uploaded`)})}},[D,b,x,p,O]);function A(e){if(!D)return;v(D[e])&&URL.revokeObjectURL(D[e].preview);let t=D.filter((t,n)=>n!==e);O(t),s?.(t)}i.useEffect(()=>()=>{D&&D.forEach(e=>{v(e)&&URL.revokeObjectURL(e.preview)})},[]);let j=S||(D?.length??0)>=b;return o(`div`,{className:`relative flex w-full flex-col gap-6`,children:[a(d,{onDrop:k,accept:g,maxSize:y,maxFiles:b,multiple:b>1||x,disabled:j,children:({getRootProps:n,getInputProps:r,isDragActive:i})=>o(`div`,{...n(),className:e(`group`,`border-muted-foreground/25`,`hover:bg-muted/25`,`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`,`ring-offset-background`,`focus-visible:ring-ring`,`focus-visible:ring-2`,`focus-visible:ring-offset-2`,`focus-visible:outline-hidden`,i&&`border-muted-foreground/50`,j&&`pointer-events-none opacity-60`,T),...E,children:[a(`input`,{...r()}),i?o(`div`,{className:`flex flex-col items-center justify-center gap-4 sm:px-5`,children:[a(`div`,{className:`rounded-full border border-dashed p-3`,children:a(u,{className:`text-muted-foreground size-7`,"aria-hidden":`true`})}),a(`p`,{className:`text-muted-foreground font-medium`,children:`Drop the files here`})]}):o(`div`,{className:`flex flex-col items-center justify-center gap-4 sm:px-5`,children:[a(`div`,{className:`rounded-full border border-dashed p-3`,children:a(u,{size:w||24,className:`text-muted-foreground`,"aria-hidden":`true`})}),C&&o(`div`,{className:`flex flex-col gap-px`,children:[o(`p`,{className:`text-muted-foreground text-xs font-medium`,children:[`Drag `,`'n'`,` drop files here, or click to select files`]}),o(`p`,{className:`text-muted-foreground/70 text-xs`,children:[`You can upload`,b>1?` ${b===1/0?`multiple`:b}
1
+ "use client";import{cn as e,formatBytes as t}from"../utils-D9AH0PUV.js";import{Button as n}from"../button-Bku3bKv9.js";import{Progress as r}from"../progress-CeXKNvJc.js";import i from"react";import{jsx as a,jsxs as o}from"react/jsx-runtime";import{FileText as s,Image as c,Trash2 as l,Upload as u}from"lucide-react";import d from"react-dropzone";import{toast as f}from"sonner";function p(e){let t=i.useRef(e);return i.useEffect(()=>{t.current=e}),i.useMemo(()=>((...e)=>t.current?.(...e)),[])}function m({prop:e,defaultProp:t,onChange:n=()=>{}}){let[r,a]=h({defaultProp:t,onChange:n}),o=e!==void 0,s=o?e:r,c=p(n),l=i.useCallback(t=>{if(o){let n=t,r=typeof t==`function`?n(e):t;r!==e&&c(r)}else a(t)},[o,e,a,c]);return[s,l]}function h({defaultProp:e,onChange:t}){let n=i.useState(e),[r]=n,a=i.useRef(r),o=p(t);return i.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}function g(n){let{value:r,onValueChange:s,onUpload:p,progresses:h,accept:g={"image/*":[]},maxSize:y=1024*1024*2,maxFileCount:b=1,multiple:x=!1,disabled:S=!1,showText:C=!0,iconSize:w,className:T,...E}=n,[D,O]=m({prop:r,onChange:s}),k=i.useCallback((e,t)=>{if(!x&&b===1&&e.length>1){f.error(`Cannot upload more than 1 file at a time`);return}if((D?.length??0)+e.length>b){f.error(`Cannot upload more than ${b} files`);return}let n=e.map(e=>Object.assign(e,{preview:URL.createObjectURL(e)})),r=D?[...D,...n]:n;if(O(r),t.length>0&&t.forEach(({file:e})=>{f.error(`File ${e.name} was rejected`)}),p&&r.length>0&&r.length<=b){let e=r.length>0?`${r.length} files`:`file`;p(r).then(()=>{O([]),f(`${e} uploaded`)})}},[D,b,x,p,O]);function A(e){if(!D)return;v(D[e])&&URL.revokeObjectURL(D[e].preview);let t=D.filter((t,n)=>n!==e);O(t),s?.(t)}i.useEffect(()=>()=>{D&&D.forEach(e=>{v(e)&&URL.revokeObjectURL(e.preview)})},[]);let j=S||(D?.length??0)>=b;return o(`div`,{className:`relative flex w-full flex-col gap-6`,children:[a(d,{onDrop:k,accept:g,maxSize:y,maxFiles:b,multiple:b>1||x,disabled:j,children:({getRootProps:n,getInputProps:r,isDragActive:i})=>o(`div`,{...n(),className:e(`group`,`border-muted-foreground/25`,`hover:bg-muted/25`,`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`,`ring-offset-background`,`focus-visible:ring-ring`,`focus-visible:ring-2`,`focus-visible:ring-offset-2`,`focus-visible:outline-hidden`,i&&`border-muted-foreground/50`,j&&`pointer-events-none opacity-60`,T),...E,children:[a(`input`,{...r()}),i?o(`div`,{className:`flex flex-col items-center justify-center gap-4 sm:px-5`,children:[a(`div`,{className:`rounded-full border border-dashed p-3`,children:a(u,{className:`text-muted-foreground size-7`,"aria-hidden":`true`})}),a(`p`,{className:`text-muted-foreground font-medium`,children:`Drop the files here`})]}):o(`div`,{className:`flex flex-col items-center justify-center gap-4 sm:px-5`,children:[a(`div`,{className:`rounded-full border border-dashed p-3`,children:a(u,{size:w||24,className:`text-muted-foreground`,"aria-hidden":`true`})}),C&&o(`div`,{className:`flex flex-col gap-px`,children:[o(`p`,{className:`text-muted-foreground text-xs font-medium`,children:[`Drag `,`'n'`,` drop files here, or click to select files`]}),o(`p`,{className:`text-muted-foreground/70 text-xs`,children:[`You can upload`,b>1?` ${b===1/0?`multiple`:b}
2
2
  files (up to ${t(y)} each)`:` a file with ${t(y)}`]})]})]})]})}),D?.length?o(`div`,{className:`h-fit w-full overflow-y-auto`,children:[o(`div`,{className:`flex items-center justify-between px-3 py-2.5`,children:[o(`div`,{className:`flex items-center gap-1`,children:[a(c,{className:`text-muted-foreground size-4`,"aria-hidden":`true`}),o(`p`,{className:`text-sm`,children:[`Ảnh đã tải lên (`,D.length,`)`]})]}),o(`button`,{className:`hover:text-muted-foreground text-muted-foreground/60 flex cursor-pointer items-center gap-1 transition-colors duration-200`,onClick:()=>{D&&(D.forEach(e=>{v(e)&&URL.revokeObjectURL(e.preview)}),O([]),s?.([]))},children:[a(l,{size:16,"aria-hidden":`true`}),a(`p`,{className:`text-sm`,children:`Xóa tất cả`})]})]}),a(`div`,{className:`flex flex-col gap-2.5`,children:D?.map((e,t)=>a(_,{file:e,onRemove:()=>A(t),progress:h?.[e.name]},t))})]}):null]})}function _({file:e,progress:i,onRemove:s}){return o(`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`,children:[o(`div`,{className:`flex flex-1 gap-2.5`,children:[v(e)?a(y,{file:e}):null,o(`div`,{className:`flex w-full flex-col gap-2`,children:[o(`div`,{className:`flex flex-col gap-y-0.5`,children:[a(`p`,{className:`text-accent-foreground line-clamp-1 text-sm`,children:e.name}),a(`p`,{className:`text-muted-foreground text-xs`,children:t(e.size)})]}),i?a(r,{value:i}):null]})]}),a(`div`,{className:`flex items-center gap-2`,children:o(n,{type:`button`,variant:`ghost`,size:`icon`,className:`size-7`,onClick:s,children:[a(l,{size:16,className:`text-muted-foreground/60`,"aria-hidden":`true`}),a(`span`,{className:`sr-only`,children:`Remove file`})]})})]})}function v(e){return`preview`in e&&typeof e.preview==`string`}function y({file:e}){return e.type.startsWith(`image/`)?a(`img`,{src:e.preview,className:`border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm`}):a(s,{className:`text-muted-foreground size-10 border`,"aria-hidden":`true`})}export{g as FileUploader};
3
3
  //# sourceMappingURL=file-uploader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.js","names":["setValue: React.Dispatch<React.SetStateAction<T | undefined>>","value"],"sources":["../../packages/hooks/use-callback-ref.ts","../../packages/hooks/use-controllable-state.ts","../../packages/components/ui/file-uploader.tsx"],"sourcesContent":["import React from \"react\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined,\n): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(\n () => ((...args) => callbackRef.current?.(...args)) as T,\n [],\n );\n}\n\nexport { useCallbackRef };\n","import React from \"react\";\n\nimport { useCallbackRef } from \"./use-callback-ref\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-controllable-state/src/useControllableState.tsx\n */\n\ntype UseControllableStateParams<T> = {\n prop?: T | undefined;\n defaultProp?: T | undefined;\n onChange?: (state: T) => void;\n};\n\ntype SetStateFn<T> = (prevState?: T) => T;\n\nfunction useControllableState<T>({\n prop,\n defaultProp,\n onChange = () => {},\n}: UseControllableStateParams<T>) {\n const [uncontrolledProp, setUncontrolledProp] = useUncontrolledState({\n defaultProp,\n onChange,\n });\n const isControlled = prop !== undefined;\n const value = isControlled ? prop : uncontrolledProp;\n const handleChange = useCallbackRef(onChange);\n\n const setValue: React.Dispatch<React.SetStateAction<T | undefined>> =\n React.useCallback(\n (nextValue) => {\n if (isControlled) {\n const setter = nextValue as SetStateFn<T>;\n const value =\n typeof nextValue === \"function\" ? setter(prop) : nextValue;\n if (value !== prop) handleChange(value as T);\n } else {\n setUncontrolledProp(nextValue);\n }\n },\n [isControlled, prop, setUncontrolledProp, handleChange],\n );\n\n return [value, setValue] as const;\n}\n\nfunction useUncontrolledState<T>({\n defaultProp,\n onChange,\n}: Omit<UseControllableStateParams<T>, \"prop\">) {\n const uncontrolledState = React.useState<T | undefined>(defaultProp);\n const [value] = uncontrolledState;\n const prevValueRef = React.useRef(value);\n const handleChange = useCallbackRef(onChange);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n handleChange(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef, handleChange]);\n\n return uncontrolledState;\n}\n\nexport { useControllableState };\n","\"use client\";\nimport React from \"react\";\nimport { FileText, Image, Trash2, Upload } from \"lucide-react\";\nimport Dropzone, {\n type DropzoneProps,\n type FileRejection,\n} from \"react-dropzone\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useControllableState } from \"@/hooks/use-controllable-state\";\nimport { cn, formatBytes } from \"@/lib/utils\";\n\ninterface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Value of the uploader.\n * @type File[]\n * @default undefined\n * @example value={files}\n */\n value?: File[];\n\n /**\n * Function to be called when the value changes.\n * @type (files: File[]) => void\n * @default undefined\n * @example onValueChange={(files) => setFiles(files)}\n */\n onValueChange?: (files: File[]) => void;\n\n /**\n * Function to be called when files are uploaded.\n * @type (files: File[]) => Promise<void>\n * @default undefined\n * @example onUpload={(files) => uploadFiles(files)}\n */\n onUpload?: (files: File[]) => Promise<void>;\n\n /**\n * Progress of the uploaded files.\n * @type Record<string, number> | undefined\n * @default undefined\n * @example progresses={{ \"file1.png\": 50 }}\n */\n progresses?: Record<string, number>;\n\n /**\n * Accepted file types for the uploader.\n * @type { [key: string]: string[]}\n * @default\n * ```ts\n * { \"image/*\": [] }\n * ```\n * @example accept={[\"image/png\", \"image/jpeg\"]}\n */\n accept?: DropzoneProps[\"accept\"];\n\n /**\n * Maximum file size for the uploader.\n * @type number | undefined\n * @default 1024 * 1024 * 2 // 2MB\n * @example maxSize={1024 * 1024 * 2} // 2MB\n */\n maxSize?: DropzoneProps[\"maxSize\"];\n\n /**\n * Maximum number of files for the uploader.\n * @type number | undefined\n * @default 1\n * @example maxFileCount={4}\n */\n maxFileCount?: DropzoneProps[\"maxFiles\"];\n\n /**\n * Whether the uploader should accept multiple files.\n * @type boolean\n * @default false\n * @example multiple\n */\n multiple?: boolean;\n\n /**\n * Whether the uploader is disabled.\n * @type boolean\n * @default false\n * @example disabled\n */\n disabled?: boolean;\n\n showText?: boolean;\n iconSize?: number;\n}\n\nexport function FileUploader(props: FileUploaderProps) {\n const {\n value: valueProp,\n onValueChange,\n onUpload,\n progresses,\n accept = {\n \"image/*\": [],\n },\n maxSize = 1024 * 1024 * 2,\n maxFileCount = 1,\n multiple = false,\n disabled = false,\n showText = true,\n iconSize,\n className,\n ...dropzoneProps\n } = props;\n\n const [files, setFiles] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n });\n\n const onDrop = React.useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n if (!multiple && maxFileCount === 1 && acceptedFiles.length > 1) {\n toast.error(\"Cannot upload more than 1 file at a time\");\n\n return;\n }\n\n if ((files?.length ?? 0) + acceptedFiles.length > maxFileCount) {\n toast.error(`Cannot upload more than ${maxFileCount} files`);\n return;\n }\n\n const newFiles = acceptedFiles.map((file) =>\n Object.assign(file, {\n preview: URL.createObjectURL(file),\n }),\n );\n\n const updatedFiles = files ? [...files, ...newFiles] : newFiles;\n\n setFiles(updatedFiles);\n\n if (rejectedFiles.length > 0) {\n rejectedFiles.forEach(({ file }) => {\n toast.error(`File ${file.name} was rejected`);\n });\n }\n\n if (\n onUpload &&\n updatedFiles.length > 0 &&\n updatedFiles.length <= maxFileCount\n ) {\n const target =\n updatedFiles.length > 0 ? `${updatedFiles.length} files` : `file`;\n\n onUpload(updatedFiles).then(() => {\n setFiles([]);\n toast(`${target} uploaded`);\n });\n }\n },\n\n [files, maxFileCount, multiple, onUpload, setFiles],\n );\n\n function onRemove(index: number) {\n if (!files) return;\n\n if (isFileWithPreview(files[index])) {\n URL.revokeObjectURL(files[index].preview);\n }\n\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onValueChange?.(newFiles);\n }\n\n // Revoke preview url when component unmounts\n React.useEffect(() => {\n return () => {\n if (!files) return;\n files.forEach((file) => {\n if (isFileWithPreview(file)) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const isDisabled = disabled || (files?.length ?? 0) >= maxFileCount;\n\n return (\n <div className=\"relative flex w-full flex-col gap-6\">\n <Dropzone\n onDrop={onDrop}\n accept={accept}\n maxSize={maxSize}\n maxFiles={maxFileCount}\n multiple={maxFileCount > 1 || multiple}\n disabled={isDisabled}\n >\n {({ getRootProps, getInputProps, isDragActive }) => (\n <div\n {...getRootProps()}\n className={cn(\n \"group\",\n \"border-muted-foreground/25\",\n \"hover:bg-muted/25\",\n \"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\",\n \"ring-offset-background\",\n \"focus-visible:ring-ring\",\n \"focus-visible:ring-2\",\n \"focus-visible:ring-offset-2\",\n \"focus-visible:outline-hidden\",\n isDragActive && \"border-muted-foreground/50\",\n isDisabled && \"pointer-events-none opacity-60\",\n className,\n )}\n {...dropzoneProps}\n >\n <input {...getInputProps()} />\n {isDragActive ? (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n className=\"text-muted-foreground size-7\"\n aria-hidden=\"true\"\n />\n </div>\n <p className=\"text-muted-foreground font-medium\">\n Drop the files here\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n size={iconSize || 24}\n className=\"text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </div>\n {showText && (\n <div className=\"flex flex-col gap-px\">\n <p className=\"text-muted-foreground text-xs font-medium\">\n Drag {`'n'`} drop files here, or click to select files\n </p>\n <p className=\"text-muted-foreground/70 text-xs\">\n You can upload\n {maxFileCount > 1\n ? ` ${maxFileCount === Infinity ? \"multiple\" : maxFileCount}\n files (up to ${formatBytes(maxSize)} each)`\n : ` a file with ${formatBytes(maxSize)}`}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </Dropzone>\n {files?.length ? (\n <div className=\"h-fit w-full overflow-y-auto\">\n <div className=\"flex items-center justify-between px-3 py-2.5\">\n <div className=\"flex items-center gap-1\">\n <Image\n className=\"text-muted-foreground size-4\"\n aria-hidden=\"true\"\n />\n <p className=\"text-sm\">Ảnh đã tải lên ({files.length})</p>\n </div>\n <button\n className=\"hover:text-muted-foreground text-muted-foreground/60 flex cursor-pointer items-center gap-1 transition-colors duration-200\"\n onClick={() => {\n if (!files) return;\n files.forEach((file) => {\n if (!isFileWithPreview(file)) return;\n URL.revokeObjectURL(file.preview);\n });\n setFiles([]);\n onValueChange?.([]);\n }}\n >\n <Trash2 size={16} aria-hidden=\"true\" />\n <p className=\"text-sm\">Xóa tất cả</p>\n </button>\n </div>\n <div className=\"flex flex-col gap-2.5\">\n {files?.map((file, index) => (\n <FileCard\n key={index}\n file={file}\n onRemove={() => onRemove(index)}\n progress={progresses?.[file.name]}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface FileCardProps {\n file: File;\n onRemove: () => void;\n progress?: number;\n}\n\nfunction FileCard({ file, progress, onRemove }: FileCardProps) {\n return (\n <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\">\n <div className=\"flex flex-1 gap-2.5\">\n {isFileWithPreview(file) ? <FilePreview file={file} /> : null}\n <div className=\"flex w-full flex-col gap-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <p className=\"text-accent-foreground line-clamp-1 text-sm\">\n {file.name}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {formatBytes(file.size)}\n </p>\n </div>\n {progress ? <Progress value={progress} /> : null}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onRemove}\n >\n <Trash2\n size={16}\n className=\"text-muted-foreground/60\"\n aria-hidden=\"true\"\n />\n <span className=\"sr-only\">Remove file</span>\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isFileWithPreview(file: File): file is File & { preview: string } {\n return \"preview\" in file && typeof file.preview === \"string\";\n}\n\ninterface FilePreviewProps {\n file: File & { preview: string };\n}\n\nfunction FilePreview({ file }: FilePreviewProps) {\n if (file.type.startsWith(\"image/\")) {\n return (\n <img\n src={file.preview}\n className=\"border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm\"\n />\n );\n }\n\n return (\n <FileText\n className=\"text-muted-foreground size-10 border\"\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"file-uploader.js","names":["setValue: React.Dispatch<React.SetStateAction<T | undefined>>","value"],"sources":["../../packages/hooks/use-callback-ref.ts","../../packages/hooks/use-controllable-state.ts","../../packages/components/ui/file-uploader.tsx"],"sourcesContent":["import React from \"react\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined,\n): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(\n () => ((...args) => callbackRef.current?.(...args)) as T,\n [],\n );\n}\n\nexport { useCallbackRef };\n","import React from \"react\";\n\nimport { useCallbackRef } from \"./use-callback-ref\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-controllable-state/src/useControllableState.tsx\n */\n\ntype UseControllableStateParams<T> = {\n prop?: T | undefined;\n defaultProp?: T | undefined;\n onChange?: (state: T) => void;\n};\n\ntype SetStateFn<T> = (prevState?: T) => T;\n\nfunction useControllableState<T>({\n prop,\n defaultProp,\n onChange = () => {},\n}: UseControllableStateParams<T>) {\n const [uncontrolledProp, setUncontrolledProp] = useUncontrolledState({\n defaultProp,\n onChange,\n });\n const isControlled = prop !== undefined;\n const value = isControlled ? prop : uncontrolledProp;\n const handleChange = useCallbackRef(onChange);\n\n const setValue: React.Dispatch<React.SetStateAction<T | undefined>> =\n React.useCallback(\n (nextValue) => {\n if (isControlled) {\n const setter = nextValue as SetStateFn<T>;\n const value =\n typeof nextValue === \"function\" ? setter(prop) : nextValue;\n if (value !== prop) handleChange(value as T);\n } else {\n setUncontrolledProp(nextValue);\n }\n },\n [isControlled, prop, setUncontrolledProp, handleChange],\n );\n\n return [value, setValue] as const;\n}\n\nfunction useUncontrolledState<T>({\n defaultProp,\n onChange,\n}: Omit<UseControllableStateParams<T>, \"prop\">) {\n const uncontrolledState = React.useState<T | undefined>(defaultProp);\n const [value] = uncontrolledState;\n const prevValueRef = React.useRef(value);\n const handleChange = useCallbackRef(onChange);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n handleChange(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef, handleChange]);\n\n return uncontrolledState;\n}\n\nexport { useControllableState };\n","\"use client\";\nimport React from \"react\";\nimport { FileText, Image, Trash2, Upload } from \"lucide-react\";\nimport Dropzone, {\n type DropzoneProps,\n type FileRejection,\n} from \"react-dropzone\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useControllableState } from \"@/hooks/use-controllable-state\";\nimport { cn, formatBytes } from \"@/lib/utils\";\n\ninterface FileUploaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Value of the uploader.\n * @type File[]\n * @default undefined\n * @example value={files}\n */\n value?: File[];\n\n /**\n * Function to be called when the value changes.\n * @type (files: File[]) => void\n * @default undefined\n * @example onValueChange={(files) => setFiles(files)}\n */\n onValueChange?: (files: File[]) => void;\n\n /**\n * Function to be called when files are uploaded.\n * @type (files: File[]) => Promise<void>\n * @default undefined\n * @example onUpload={(files) => uploadFiles(files)}\n */\n onUpload?: (files: File[]) => Promise<void>;\n\n /**\n * Progress of the uploaded files.\n * @type Record<string, number> | undefined\n * @default undefined\n * @example progresses={{ \"file1.png\": 50 }}\n */\n progresses?: Record<string, number>;\n\n /**\n * Accepted file types for the uploader.\n * @type { [key: string]: string[]}\n * @default\n * ```ts\n * { \"image/*\": [] }\n * ```\n * @example accept={[\"image/png\", \"image/jpeg\"]}\n */\n accept?: DropzoneProps[\"accept\"];\n\n /**\n * Maximum file size for the uploader.\n * @type number | undefined\n * @default 1024 * 1024 * 2 // 2MB\n * @example maxSize={1024 * 1024 * 2} // 2MB\n */\n maxSize?: DropzoneProps[\"maxSize\"];\n\n /**\n * Maximum number of files for the uploader.\n * @type number | undefined\n * @default 1\n * @example maxFileCount={4}\n */\n maxFileCount?: DropzoneProps[\"maxFiles\"];\n\n /**\n * Whether the uploader should accept multiple files.\n * @type boolean\n * @default false\n * @example multiple\n */\n multiple?: boolean;\n\n /**\n * Whether the uploader is disabled.\n * @type boolean\n * @default false\n * @example disabled\n */\n disabled?: boolean;\n\n showText?: boolean;\n iconSize?: number;\n}\n\nexport function FileUploader(props: FileUploaderProps) {\n const {\n value: valueProp,\n onValueChange,\n onUpload,\n progresses,\n accept = {\n \"image/*\": [],\n },\n maxSize = 1024 * 1024 * 2,\n maxFileCount = 1,\n multiple = false,\n disabled = false,\n showText = true,\n iconSize,\n className,\n ...dropzoneProps\n } = props;\n\n const [files, setFiles] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n });\n\n const onDrop = React.useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n if (!multiple && maxFileCount === 1 && acceptedFiles.length > 1) {\n toast.error(\"Cannot upload more than 1 file at a time\");\n\n return;\n }\n\n if ((files?.length ?? 0) + acceptedFiles.length > maxFileCount) {\n toast.error(`Cannot upload more than ${maxFileCount} files`);\n return;\n }\n\n const newFiles = acceptedFiles.map((file) =>\n Object.assign(file, {\n preview: URL.createObjectURL(file),\n }),\n );\n\n const updatedFiles = files ? [...files, ...newFiles] : newFiles;\n\n setFiles(updatedFiles);\n\n if (rejectedFiles.length > 0) {\n rejectedFiles.forEach(({ file }) => {\n toast.error(`File ${file.name} was rejected`);\n });\n }\n\n if (\n onUpload &&\n updatedFiles.length > 0 &&\n updatedFiles.length <= maxFileCount\n ) {\n const target =\n updatedFiles.length > 0 ? `${updatedFiles.length} files` : `file`;\n\n onUpload(updatedFiles).then(() => {\n setFiles([]);\n toast(`${target} uploaded`);\n });\n }\n },\n\n [files, maxFileCount, multiple, onUpload, setFiles],\n );\n\n function onRemove(index: number) {\n if (!files) return;\n\n if (isFileWithPreview(files[index])) {\n URL.revokeObjectURL(files[index].preview);\n }\n\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onValueChange?.(newFiles);\n }\n\n // Revoke preview url when component unmounts\n React.useEffect(() => {\n return () => {\n if (!files) return;\n files.forEach((file) => {\n if (isFileWithPreview(file)) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const isDisabled = disabled || (files?.length ?? 0) >= maxFileCount;\n\n return (\n <div className=\"relative flex w-full flex-col gap-6\">\n <Dropzone\n onDrop={onDrop}\n accept={accept}\n maxSize={maxSize}\n maxFiles={maxFileCount}\n multiple={maxFileCount > 1 || multiple}\n disabled={isDisabled}\n >\n {({ getRootProps, getInputProps, isDragActive }) => (\n <div\n {...getRootProps()}\n className={cn(\n \"group\",\n \"border-muted-foreground/25\",\n \"hover:bg-muted/25\",\n \"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\",\n \"ring-offset-background\",\n \"focus-visible:ring-ring\",\n \"focus-visible:ring-2\",\n \"focus-visible:ring-offset-2\",\n \"focus-visible:outline-hidden\",\n isDragActive && \"border-muted-foreground/50\",\n isDisabled && \"pointer-events-none opacity-60\",\n className,\n )}\n {...dropzoneProps}\n >\n <input {...getInputProps()} />\n {isDragActive ? (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n className=\"text-muted-foreground size-7\"\n aria-hidden=\"true\"\n />\n </div>\n <p className=\"text-muted-foreground font-medium\">\n Drop the files here\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-4 sm:px-5\">\n <div className=\"rounded-full border border-dashed p-3\">\n <Upload\n size={iconSize || 24}\n className=\"text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </div>\n {showText && (\n <div className=\"flex flex-col gap-px\">\n <p className=\"text-muted-foreground text-xs font-medium\">\n Drag {`'n'`} drop files here, or click to select files\n </p>\n <p className=\"text-muted-foreground/70 text-xs\">\n You can upload\n {maxFileCount > 1\n ? ` ${maxFileCount === Infinity ? \"multiple\" : maxFileCount}\n files (up to ${formatBytes(maxSize)} each)`\n : ` a file with ${formatBytes(maxSize)}`}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </Dropzone>\n {files?.length ? (\n <div className=\"h-fit w-full overflow-y-auto\">\n <div className=\"flex items-center justify-between px-3 py-2.5\">\n <div className=\"flex items-center gap-1\">\n <Image\n className=\"text-muted-foreground size-4\"\n aria-hidden=\"true\"\n />\n <p className=\"text-sm\">Ảnh đã tải lên ({files.length})</p>\n </div>\n <button\n className=\"hover:text-muted-foreground text-muted-foreground/60 flex cursor-pointer items-center gap-1 transition-colors duration-200\"\n onClick={() => {\n if (!files) return;\n files.forEach((file) => {\n if (!isFileWithPreview(file)) return;\n URL.revokeObjectURL(file.preview);\n });\n setFiles([]);\n onValueChange?.([]);\n }}\n >\n <Trash2 size={16} aria-hidden=\"true\" />\n <p className=\"text-sm\">Xóa tất cả</p>\n </button>\n </div>\n <div className=\"flex flex-col gap-2.5\">\n {files?.map((file, index) => (\n <FileCard\n key={index}\n file={file}\n onRemove={() => onRemove(index)}\n progress={progresses?.[file.name]}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface FileCardProps {\n file: File;\n onRemove: () => void;\n progress?: number;\n}\n\nfunction FileCard({ file, progress, onRemove }: FileCardProps) {\n return (\n <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\">\n <div className=\"flex flex-1 gap-2.5\">\n {isFileWithPreview(file) ? <FilePreview file={file} /> : null}\n <div className=\"flex w-full flex-col gap-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <p className=\"text-accent-foreground line-clamp-1 text-sm\">\n {file.name}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {formatBytes(file.size)}\n </p>\n </div>\n {progress ? <Progress value={progress} /> : null}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onRemove}\n >\n <Trash2\n size={16}\n className=\"text-muted-foreground/60\"\n aria-hidden=\"true\"\n />\n <span className=\"sr-only\">Remove file</span>\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isFileWithPreview(file: File): file is File & { preview: string } {\n return \"preview\" in file && typeof file.preview === \"string\";\n}\n\ninterface FilePreviewProps {\n file: File & { preview: string };\n}\n\nfunction FilePreview({ file }: FilePreviewProps) {\n if (file.type.startsWith(\"image/\")) {\n return (\n <img\n src={file.preview}\n className=\"border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm\"\n />\n );\n }\n\n return (\n <FileText\n className=\"text-muted-foreground size-10 border\"\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":"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"}
package/dist/ui/form.cjs CHANGED
@@ -1 +1 @@
1
- "use client";require(`../utils-BsjVK5EW.cjs`),require(`../label-CunjD1rx.cjs`);const e=require(`../form-CYZkgobJ.cjs`);exports.Form=e.Form,exports.FormControl=e.FormControl,exports.FormDescription=e.FormDescription,exports.FormField=e.FormField,exports.FormItem=e.FormItem,exports.FormLabel=e.FormLabel,exports.FormMessage=e.FormMessage,exports.useFormField=e.useFormField;
1
+ "use client";const e=require(`../chunk-hhQzssFb.cjs`);require(`../utils-DaJ1XZgX.cjs`),require(`../label-i858Jr98.cjs`);const t=require(`../form-C_PCHrpx.cjs`);exports.Form=t.Form,exports.FormControl=t.FormControl,exports.FormDescription=t.FormDescription,exports.FormField=t.FormField,exports.FormItem=t.FormItem,exports.FormLabel=t.FormLabel,exports.FormMessage=t.FormMessage,exports.useFormField=t.useFormField;
@@ -1,33 +1,48 @@
1
+ import * as react_jsx_runtime99 from "react/jsx-runtime";
1
2
  import React from "react";
3
+ import * as react_hook_form0 from "react-hook-form";
2
4
  import { ControllerProps, FieldPath, FieldValues } from "react-hook-form";
3
5
  import { Label, Slot } from "radix-ui";
4
6
 
5
7
  //#region packages/components/ui/form.d.ts
6
- declare const Form: any;
8
+ declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues = TFieldValues>(props: react_hook_form0.FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
7
9
  declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({
8
10
  ...props
9
- }: ControllerProps<TFieldValues, TName>) => any;
10
- declare const useFormField: () => any;
11
+ }: ControllerProps<TFieldValues, TName>) => react_jsx_runtime99.JSX.Element;
12
+ declare const useFormField: () => {
13
+ invalid: boolean;
14
+ isDirty: boolean;
15
+ isTouched: boolean;
16
+ isValidating: boolean;
17
+ error?: react_hook_form0.FieldError;
18
+ id: string;
19
+ control: react_hook_form0.Control<FieldValues, any, FieldValues>;
20
+ resetField: react_hook_form0.UseFormResetField<FieldValues>;
21
+ name: string;
22
+ formItemId: string;
23
+ formDescriptionId: string;
24
+ formMessageId: string;
25
+ };
11
26
  declare function FormItem({
12
27
  className,
13
28
  ...props
14
- }: React.ComponentProps<"div">): any;
29
+ }: React.ComponentProps<"div">): react_jsx_runtime99.JSX.Element;
15
30
  declare function FormLabel({
16
31
  className,
17
32
  ...props
18
- }: React.ComponentProps<typeof Label.Root>): any;
33
+ }: React.ComponentProps<typeof Label.Root>): react_jsx_runtime99.JSX.Element;
19
34
  declare function FormControl({
20
35
  ...props
21
- }: React.ComponentProps<typeof Slot.Slot>): any;
36
+ }: React.ComponentProps<typeof Slot.Slot>): react_jsx_runtime99.JSX.Element;
22
37
  declare function FormDescription({
23
38
  className,
24
39
  ...props
25
- }: React.ComponentProps<"p">): any;
40
+ }: React.ComponentProps<"p">): react_jsx_runtime99.JSX.Element;
26
41
  declare function FormMessage({
27
42
  className,
28
43
  children,
29
44
  ...props
30
- }: React.ComponentProps<"p">): any;
45
+ }: React.ComponentProps<"p">): react_jsx_runtime99.JSX.Element;
31
46
  //#endregion
32
47
  export { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField };
33
48
  //# sourceMappingURL=form.d.cts.map
package/dist/ui/form.d.ts CHANGED
@@ -1,33 +1,48 @@
1
1
  import React from "react";
2
+ import * as react_jsx_runtime104 from "react/jsx-runtime";
2
3
  import { Label, Slot } from "radix-ui";
4
+ import * as react_hook_form0 from "react-hook-form";
3
5
  import { ControllerProps, FieldPath, FieldValues } from "react-hook-form";
4
6
 
5
7
  //#region packages/components/ui/form.d.ts
6
- declare const Form: any;
8
+ declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues = TFieldValues>(props: react_hook_form0.FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
7
9
  declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({
8
10
  ...props
9
- }: ControllerProps<TFieldValues, TName>) => any;
10
- declare const useFormField: () => any;
11
+ }: ControllerProps<TFieldValues, TName>) => react_jsx_runtime104.JSX.Element;
12
+ declare const useFormField: () => {
13
+ invalid: boolean;
14
+ isDirty: boolean;
15
+ isTouched: boolean;
16
+ isValidating: boolean;
17
+ error?: react_hook_form0.FieldError;
18
+ id: string;
19
+ control: react_hook_form0.Control<FieldValues, any, FieldValues>;
20
+ resetField: react_hook_form0.UseFormResetField<FieldValues>;
21
+ name: string;
22
+ formItemId: string;
23
+ formDescriptionId: string;
24
+ formMessageId: string;
25
+ };
11
26
  declare function FormItem({
12
27
  className,
13
28
  ...props
14
- }: React.ComponentProps<"div">): any;
29
+ }: React.ComponentProps<"div">): react_jsx_runtime104.JSX.Element;
15
30
  declare function FormLabel({
16
31
  className,
17
32
  ...props
18
- }: React.ComponentProps<typeof Label.Root>): any;
33
+ }: React.ComponentProps<typeof Label.Root>): react_jsx_runtime104.JSX.Element;
19
34
  declare function FormControl({
20
35
  ...props
21
- }: React.ComponentProps<typeof Slot.Slot>): any;
36
+ }: React.ComponentProps<typeof Slot.Slot>): react_jsx_runtime104.JSX.Element;
22
37
  declare function FormDescription({
23
38
  className,
24
39
  ...props
25
- }: React.ComponentProps<"p">): any;
40
+ }: React.ComponentProps<"p">): react_jsx_runtime104.JSX.Element;
26
41
  declare function FormMessage({
27
42
  className,
28
43
  children,
29
44
  ...props
30
- }: React.ComponentProps<"p">): any;
45
+ }: React.ComponentProps<"p">): react_jsx_runtime104.JSX.Element;
31
46
  //#endregion
32
47
  export { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField };
33
48
  //# sourceMappingURL=form.d.ts.map
@@ -1,2 +1,2 @@
1
- "use client";const e=require(`../chunk-CUT6urMc.cjs`),t=require(`../utils-BsjVK5EW.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`radix-ui`));function a({...e}){return(0,r.jsx)(i.HoverCard.Root,{"data-slot":`hover-card`,...e})}function o({...e}){return(0,r.jsx)(i.HoverCard.Trigger,{"data-slot":`hover-card-trigger`,...e})}function s({className:e,align:n=`center`,sideOffset:a=4,...o}){return(0,r.jsx)(i.HoverCard.Portal,{"data-slot":`hover-card-portal`,children:(0,r.jsx)(i.HoverCard.Content,{"data-slot":`hover-card-content`,align:n,sideOffset:a,className:t.cn(`bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden`,e),...o})})}exports.HoverCard=a,exports.HoverCardContent=s,exports.HoverCardTrigger=o;
1
+ "use client";const e=require(`../chunk-hhQzssFb.cjs`),t=require(`../utils-DaJ1XZgX.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`radix-ui`));function a({...e}){return(0,r.jsx)(i.HoverCard.Root,{"data-slot":`hover-card`,...e})}function o({...e}){return(0,r.jsx)(i.HoverCard.Trigger,{"data-slot":`hover-card-trigger`,...e})}function s({className:e,align:n=`center`,sideOffset:a=4,...o}){return(0,r.jsx)(i.HoverCard.Portal,{"data-slot":`hover-card-portal`,children:(0,r.jsx)(i.HoverCard.Content,{"data-slot":`hover-card-content`,align:n,sideOffset:a,className:t.cn(`bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden`,e),...o})})}exports.HoverCard=a,exports.HoverCardContent=s,exports.HoverCardTrigger=o;
2
2
  //# sourceMappingURL=hover-card.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hover-card.cjs","names":["HoverCardPrimitive","cn"],"sources":["../../packages/components/ui/hover-card.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />;\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n );\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n"],"mappings":"kMAMA,SAAS,EAAU,CACjB,GAAG,EACkD,CAAE,CACvD,OAAO,EAAA,EAAA,KAACA,EAAAA,UAAmB,KAAA,CAAK,YAAU,aAAa,GAAI,GAC5D,CAED,SAAS,EAAiB,CACxB,GAAG,EACqD,CAAE,CAC1D,OACE,EAAA,EAAA,KAACA,EAAAA,UAAmB,QAAA,CAAQ,YAAU,qBAAqB,GAAI,GAElE,CAED,SAAS,EAAiB,CACxB,YACA,QAAQ,SACR,aAAa,EACb,GAAG,EACqD,CAAE,CAC1D,OACE,EAAA,EAAA,KAACA,EAAAA,UAAmB,OAAA,CAAO,YAAU,8BACnC,EAAA,EAAA,KAACA,EAAAA,UAAmB,QAAA,CAClB,YAAU,qBACH,QACK,aACZ,UAAWC,EAAAA,GACT,oeACA,GAEF,GAAI,KAIX"}
1
+ {"version":3,"file":"hover-card.cjs","names":["HoverCardPrimitive","cn"],"sources":["../../packages/components/ui/hover-card.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />;\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n );\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n"],"mappings":"kMAMA,SAAS,EAAU,CACjB,GAAG,GACoD,CACvD,OAAO,EAAA,EAAA,KAACA,EAAAA,UAAmB,KAAA,CAAK,YAAU,aAAa,GAAI,IAG7D,SAAS,EAAiB,CACxB,GAAG,GACuD,CAC1D,OACE,EAAA,EAAA,KAACA,EAAAA,UAAmB,QAAA,CAAQ,YAAU,qBAAqB,GAAI,IAInE,SAAS,EAAiB,CACxB,YACA,QAAQ,SACR,aAAa,EACb,GAAG,GACuD,CAC1D,OACE,EAAA,EAAA,KAACA,EAAAA,UAAmB,OAAA,CAAO,YAAU,8BACnC,EAAA,EAAA,KAACA,EAAAA,UAAmB,QAAA,CAClB,YAAU,qBACH,QACK,aACZ,UAAWC,EAAAA,GACT,oeACA,GAEF,GAAI"}
@@ -1,19 +1,20 @@
1
+ import * as react_jsx_runtime95 from "react/jsx-runtime";
1
2
  import React from "react";
2
3
  import { HoverCard as HoverCard$1 } from "radix-ui";
3
4
 
4
5
  //#region packages/components/ui/hover-card.d.ts
5
6
  declare function HoverCard({
6
7
  ...props
7
- }: React.ComponentProps<typeof HoverCard$1.Root>): any;
8
+ }: React.ComponentProps<typeof HoverCard$1.Root>): react_jsx_runtime95.JSX.Element;
8
9
  declare function HoverCardTrigger({
9
10
  ...props
10
- }: React.ComponentProps<typeof HoverCard$1.Trigger>): any;
11
+ }: React.ComponentProps<typeof HoverCard$1.Trigger>): react_jsx_runtime95.JSX.Element;
11
12
  declare function HoverCardContent({
12
13
  className,
13
14
  align,
14
15
  sideOffset,
15
16
  ...props
16
- }: React.ComponentProps<typeof HoverCard$1.Content>): any;
17
+ }: React.ComponentProps<typeof HoverCard$1.Content>): react_jsx_runtime95.JSX.Element;
17
18
  //#endregion
18
19
  export { HoverCard, HoverCardContent, HoverCardTrigger };
19
20
  //# sourceMappingURL=hover-card.d.cts.map
@@ -1,19 +1,20 @@
1
1
  import React from "react";
2
+ import * as react_jsx_runtime85 from "react/jsx-runtime";
2
3
  import { HoverCard as HoverCard$1 } from "radix-ui";
3
4
 
4
5
  //#region packages/components/ui/hover-card.d.ts
5
6
  declare function HoverCard({
6
7
  ...props
7
- }: React.ComponentProps<typeof HoverCard$1.Root>): any;
8
+ }: React.ComponentProps<typeof HoverCard$1.Root>): react_jsx_runtime85.JSX.Element;
8
9
  declare function HoverCardTrigger({
9
10
  ...props
10
- }: React.ComponentProps<typeof HoverCard$1.Trigger>): any;
11
+ }: React.ComponentProps<typeof HoverCard$1.Trigger>): react_jsx_runtime85.JSX.Element;
11
12
  declare function HoverCardContent({
12
13
  className,
13
14
  align,
14
15
  sideOffset,
15
16
  ...props
16
- }: React.ComponentProps<typeof HoverCard$1.Content>): any;
17
+ }: React.ComponentProps<typeof HoverCard$1.Content>): react_jsx_runtime85.JSX.Element;
17
18
  //#endregion
18
19
  export { HoverCard, HoverCardContent, HoverCardTrigger };
19
20
  //# sourceMappingURL=hover-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hover-card.js","names":["HoverCardPrimitive"],"sources":["../../packages/components/ui/hover-card.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />;\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n );\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n"],"mappings":"yJAMA,SAAS,EAAU,CACjB,GAAG,EACkD,CAAE,CACvD,OAAO,EAACA,EAAmB,KAAA,CAAK,YAAU,aAAa,GAAI,GAC5D,CAED,SAAS,EAAiB,CACxB,GAAG,EACqD,CAAE,CAC1D,OACE,EAACA,EAAmB,QAAA,CAAQ,YAAU,qBAAqB,GAAI,GAElE,CAED,SAAS,EAAiB,CACxB,YACA,QAAQ,SACR,aAAa,EACb,GAAG,EACqD,CAAE,CAC1D,OACE,EAACA,EAAmB,OAAA,CAAO,YAAU,6BACnC,EAACA,EAAmB,QAAA,CAClB,YAAU,qBACH,QACK,aACZ,UAAW,EACT,oeACA,GAEF,GAAI,KAIX"}
1
+ {"version":3,"file":"hover-card.js","names":["HoverCardPrimitive"],"sources":["../../packages/components/ui/hover-card.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />;\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n );\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n"],"mappings":"yJAMA,SAAS,EAAU,CACjB,GAAG,GACoD,CACvD,OAAO,EAACA,EAAmB,KAAA,CAAK,YAAU,aAAa,GAAI,IAG7D,SAAS,EAAiB,CACxB,GAAG,GACuD,CAC1D,OACE,EAACA,EAAmB,QAAA,CAAQ,YAAU,qBAAqB,GAAI,IAInE,SAAS,EAAiB,CACxB,YACA,QAAQ,SACR,aAAa,EACb,GAAG,GACuD,CAC1D,OACE,EAACA,EAAmB,OAAA,CAAO,YAAU,6BACnC,EAACA,EAAmB,QAAA,CAClB,YAAU,qBACH,QACK,aACZ,UAAW,EACT,oeACA,GAEF,GAAI"}
@@ -1,2 +1,2 @@
1
- "use client";const e=require(`../chunk-CUT6urMc.cjs`),t=require(`../utils-BsjVK5EW.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`lucide-react`)),a=e.__toESM(require(`input-otp`));function o({className:e,containerClassName:n,...i}){return(0,r.jsx)(a.OTPInput,{"data-slot":`input-otp`,containerClassName:t.cn(`flex items-center gap-2 has-disabled:opacity-50`,n),className:t.cn(`disabled:cursor-not-allowed`,e),...i})}function s({className:e,...n}){return(0,r.jsx)(`div`,{"data-slot":`input-otp-group`,className:t.cn(`flex items-center`,e),...n})}function c({index:e,className:i,...o}){let s=n.default.useContext(a.OTPInputContext),{char:c,hasFakeCaret:l,isActive:u}=s?.slots[e]??{};return(0,r.jsxs)(`div`,{"data-slot":`input-otp-slot`,"data-active":u,className:t.cn(`data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]`,i),...o,children:[c,l&&(0,r.jsx)(`div`,{className:`pointer-events-none absolute inset-0 flex items-center justify-center`,children:(0,r.jsx)(`div`,{className:`animate-caret-blink bg-foreground h-4 w-px duration-1000`})})]})}function l({...e}){return(0,r.jsx)(`div`,{"data-slot":`input-otp-separator`,role:`separator`,...e,children:(0,r.jsx)(i.MinusIcon,{})})}exports.InputOTP=o,exports.InputOTPGroup=s,exports.InputOTPSeparator=l,exports.InputOTPSlot=c;
1
+ "use client";const e=require(`../chunk-hhQzssFb.cjs`),t=require(`../utils-DaJ1XZgX.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`lucide-react`)),a=e.__toESM(require(`input-otp`));function o({className:e,containerClassName:n,...i}){return(0,r.jsx)(a.OTPInput,{"data-slot":`input-otp`,containerClassName:t.cn(`flex items-center gap-2 has-disabled:opacity-50`,n),className:t.cn(`disabled:cursor-not-allowed`,e),...i})}function s({className:e,...n}){return(0,r.jsx)(`div`,{"data-slot":`input-otp-group`,className:t.cn(`flex items-center`,e),...n})}function c({index:e,className:i,...o}){let s=n.default.useContext(a.OTPInputContext),{char:c,hasFakeCaret:l,isActive:u}=s?.slots[e]??{};return(0,r.jsxs)(`div`,{"data-slot":`input-otp-slot`,"data-active":u,className:t.cn(`data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]`,i),...o,children:[c,l&&(0,r.jsx)(`div`,{className:`pointer-events-none absolute inset-0 flex items-center justify-center`,children:(0,r.jsx)(`div`,{className:`animate-caret-blink bg-foreground h-4 w-px duration-1000`})})]})}function l({...e}){return(0,r.jsx)(`div`,{"data-slot":`input-otp-separator`,role:`separator`,...e,children:(0,r.jsx)(i.MinusIcon,{})})}exports.InputOTP=o,exports.InputOTPGroup=s,exports.InputOTPSeparator=l,exports.InputOTPSlot=c;
2
2
  //# sourceMappingURL=input-otp.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-otp.cjs","names":["OTPInput","cn","React","OTPInputContext","MinusIcon"],"sources":["../../packages/components/ui/input-otp.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { MinusIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName,\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };\n"],"mappings":"wOAOA,SAAS,EAAS,CAChB,YACA,qBACA,GAAG,EAGJ,CAAE,CACD,OACE,EAAA,EAAA,KAACA,EAAAA,SAAAA,CACC,YAAU,YACV,mBAAoBC,EAAAA,GAClB,kDACA,GAEF,UAAWA,EAAAA,GAAG,8BAA+B,GAC7C,GAAI,GAGT,CAED,SAAS,EAAc,CAAE,YAAW,GAAG,EAAoC,CAAE,CAC3E,OACE,EAAA,EAAA,KAAC,MAAA,CACC,YAAU,kBACV,UAAWA,EAAAA,GAAG,oBAAqB,GACnC,GAAI,GAGT,CAED,SAAS,EAAa,CACpB,QACA,YACA,GAAG,EAGJ,CAAE,CACD,IAAM,EAAkBC,EAAAA,QAAM,WAAWC,EAAAA,iBACnC,CAAE,OAAM,eAAc,WAAU,CAAG,GAAiB,MAAM,IAAU,EAAE,CAE5E,OACE,EAAA,EAAA,MAAC,MAAA,CACC,YAAU,iBACV,cAAa,EACb,UAAWF,EAAAA,GACT,2fACA,GAEF,GAAI,YAEH,EACA,IACC,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kFACb,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,2DAAA,MAKxB,CAED,SAAS,EAAkB,CAAE,GAAG,EAAoC,CAAE,CACpE,OACE,EAAA,EAAA,KAAC,MAAA,CAAI,YAAU,sBAAsB,KAAK,YAAY,GAAI,YACxD,EAAA,EAAA,KAACG,EAAAA,UAAAA,EAAAA,GAGN"}
1
+ {"version":3,"file":"input-otp.cjs","names":["OTPInput","cn","React","OTPInputContext","MinusIcon"],"sources":["../../packages/components/ui/input-otp.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { MinusIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName,\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };\n"],"mappings":"wOAOA,SAAS,EAAS,CAChB,YACA,qBACA,GAAG,GAGF,CACD,OACE,EAAA,EAAA,KAACA,EAAAA,SAAAA,CACC,YAAU,YACV,mBAAoBC,EAAAA,GAClB,kDACA,GAEF,UAAWA,EAAAA,GAAG,8BAA+B,GAC7C,GAAI,IAKV,SAAS,EAAc,CAAE,YAAW,GAAG,GAAsC,CAC3E,OACE,EAAA,EAAA,KAAC,MAAA,CACC,YAAU,kBACV,UAAWA,EAAAA,GAAG,oBAAqB,GACnC,GAAI,IAKV,SAAS,EAAa,CACpB,QACA,YACA,GAAG,GAGF,CACD,IAAM,EAAkBC,EAAAA,QAAM,WAAWC,EAAAA,iBACnC,CAAE,OAAM,eAAc,YAAa,GAAiB,MAAM,IAAU,GAE1E,OACE,EAAA,EAAA,MAAC,MAAA,CACC,YAAU,iBACV,cAAa,EACb,UAAWF,EAAAA,GACT,2fACA,GAEF,GAAI,YAEH,EACA,IACC,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kFACb,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kEAOzB,SAAS,EAAkB,CAAE,GAAG,GAAsC,CACpE,OACE,EAAA,EAAA,KAAC,MAAA,CAAI,YAAU,sBAAsB,KAAK,YAAY,GAAI,YACxD,EAAA,EAAA,KAACG,EAAAA,UAAAA"}
@@ -1,3 +1,4 @@
1
+ import * as react_jsx_runtime105 from "react/jsx-runtime";
1
2
  import React from "react";
2
3
  import { OTPInput } from "input-otp";
3
4
 
@@ -8,21 +9,21 @@ declare function InputOTP({
8
9
  ...props
9
10
  }: React.ComponentProps<typeof OTPInput> & {
10
11
  containerClassName?: string;
11
- }): any;
12
+ }): react_jsx_runtime105.JSX.Element;
12
13
  declare function InputOTPGroup({
13
14
  className,
14
15
  ...props
15
- }: React.ComponentProps<"div">): any;
16
+ }: React.ComponentProps<"div">): react_jsx_runtime105.JSX.Element;
16
17
  declare function InputOTPSlot({
17
18
  index,
18
19
  className,
19
20
  ...props
20
21
  }: React.ComponentProps<"div"> & {
21
22
  index: number;
22
- }): any;
23
+ }): react_jsx_runtime105.JSX.Element;
23
24
  declare function InputOTPSeparator({
24
25
  ...props
25
- }: React.ComponentProps<"div">): any;
26
+ }: React.ComponentProps<"div">): react_jsx_runtime105.JSX.Element;
26
27
  //#endregion
27
28
  export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
28
29
  //# sourceMappingURL=input-otp.d.cts.map
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import * as react_jsx_runtime110 from "react/jsx-runtime";
2
3
  import { OTPInput } from "input-otp";
3
4
 
4
5
  //#region packages/components/ui/input-otp.d.ts
@@ -8,21 +9,21 @@ declare function InputOTP({
8
9
  ...props
9
10
  }: React.ComponentProps<typeof OTPInput> & {
10
11
  containerClassName?: string;
11
- }): any;
12
+ }): react_jsx_runtime110.JSX.Element;
12
13
  declare function InputOTPGroup({
13
14
  className,
14
15
  ...props
15
- }: React.ComponentProps<"div">): any;
16
+ }: React.ComponentProps<"div">): react_jsx_runtime110.JSX.Element;
16
17
  declare function InputOTPSlot({
17
18
  index,
18
19
  className,
19
20
  ...props
20
21
  }: React.ComponentProps<"div"> & {
21
22
  index: number;
22
- }): any;
23
+ }): react_jsx_runtime110.JSX.Element;
23
24
  declare function InputOTPSeparator({
24
25
  ...props
25
- }: React.ComponentProps<"div">): any;
26
+ }: React.ComponentProps<"div">): react_jsx_runtime110.JSX.Element;
26
27
  //#endregion
27
28
  export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
28
29
  //# sourceMappingURL=input-otp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-otp.js","names":[],"sources":["../../packages/components/ui/input-otp.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { MinusIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName,\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };\n"],"mappings":"iOAOA,SAAS,EAAS,CAChB,YACA,qBACA,GAAG,EAGJ,CAAE,CACD,OACE,EAAC,EAAA,CACC,YAAU,YACV,mBAAoB,EAClB,kDACA,GAEF,UAAW,EAAG,8BAA+B,GAC7C,GAAI,GAGT,CAED,SAAS,EAAc,CAAE,YAAW,GAAG,EAAoC,CAAE,CAC3E,OACE,EAAC,MAAA,CACC,YAAU,kBACV,UAAW,EAAG,oBAAqB,GACnC,GAAI,GAGT,CAED,SAAS,EAAa,CACpB,QACA,YACA,GAAG,EAGJ,CAAE,CACD,IAAM,EAAkB,EAAM,WAAW,GACnC,CAAE,OAAM,eAAc,WAAU,CAAG,GAAiB,MAAM,IAAU,EAAE,CAE5E,OACE,EAAC,MAAA,CACC,YAAU,iBACV,cAAa,EACb,UAAW,EACT,2fACA,GAEF,GAAI,YAEH,EACA,GACC,EAAC,MAAA,CAAI,UAAU,iFACb,EAAC,MAAA,CAAI,UAAU,2DAAA,MAKxB,CAED,SAAS,EAAkB,CAAE,GAAG,EAAoC,CAAE,CACpE,OACE,EAAC,MAAA,CAAI,YAAU,sBAAsB,KAAK,YAAY,GAAI,WACxD,EAAC,EAAA,EAAA,GAGN"}
1
+ {"version":3,"file":"input-otp.js","names":[],"sources":["../../packages/components/ui/input-otp.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { MinusIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName,\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };\n"],"mappings":"iOAOA,SAAS,EAAS,CAChB,YACA,qBACA,GAAG,GAGF,CACD,OACE,EAAC,EAAA,CACC,YAAU,YACV,mBAAoB,EAClB,kDACA,GAEF,UAAW,EAAG,8BAA+B,GAC7C,GAAI,IAKV,SAAS,EAAc,CAAE,YAAW,GAAG,GAAsC,CAC3E,OACE,EAAC,MAAA,CACC,YAAU,kBACV,UAAW,EAAG,oBAAqB,GACnC,GAAI,IAKV,SAAS,EAAa,CACpB,QACA,YACA,GAAG,GAGF,CACD,IAAM,EAAkB,EAAM,WAAW,GACnC,CAAE,OAAM,eAAc,YAAa,GAAiB,MAAM,IAAU,GAE1E,OACE,EAAC,MAAA,CACC,YAAU,iBACV,cAAa,EACb,UAAW,EACT,2fACA,GAEF,GAAI,YAEH,EACA,GACC,EAAC,MAAA,CAAI,UAAU,iFACb,EAAC,MAAA,CAAI,UAAU,kEAOzB,SAAS,EAAkB,CAAE,GAAG,GAAsC,CACpE,OACE,EAAC,MAAA,CAAI,YAAU,sBAAsB,KAAK,YAAY,GAAI,WACxD,EAAC,EAAA"}
package/dist/ui/input.cjs CHANGED
@@ -1 +1 @@
1
- "use client";require(`../utils-BsjVK5EW.cjs`);const e=require(`../input-DXEBB91E.cjs`);exports.Input=e.Input;
1
+ "use client";const e=require(`../chunk-hhQzssFb.cjs`);require(`../utils-DaJ1XZgX.cjs`);const t=require(`../input-C8Sebaue.cjs`);exports.Input=t.Input;
@@ -1,2 +1,2 @@
1
- import { Input } from "../input-D0Phuz25.cjs";
1
+ import { Input } from "../input-DlRU8OGl.cjs";
2
2
  export { Input };
@@ -1,2 +1,2 @@
1
- import { Input } from "../input-tHIKXxVS.js";
1
+ import { Input } from "../input-yduNlg8y.js";
2
2
  export { Input };
package/dist/ui/input.js CHANGED
@@ -1 +1 @@
1
- "use client";import"../utils-D9AH0PUV.js";import{Input as e}from"../input-FzKbxUq2.js";export{e as Input};
1
+ "use client";import"../utils-D9AH0PUV.js";import{Input as e}from"../input-Dmaq3fzf.js";export{e as Input};
@@ -1 +1 @@
1
- require(`../../utils-BsjVK5EW.cjs`),require(`../../input-DXEBB91E.cjs`);const e=require(`../../search-input-Bf4-FeWu.cjs`);exports.SearchInput=e.SearchInput;
1
+ const e=require(`../../chunk-hhQzssFb.cjs`);require(`../../utils-DaJ1XZgX.cjs`),require(`../../input-C8Sebaue.cjs`);const t=require(`../../search-input-CWCcWgmA.cjs`);exports.SearchInput=t.SearchInput;