@customafk/lunas-ui 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/dist/{add-new-BaABbnol.js → add-new-C--Ee4bj.js} +1 -2
  2. package/dist/{add-new-DUoS_-n2.cjs → add-new-pfLdk0Hp.cjs} +1 -2
  3. package/dist/{alert-dialog-0KwdjY-6.js → alert-dialog-CQa0TLlF.js} +1 -2
  4. package/dist/{alert-dialog-D5ZqgIiC.cjs → alert-dialog-D1DFrl-0.cjs} +1 -2
  5. package/dist/badge-D_qEoSL8.js +1 -2
  6. package/dist/{badge-CRXT2dH_.cjs → badge-DfSj5nwV.cjs} +1 -2
  7. package/dist/button-Bku3bKv9.js +1 -2
  8. package/dist/button-CS0x-mYR.d.cts +22 -0
  9. package/dist/button-CxHABSnr.d.ts +22 -0
  10. package/dist/{button-Dzv_nos1.cjs → button-CycE0WzB.cjs} +1 -2
  11. package/dist/calendar-DaYVxwJx.js +1 -0
  12. package/dist/calendar-DzAxQqFI.cjs +1 -0
  13. package/dist/{card-Dta5eW8u.cjs → card-D7C05tvk.cjs} +1 -2
  14. package/dist/card-D8cxRC5y.js +1 -2
  15. package/dist/cards/simple-card.cjs +1 -2
  16. package/dist/cards/simple-card.d.cts +3 -3
  17. package/dist/cards/simple-card.d.ts +3 -3
  18. package/dist/cards/simple-card.js +1 -2
  19. package/dist/chunk-hhQzssFb.cjs +1 -0
  20. package/dist/command-BfYiUikG.d.cts +52 -0
  21. package/dist/{command-CsntVmEz.cjs → command-CkGJbvFq.cjs} +1 -2
  22. package/dist/command-CycGGWOh.d.ts +52 -0
  23. package/dist/{command-_L9bD9a-.js → command-Ir_Vqgds.js} +1 -2
  24. package/dist/data-display/country.cjs +1 -2
  25. package/dist/data-display/country.d.cts +1 -2
  26. package/dist/data-display/country.d.ts +2 -3
  27. package/dist/data-display/country.js +1 -2
  28. package/dist/data-display/data-list.cjs +1 -2
  29. package/dist/data-display/data-list.d.cts +1 -2
  30. package/dist/data-display/data-list.d.ts +1 -2
  31. package/dist/data-display/data-list.js +1 -2
  32. package/dist/data-display/date.cjs +1 -1
  33. package/dist/data-display/date.d.cts +1 -2
  34. package/dist/data-display/date.d.ts +1 -2
  35. package/dist/data-display/empty.cjs +1 -2
  36. package/dist/data-display/empty.d.cts +4 -3
  37. package/dist/data-display/empty.d.ts +4 -3
  38. package/dist/data-display/empty.js +1 -2
  39. package/dist/data-display/name.cjs +1 -2
  40. package/dist/data-display/name.d.cts +1 -2
  41. package/dist/data-display/name.d.ts +1 -2
  42. package/dist/data-display/name.js +1 -2
  43. package/dist/data-display/phone-number.cjs +1 -2
  44. package/dist/data-display/phone-number.d.cts +1 -2
  45. package/dist/data-display/phone-number.d.ts +1 -2
  46. package/dist/data-display/phone-number.js +1 -2
  47. package/dist/data-display/role-badge.cjs +1 -2
  48. package/dist/data-display/role-badge.d.cts +1 -2
  49. package/dist/data-display/role-badge.d.ts +2 -3
  50. package/dist/data-display/role-badge.js +1 -2
  51. package/dist/data-display/statistic.cjs +1 -2
  52. package/dist/data-display/statistic.d.cts +26 -3
  53. package/dist/data-display/statistic.d.ts +26 -3
  54. package/dist/data-display/statistic.js +1 -2
  55. package/dist/date-BMq_DNsv.js +1 -2
  56. package/dist/{date-nd8WkPlx.cjs → date-ByLOGsKl.cjs} +1 -2
  57. package/dist/{dialog-D3VF5qxy.d.cts → dialog-B13T--98.d.ts} +12 -12
  58. package/dist/{dialog-W-DmDMEE.cjs → dialog-B3cQOpjg.cjs} +1 -2
  59. package/dist/{dialog-C4hf-Puw.js → dialog-BLDh3Gqw.js} +1 -2
  60. package/dist/{dialog-MLCAvDJH.d.ts → dialog-Dspjpsjh.d.cts} +12 -12
  61. package/dist/dialogs/confirm-dialog.cjs +1 -2
  62. package/dist/dialogs/confirm-dialog.d.cts +1 -2
  63. package/dist/dialogs/confirm-dialog.d.ts +1 -2
  64. package/dist/dialogs/confirm-dialog.js +1 -2
  65. package/dist/dialogs/detail-dialog/index.cjs +1 -2
  66. package/dist/dialogs/detail-dialog/index.d.cts +1 -2
  67. package/dist/dialogs/detail-dialog/index.d.ts +1 -2
  68. package/dist/dialogs/detail-dialog/index.js +1 -2
  69. package/dist/dialogs/error-dialog.cjs +1 -1
  70. package/dist/dialogs/error-dialog.d.cts +1 -2
  71. package/dist/dialogs/error-dialog.d.ts +1 -2
  72. package/dist/dialogs/error-dialog.js +1 -1
  73. package/dist/dialogs/form-dialog.cjs +1 -2
  74. package/dist/dialogs/form-dialog.d.cts +3 -3
  75. package/dist/dialogs/form-dialog.d.ts +3 -3
  76. package/dist/dialogs/form-dialog.js +1 -2
  77. package/dist/dialogs/loading-dialog.cjs +1 -2
  78. package/dist/dialogs/loading-dialog.d.cts +1 -2
  79. package/dist/dialogs/loading-dialog.d.ts +1 -2
  80. package/dist/dialogs/loading-dialog.js +1 -2
  81. package/dist/{dropdown-menu-Bv18S56o.cjs → dropdown-menu-CPvB_jOC.cjs} +1 -2
  82. package/dist/{dropdown-menu-jCQwh2rG.js → dropdown-menu-Cx-Wime0.js} +1 -2
  83. package/dist/{error-dialog-DpQgL5Hy.cjs → error-dialog-BTjeT7x-.cjs} +1 -2
  84. package/dist/{error-dialog-D_4WL-Hj.js → error-dialog-DlhosP10.js} +1 -2
  85. package/dist/flex-ILvQrYMJ.js +1 -2
  86. package/dist/{flex-CNA_SId-.cjs → flex-yTyoLpgH.cjs} +1 -2
  87. package/dist/form-CA4hhSV5.js +1 -2
  88. package/dist/{form-CYZkgobJ.cjs → form-C_PCHrpx.cjs} +1 -2
  89. package/dist/{form-wrapper-BYbwt1zC.cjs → form-wrapper-CCqogufb.cjs} +1 -2
  90. package/dist/{form-wrapper-D-2Uz518.js → form-wrapper-YPIbD8rh.js} +1 -2
  91. package/dist/forms/combobox-field.cjs +41 -0
  92. package/dist/forms/combobox-field.d.cts +27 -0
  93. package/dist/forms/combobox-field.d.ts +27 -0
  94. package/dist/forms/combobox-field.js +41 -0
  95. package/dist/forms/date-field.cjs +1 -0
  96. package/dist/forms/date-field.d.cts +21 -0
  97. package/dist/forms/date-field.d.ts +21 -0
  98. package/dist/forms/date-field.js +1 -0
  99. package/dist/forms/form-wrapper.cjs +1 -1
  100. package/dist/forms/form-wrapper.d.cts +3 -3
  101. package/dist/forms/form-wrapper.d.ts +3 -3
  102. package/dist/forms/form-wrapper.js +1 -1
  103. package/dist/forms/multi-select-field.cjs +1 -0
  104. package/dist/forms/multi-select-field.d.cts +29 -0
  105. package/dist/forms/multi-select-field.d.ts +29 -0
  106. package/dist/forms/multi-select-field.js +1 -0
  107. package/dist/forms/number-field.cjs +1 -0
  108. package/dist/forms/number-field.d.cts +27 -0
  109. package/dist/forms/number-field.d.ts +27 -0
  110. package/dist/forms/number-field.js +1 -0
  111. package/dist/forms/password-field.cjs +1 -0
  112. package/dist/forms/password-field.d.cts +22 -0
  113. package/dist/forms/password-field.d.ts +22 -0
  114. package/dist/forms/password-field.js +1 -0
  115. package/dist/forms/select-field.cjs +1 -0
  116. package/dist/forms/select-field.d.cts +32 -0
  117. package/dist/forms/select-field.d.ts +32 -0
  118. package/dist/forms/select-field.js +1 -0
  119. package/dist/forms/switch-field.cjs +1 -0
  120. package/dist/forms/switch-field.d.cts +18 -0
  121. package/dist/forms/switch-field.d.ts +18 -0
  122. package/dist/forms/switch-field.js +1 -0
  123. package/dist/forms/text-field.cjs +1 -0
  124. package/dist/forms/text-field.d.cts +30 -0
  125. package/dist/forms/text-field.d.ts +30 -0
  126. package/dist/forms/text-field.js +1 -0
  127. package/dist/forms/textarea-field.cjs +1 -0
  128. package/dist/forms/textarea-field.d.cts +26 -0
  129. package/dist/forms/textarea-field.d.ts +26 -0
  130. package/dist/forms/textarea-field.js +1 -0
  131. package/dist/{input-D0Phuz25.d.cts → input-BcIy0lq8.d.cts} +3 -3
  132. package/dist/{input-DXEBB91E.cjs → input-C8Sebaue.cjs} +1 -2
  133. package/dist/{input-tHIKXxVS.d.ts → input-Cux9upuQ.d.ts} +3 -3
  134. package/dist/{input-FzKbxUq2.js → input-Dmaq3fzf.js} +1 -2
  135. package/dist/label-Cxbctr6x.js +1 -2
  136. package/dist/{label-CunjD1rx.cjs → label-i858Jr98.cjs} +1 -2
  137. package/dist/layouts/flex.cjs +1 -1
  138. package/dist/layouts/flex.d.cts +14 -4
  139. package/dist/layouts/flex.d.ts +14 -4
  140. package/dist/layouts/main/index.cjs +1 -2
  141. package/dist/layouts/main/index.d.cts +14 -5
  142. package/dist/layouts/main/index.d.ts +14 -5
  143. package/dist/layouts/main/index.js +1 -2
  144. package/dist/multi-select-DZBXSr7F.cjs +1 -0
  145. package/dist/multi-select-LYl29d4h.js +1 -0
  146. package/dist/paragraph-Bey03JkA.js +1 -2
  147. package/dist/{paragraph-ZxI8zxuf.cjs → paragraph-DWQ0PZt_.cjs} +1 -2
  148. package/dist/popover-Ce0OTSQL.cjs +1 -0
  149. package/dist/popover-tDri6Ded.js +1 -0
  150. package/dist/{progress-BnnOfAZN.cjs → progress-CHh9eRZi.cjs} +1 -2
  151. package/dist/{progress-CBccqUUJ.js → progress-CeXKNvJc.js} +1 -2
  152. package/dist/{refresh-BHt_h3N_.js → refresh-BPlmkCzH.js} +1 -2
  153. package/dist/{refresh-DrolZxuC.cjs → refresh-Dtz354hW.cjs} +1 -2
  154. package/dist/{scroll-area-DWWpaz5j.cjs → scroll-area-Ba9RvkDf.cjs} +1 -2
  155. package/dist/{scroll-area-Bdb_LSFF.js → scroll-area-D-IhBWqm.js} +1 -2
  156. package/dist/{search-input-L2sq0eB0.js → search-input-BG4-fO9W.js} +1 -2
  157. package/dist/{search-input-Bf4-FeWu.cjs → search-input-DVMQEBvb.cjs} +1 -2
  158. package/dist/{select-CWUsisI0.js → select-4IO3vAjO.js} +1 -2
  159. package/dist/{select-ZSyt5zCe.cjs → select-UsiicIRo.cjs} +1 -2
  160. package/dist/{separator-DTB3sDNG.cjs → separator-D4iTmsID.cjs} +1 -2
  161. package/dist/{separator-BpsL0PlX.js → separator-DMdqEz29.js} +1 -2
  162. package/dist/{separator-COXs-I-Q.d.cts → separator-DtZ0fiIK.d.cts} +3 -3
  163. package/dist/{separator-2cwfp8qT.d.ts → separator-J8f9PdbI.d.ts} +3 -3
  164. package/dist/{sheet-C8r2QGpq.js → sheet-2JqHfdYi.js} +1 -2
  165. package/dist/{sheet-CCwbAaA6.cjs → sheet-Dr-a3-o2.cjs} +1 -2
  166. package/dist/{sidebar-C166f_9B.js → sidebar-COBzB7S8.js} +1 -2
  167. package/dist/{sidebar-BLPMNltJ.cjs → sidebar-gXuaHBie.cjs} +1 -2
  168. package/dist/skeleton-BTQm_mtV.cjs +1 -0
  169. package/dist/{skeleton-DYmX0k94.js → skeleton-D1_Brnl9.js} +1 -2
  170. package/dist/switch-BlK-TC1h.js +1 -0
  171. package/dist/switch-CoP3UwNk.cjs +1 -0
  172. package/dist/table/index.cjs +1 -2
  173. package/dist/table/index.d.cts +3 -3
  174. package/dist/table/index.d.ts +3 -3
  175. package/dist/table/index.js +1 -2
  176. package/dist/{table-BSeev7T0.cjs → table-C46bXpzd.cjs} +1 -2
  177. package/dist/{table-BvA64mE8.js → table-nHFRC3DG.js} +1 -2
  178. package/dist/textarea-Dz6npuI4.cjs +1 -0
  179. package/dist/textarea-dM1DYNfF.js +1 -0
  180. package/dist/{title-xsPZpQpb.cjs → title-BlLBscIg.cjs} +1 -2
  181. package/dist/title-DTkABsIG.js +1 -2
  182. package/dist/toggle-3yC7NgOb.d.ts +19 -0
  183. package/dist/toggle-8wPArWPq.d.cts +19 -0
  184. package/dist/{toggle-D_MDMruK.js → toggle-CHJ2edke.js} +1 -2
  185. package/dist/{toggle-CfL3GVe2.cjs → toggle-CzMYdDvC.cjs} +1 -2
  186. package/dist/{tooltip-Cjuu_Ld4.d.ts → tooltip-Bo9id3nz.d.ts} +6 -6
  187. package/dist/tooltip-Dzyf5smh.js +1 -2
  188. package/dist/{tooltip-Dk4HsZVR.d.cts → tooltip-JbjxxBNd.d.cts} +6 -6
  189. package/dist/{tooltip-Beb-_EPp.cjs → tooltip-MgToVOzy.cjs} +1 -2
  190. package/dist/types-B0V1F4Ml.d.cts +1 -2
  191. package/dist/{types-DLrIc2fL.d.ts → types-CmcNT14g.d.ts} +1 -2
  192. package/dist/types-CrbWxjnp.cjs +1 -2
  193. package/dist/types-DaIHddx7.js +1 -2
  194. package/dist/typography/paragraph.cjs +1 -1
  195. package/dist/typography/paragraph.d.cts +3 -3
  196. package/dist/typography/paragraph.d.ts +3 -3
  197. package/dist/typography/title.cjs +1 -1
  198. package/dist/typography/title.d.cts +4 -3
  199. package/dist/typography/title.d.ts +4 -3
  200. package/dist/ui/alert-dialog.cjs +1 -1
  201. package/dist/ui/alert-dialog.d.cts +13 -13
  202. package/dist/ui/alert-dialog.d.ts +13 -13
  203. package/dist/ui/alert-dialog.js +1 -1
  204. package/dist/ui/alert.cjs +1 -2
  205. package/dist/ui/alert.d.cts +9 -6
  206. package/dist/ui/alert.d.ts +9 -6
  207. package/dist/ui/alert.js +1 -2
  208. package/dist/ui/aspect-ratio.cjs +1 -2
  209. package/dist/ui/aspect-ratio.d.cts +3 -3
  210. package/dist/ui/aspect-ratio.d.ts +3 -3
  211. package/dist/ui/aspect-ratio.js +1 -2
  212. package/dist/ui/avatar.cjs +1 -2
  213. package/dist/ui/avatar.d.cts +5 -5
  214. package/dist/ui/avatar.d.ts +5 -5
  215. package/dist/ui/avatar.js +1 -2
  216. package/dist/ui/badge.cjs +1 -1
  217. package/dist/ui/badge.d.cts +9 -4
  218. package/dist/ui/badge.d.ts +9 -4
  219. package/dist/ui/breadcrumb.cjs +1 -2
  220. package/dist/ui/breadcrumb.d.cts +9 -9
  221. package/dist/ui/breadcrumb.d.ts +9 -9
  222. package/dist/ui/breadcrumb.js +1 -2
  223. package/dist/ui/button.cjs +1 -1
  224. package/dist/ui/button.d.cts +1 -1
  225. package/dist/ui/button.d.ts +1 -1
  226. package/dist/ui/buttons/add-new.cjs +1 -1
  227. package/dist/ui/buttons/add-new.d.cts +1 -2
  228. package/dist/ui/buttons/add-new.d.ts +1 -2
  229. package/dist/ui/buttons/add-new.js +1 -1
  230. package/dist/ui/buttons/refresh.cjs +1 -1
  231. package/dist/ui/buttons/refresh.d.cts +1 -2
  232. package/dist/ui/buttons/refresh.d.ts +1 -2
  233. package/dist/ui/buttons/refresh.js +1 -1
  234. package/dist/ui/calendar.cjs +1 -2
  235. package/dist/ui/calendar.d.cts +5 -5
  236. package/dist/ui/calendar.d.ts +5 -5
  237. package/dist/ui/calendar.js +1 -2
  238. package/dist/ui/card.cjs +1 -1
  239. package/dist/ui/card.d.cts +9 -9
  240. package/dist/ui/card.d.ts +9 -9
  241. package/dist/ui/carousel.cjs +1 -2
  242. package/dist/ui/carousel.d.cts +8 -8
  243. package/dist/ui/carousel.d.ts +8 -8
  244. package/dist/ui/carousel.js +1 -2
  245. package/dist/ui/collapsible.cjs +1 -2
  246. package/dist/ui/collapsible.d.cts +5 -5
  247. package/dist/ui/collapsible.d.ts +5 -5
  248. package/dist/ui/collapsible.js +1 -2
  249. package/dist/ui/command.cjs +1 -1
  250. package/dist/ui/command.d.cts +3 -52
  251. package/dist/ui/command.d.ts +3 -52
  252. package/dist/ui/command.js +1 -1
  253. package/dist/ui/context-menu.cjs +1 -2
  254. package/dist/ui/context-menu.d.cts +17 -17
  255. package/dist/ui/context-menu.d.ts +17 -17
  256. package/dist/ui/context-menu.js +1 -2
  257. package/dist/ui/dialog.cjs +1 -1
  258. package/dist/ui/dialog.d.cts +1 -1
  259. package/dist/ui/dialog.d.ts +1 -1
  260. package/dist/ui/dialog.js +1 -1
  261. package/dist/ui/dropdown-menu.cjs +1 -1
  262. package/dist/ui/dropdown-menu.d.cts +17 -17
  263. package/dist/ui/dropdown-menu.d.ts +17 -17
  264. package/dist/ui/dropdown-menu.js +1 -1
  265. package/dist/ui/file-uploader.cjs +2 -3
  266. package/dist/ui/file-uploader.d.cts +3 -3
  267. package/dist/ui/file-uploader.d.ts +3 -3
  268. package/dist/ui/file-uploader.js +2 -3
  269. package/dist/ui/form.cjs +1 -1
  270. package/dist/ui/form.d.cts +24 -10
  271. package/dist/ui/form.d.ts +24 -10
  272. package/dist/ui/hover-card.cjs +1 -2
  273. package/dist/ui/hover-card.d.cts +5 -5
  274. package/dist/ui/hover-card.d.ts +5 -5
  275. package/dist/ui/hover-card.js +1 -2
  276. package/dist/ui/input-otp.cjs +1 -2
  277. package/dist/ui/input-otp.d.cts +6 -6
  278. package/dist/ui/input-otp.d.ts +6 -6
  279. package/dist/ui/input-otp.js +1 -2
  280. package/dist/ui/input.cjs +1 -1
  281. package/dist/ui/input.d.cts +1 -1
  282. package/dist/ui/input.d.ts +1 -1
  283. package/dist/ui/input.js +1 -1
  284. package/dist/ui/inputs/search-input.cjs +1 -1
  285. package/dist/ui/inputs/search-input.d.cts +4 -4
  286. package/dist/ui/inputs/search-input.d.ts +4 -4
  287. package/dist/ui/inputs/search-input.js +1 -1
  288. package/dist/ui/label.cjs +1 -1
  289. package/dist/ui/label.d.cts +3 -3
  290. package/dist/ui/label.d.ts +3 -3
  291. package/dist/ui/menubar.cjs +1 -2
  292. package/dist/ui/menubar.d.cts +18 -18
  293. package/dist/ui/menubar.d.ts +18 -18
  294. package/dist/ui/menubar.js +1 -2
  295. package/dist/ui/multi-select.cjs +1 -2
  296. package/dist/ui/multi-select.d.cts +62 -3
  297. package/dist/ui/multi-select.d.ts +62 -3
  298. package/dist/ui/multi-select.js +1 -2
  299. package/dist/ui/navigation-menu.cjs +1 -2
  300. package/dist/ui/navigation-menu.d.cts +12 -11
  301. package/dist/ui/navigation-menu.d.ts +12 -11
  302. package/dist/ui/navigation-menu.js +1 -2
  303. package/dist/ui/pagination.cjs +1 -2
  304. package/dist/ui/pagination.d.cts +10 -10
  305. package/dist/ui/pagination.d.ts +10 -10
  306. package/dist/ui/pagination.js +1 -2
  307. package/dist/ui/popover.cjs +1 -2
  308. package/dist/ui/popover.d.cts +6 -6
  309. package/dist/ui/popover.d.ts +6 -6
  310. package/dist/ui/popover.js +1 -2
  311. package/dist/ui/progress.cjs +1 -1
  312. package/dist/ui/progress.d.cts +3 -3
  313. package/dist/ui/progress.d.ts +3 -3
  314. package/dist/ui/progress.js +1 -1
  315. package/dist/ui/radio-group.cjs +1 -2
  316. package/dist/ui/radio-group.d.cts +4 -4
  317. package/dist/ui/radio-group.d.ts +4 -4
  318. package/dist/ui/radio-group.js +1 -2
  319. package/dist/ui/resizable.cjs +1 -2
  320. package/dist/ui/resizable.d.cts +5 -5
  321. package/dist/ui/resizable.d.ts +5 -5
  322. package/dist/ui/resizable.js +1 -2
  323. package/dist/ui/scroll-area.cjs +1 -1
  324. package/dist/ui/scroll-area.d.cts +4 -4
  325. package/dist/ui/scroll-area.d.ts +4 -4
  326. package/dist/ui/scroll-area.js +1 -1
  327. package/dist/ui/select.cjs +1 -1
  328. package/dist/ui/select.d.cts +12 -12
  329. package/dist/ui/select.d.ts +12 -12
  330. package/dist/ui/select.js +1 -1
  331. package/dist/ui/separator.cjs +1 -1
  332. package/dist/ui/separator.d.cts +1 -1
  333. package/dist/ui/separator.d.ts +1 -1
  334. package/dist/ui/separator.js +1 -1
  335. package/dist/ui/sheet.cjs +1 -1
  336. package/dist/ui/sheet.d.cts +10 -10
  337. package/dist/ui/sheet.d.ts +10 -10
  338. package/dist/ui/sheet.js +1 -1
  339. package/dist/ui/sidebar.cjs +1 -1
  340. package/dist/ui/sidebar.d.cts +44 -31
  341. package/dist/ui/sidebar.d.ts +44 -31
  342. package/dist/ui/sidebar.js +1 -1
  343. package/dist/ui/skeleton.cjs +1 -1
  344. package/dist/ui/skeleton.d.cts +3 -3
  345. package/dist/ui/skeleton.d.ts +3 -3
  346. package/dist/ui/skeleton.js +1 -1
  347. package/dist/ui/slider.cjs +1 -2
  348. package/dist/ui/slider.d.cts +3 -3
  349. package/dist/ui/slider.d.ts +3 -3
  350. package/dist/ui/slider.js +1 -2
  351. package/dist/ui/sonner.cjs +1 -2
  352. package/dist/ui/sonner.d.cts +4 -3
  353. package/dist/ui/sonner.d.ts +4 -3
  354. package/dist/ui/sonner.js +1 -2
  355. package/dist/ui/switch.cjs +1 -2
  356. package/dist/ui/switch.d.cts +3 -3
  357. package/dist/ui/switch.d.ts +3 -3
  358. package/dist/ui/switch.js +1 -2
  359. package/dist/ui/table.cjs +1 -1
  360. package/dist/ui/table.d.cts +10 -10
  361. package/dist/ui/table.d.ts +10 -10
  362. package/dist/ui/table.js +1 -1
  363. package/dist/ui/tabs.cjs +1 -2
  364. package/dist/ui/tabs.d.cts +6 -6
  365. package/dist/ui/tabs.d.ts +6 -6
  366. package/dist/ui/tabs.js +1 -2
  367. package/dist/ui/textarea.cjs +1 -2
  368. package/dist/ui/textarea.d.cts +3 -3
  369. package/dist/ui/textarea.d.ts +3 -3
  370. package/dist/ui/textarea.js +1 -2
  371. package/dist/ui/toggle-group.cjs +1 -2
  372. package/dist/ui/toggle-group.d.cts +5 -5
  373. package/dist/ui/toggle-group.d.ts +5 -5
  374. package/dist/ui/toggle-group.js +1 -2
  375. package/dist/ui/toggle.cjs +1 -1
  376. package/dist/ui/toggle.d.cts +1 -1
  377. package/dist/ui/toggle.d.ts +1 -1
  378. package/dist/ui/toggle.js +1 -1
  379. package/dist/ui/tooltip.cjs +1 -1
  380. package/dist/ui/tooltip.d.cts +1 -1
  381. package/dist/ui/tooltip.d.ts +1 -1
  382. package/dist/utils-D9AH0PUV.js +1 -2
  383. package/dist/utils-DaJ1XZgX.cjs +1 -0
  384. package/package.json +51 -4
  385. package/packages/components/cards/simple-card.tsx +37 -0
  386. package/packages/components/data-display/country.tsx +59 -0
  387. package/packages/components/data-display/data-list.tsx +38 -0
  388. package/packages/components/data-display/date.tsx +215 -0
  389. package/packages/components/data-display/empty.tsx +25 -0
  390. package/packages/components/data-display/name.tsx +25 -0
  391. package/packages/components/data-display/phone-number.tsx +22 -0
  392. package/packages/components/data-display/role-badge.tsx +33 -0
  393. package/packages/components/data-display/statistic.tsx +141 -0
  394. package/packages/components/dialogs/confirm-dialog.tsx +51 -0
  395. package/packages/components/dialogs/detail-dialog/component/header.tsx +14 -0
  396. package/packages/components/dialogs/detail-dialog/component/main.tsx +39 -0
  397. package/packages/components/dialogs/detail-dialog/component/sidebar.tsx +747 -0
  398. package/packages/components/dialogs/detail-dialog/component/wrapper.tsx +17 -0
  399. package/packages/components/dialogs/detail-dialog/index.tsx +100 -0
  400. package/packages/components/dialogs/error-dialog.tsx +48 -0
  401. package/packages/components/dialogs/form-dialog.tsx +106 -0
  402. package/packages/components/dialogs/loading-dialog.tsx +23 -0
  403. package/packages/components/forms/combobox-field.tsx +113 -0
  404. package/packages/components/forms/date-field.tsx +65 -0
  405. package/packages/components/forms/form-wrapper.tsx +146 -0
  406. package/packages/components/forms/multi-select-field.tsx +56 -0
  407. package/packages/components/forms/number-field.tsx +56 -0
  408. package/packages/components/forms/password-field.tsx +38 -0
  409. package/packages/components/forms/select-field.tsx +58 -0
  410. package/packages/components/forms/switch-field.tsx +42 -0
  411. package/packages/components/forms/text-field.tsx +80 -0
  412. package/packages/components/forms/textarea-field.tsx +53 -0
  413. package/packages/components/index.tsx +0 -0
  414. package/packages/components/layouts/flex.tsx +110 -0
  415. package/packages/components/layouts/main/content.tsx +11 -0
  416. package/packages/components/layouts/main/header.tsx +53 -0
  417. package/packages/components/layouts/main/index.tsx +3 -0
  418. package/packages/components/layouts/main/wrapper.tsx +5 -0
  419. package/packages/components/table/data-table-pagination.tsx +99 -0
  420. package/packages/components/table/data-table.tsx +328 -0
  421. package/packages/components/table/index.tsx +126 -0
  422. package/packages/components/typography/paragraph.tsx +32 -0
  423. package/packages/components/typography/title.tsx +36 -0
  424. package/packages/components/ui/alert-dialog.tsx +173 -0
  425. package/packages/components/ui/alert.tsx +71 -0
  426. package/packages/components/ui/aspect-ratio.tsx +20 -0
  427. package/packages/components/ui/avatar.tsx +52 -0
  428. package/packages/components/ui/badge.tsx +63 -0
  429. package/packages/components/ui/breadcrumb.tsx +110 -0
  430. package/packages/components/ui/button.tsx +88 -0
  431. package/packages/components/ui/buttons/add-new.tsx +26 -0
  432. package/packages/components/ui/buttons/refresh.tsx +30 -0
  433. package/packages/components/ui/calendar.tsx +209 -0
  434. package/packages/components/ui/card.tsx +95 -0
  435. package/packages/components/ui/carousel.tsx +241 -0
  436. package/packages/components/ui/checkbox.tsx +44 -0
  437. package/packages/components/ui/collapsible.tsx +33 -0
  438. package/packages/components/ui/command.tsx +217 -0
  439. package/packages/components/ui/context-menu.tsx +258 -0
  440. package/packages/components/ui/dialog.tsx +174 -0
  441. package/packages/components/ui/dropdown-menu.tsx +318 -0
  442. package/packages/components/ui/file-uploader.tsx +372 -0
  443. package/packages/components/ui/form.tsx +168 -0
  444. package/packages/components/ui/hover-card.tsx +43 -0
  445. package/packages/components/ui/input-otp.tsx +76 -0
  446. package/packages/components/ui/input.tsx +59 -0
  447. package/packages/components/ui/inputs/number-input.tsx +325 -0
  448. package/packages/components/ui/inputs/password-input.tsx +35 -0
  449. package/packages/components/ui/inputs/search-input.tsx +24 -0
  450. package/packages/components/ui/label.tsx +29 -0
  451. package/packages/components/ui/menubar.tsx +275 -0
  452. package/packages/components/ui/multi-select.tsx +693 -0
  453. package/packages/components/ui/navigation-menu.tsx +170 -0
  454. package/packages/components/ui/pagination.tsx +128 -0
  455. package/packages/components/ui/popover.tsx +64 -0
  456. package/packages/components/ui/progress.tsx +30 -0
  457. package/packages/components/ui/radio-group.tsx +53 -0
  458. package/packages/components/ui/resizable.tsx +55 -0
  459. package/packages/components/ui/scroll-area.tsx +51 -0
  460. package/packages/components/ui/select.tsx +246 -0
  461. package/packages/components/ui/separator.tsx +27 -0
  462. package/packages/components/ui/sheet.tsx +155 -0
  463. package/packages/components/ui/sidebar.tsx +751 -0
  464. package/packages/components/ui/skeleton.tsx +15 -0
  465. package/packages/components/ui/slider.tsx +62 -0
  466. package/packages/components/ui/sonner.tsx +43 -0
  467. package/packages/components/ui/switch.tsx +52 -0
  468. package/packages/components/ui/table.tsx +118 -0
  469. package/packages/components/ui/tabs.tsx +85 -0
  470. package/packages/components/ui/textarea.tsx +47 -0
  471. package/packages/components/ui/toggle-group.tsx +72 -0
  472. package/packages/components/ui/toggle.tsx +47 -0
  473. package/packages/components/ui/tooltip.tsx +71 -0
  474. package/packages/constants.tsx +79 -0
  475. package/packages/hooks/use-callback-ref.ts +27 -0
  476. package/packages/hooks/use-controllable-state.ts +67 -0
  477. package/packages/hooks/use-mobile.ts +21 -0
  478. package/packages/index.css +392 -0
  479. package/packages/lib/utils.ts +28 -0
  480. package/packages/types.ts +50 -0
  481. package/dist/add-new-BaABbnol.js.map +0 -1
  482. package/dist/add-new-DUoS_-n2.cjs.map +0 -1
  483. package/dist/alert-dialog-0KwdjY-6.js.map +0 -1
  484. package/dist/alert-dialog-D5ZqgIiC.cjs.map +0 -1
  485. package/dist/badge-CRXT2dH_.cjs.map +0 -1
  486. package/dist/badge-D_qEoSL8.js.map +0 -1
  487. package/dist/button-Bku3bKv9.js.map +0 -1
  488. package/dist/button-D_E_bNRb.d.ts +0 -18
  489. package/dist/button-Dzv_nos1.cjs.map +0 -1
  490. package/dist/button-YHI7I64h.d.cts +0 -18
  491. package/dist/card-D8cxRC5y.js.map +0 -1
  492. package/dist/card-Dta5eW8u.cjs.map +0 -1
  493. package/dist/cards/simple-card.cjs.map +0 -1
  494. package/dist/cards/simple-card.js.map +0 -1
  495. package/dist/chunk-CUT6urMc.cjs +0 -1
  496. package/dist/command-CsntVmEz.cjs.map +0 -1
  497. package/dist/command-_L9bD9a-.js.map +0 -1
  498. package/dist/data-display/country.cjs.map +0 -1
  499. package/dist/data-display/country.js.map +0 -1
  500. package/dist/data-display/data-list.cjs.map +0 -1
  501. package/dist/data-display/data-list.js.map +0 -1
  502. package/dist/data-display/empty.cjs.map +0 -1
  503. package/dist/data-display/empty.js.map +0 -1
  504. package/dist/data-display/name.cjs.map +0 -1
  505. package/dist/data-display/name.js.map +0 -1
  506. package/dist/data-display/phone-number.cjs.map +0 -1
  507. package/dist/data-display/phone-number.js.map +0 -1
  508. package/dist/data-display/role-badge.cjs.map +0 -1
  509. package/dist/data-display/role-badge.js.map +0 -1
  510. package/dist/data-display/statistic.cjs.map +0 -1
  511. package/dist/data-display/statistic.js.map +0 -1
  512. package/dist/date-BMq_DNsv.js.map +0 -1
  513. package/dist/date-nd8WkPlx.cjs.map +0 -1
  514. package/dist/dialog-C4hf-Puw.js.map +0 -1
  515. package/dist/dialog-W-DmDMEE.cjs.map +0 -1
  516. package/dist/dialogs/confirm-dialog.cjs.map +0 -1
  517. package/dist/dialogs/confirm-dialog.js.map +0 -1
  518. package/dist/dialogs/detail-dialog/index.cjs.map +0 -1
  519. package/dist/dialogs/detail-dialog/index.js.map +0 -1
  520. package/dist/dialogs/form-dialog.cjs.map +0 -1
  521. package/dist/dialogs/form-dialog.js.map +0 -1
  522. package/dist/dialogs/loading-dialog.cjs.map +0 -1
  523. package/dist/dialogs/loading-dialog.js.map +0 -1
  524. package/dist/dropdown-menu-Bv18S56o.cjs.map +0 -1
  525. package/dist/dropdown-menu-jCQwh2rG.js.map +0 -1
  526. package/dist/error-dialog-D_4WL-Hj.js.map +0 -1
  527. package/dist/error-dialog-DpQgL5Hy.cjs.map +0 -1
  528. package/dist/flex-CNA_SId-.cjs.map +0 -1
  529. package/dist/flex-ILvQrYMJ.js.map +0 -1
  530. package/dist/form-CA4hhSV5.js.map +0 -1
  531. package/dist/form-CYZkgobJ.cjs.map +0 -1
  532. package/dist/form-wrapper-BYbwt1zC.cjs.map +0 -1
  533. package/dist/form-wrapper-D-2Uz518.js.map +0 -1
  534. package/dist/input-DXEBB91E.cjs.map +0 -1
  535. package/dist/input-FzKbxUq2.js.map +0 -1
  536. package/dist/label-CunjD1rx.cjs.map +0 -1
  537. package/dist/label-Cxbctr6x.js.map +0 -1
  538. package/dist/layouts/main/index.cjs.map +0 -1
  539. package/dist/layouts/main/index.js.map +0 -1
  540. package/dist/paragraph-Bey03JkA.js.map +0 -1
  541. package/dist/paragraph-ZxI8zxuf.cjs.map +0 -1
  542. package/dist/progress-BnnOfAZN.cjs.map +0 -1
  543. package/dist/progress-CBccqUUJ.js.map +0 -1
  544. package/dist/refresh-BHt_h3N_.js.map +0 -1
  545. package/dist/refresh-DrolZxuC.cjs.map +0 -1
  546. package/dist/scroll-area-Bdb_LSFF.js.map +0 -1
  547. package/dist/scroll-area-DWWpaz5j.cjs.map +0 -1
  548. package/dist/search-input-Bf4-FeWu.cjs.map +0 -1
  549. package/dist/search-input-L2sq0eB0.js.map +0 -1
  550. package/dist/select-CWUsisI0.js.map +0 -1
  551. package/dist/select-ZSyt5zCe.cjs.map +0 -1
  552. package/dist/separator-BpsL0PlX.js.map +0 -1
  553. package/dist/separator-DTB3sDNG.cjs.map +0 -1
  554. package/dist/sheet-C8r2QGpq.js.map +0 -1
  555. package/dist/sheet-CCwbAaA6.cjs.map +0 -1
  556. package/dist/sidebar-BLPMNltJ.cjs.map +0 -1
  557. package/dist/sidebar-C166f_9B.js.map +0 -1
  558. package/dist/skeleton-DYmX0k94.js.map +0 -1
  559. package/dist/skeleton-m3giaF4T.cjs +0 -2
  560. package/dist/skeleton-m3giaF4T.cjs.map +0 -1
  561. package/dist/table/index.cjs.map +0 -1
  562. package/dist/table/index.js.map +0 -1
  563. package/dist/table-BSeev7T0.cjs.map +0 -1
  564. package/dist/table-BvA64mE8.js.map +0 -1
  565. package/dist/title-DTkABsIG.js.map +0 -1
  566. package/dist/title-xsPZpQpb.cjs.map +0 -1
  567. package/dist/toggle-BVkMTVAz.d.ts +0 -15
  568. package/dist/toggle-CW-ZnYMy.d.cts +0 -15
  569. package/dist/toggle-CfL3GVe2.cjs.map +0 -1
  570. package/dist/toggle-D_MDMruK.js.map +0 -1
  571. package/dist/tooltip-Beb-_EPp.cjs.map +0 -1
  572. package/dist/tooltip-Dzyf5smh.js.map +0 -1
  573. package/dist/types-CrbWxjnp.cjs.map +0 -1
  574. package/dist/types-DaIHddx7.js.map +0 -1
  575. package/dist/ui/alert.cjs.map +0 -1
  576. package/dist/ui/alert.js.map +0 -1
  577. package/dist/ui/aspect-ratio.cjs.map +0 -1
  578. package/dist/ui/aspect-ratio.js.map +0 -1
  579. package/dist/ui/avatar.cjs.map +0 -1
  580. package/dist/ui/avatar.js.map +0 -1
  581. package/dist/ui/breadcrumb.cjs.map +0 -1
  582. package/dist/ui/breadcrumb.js.map +0 -1
  583. package/dist/ui/calendar.cjs.map +0 -1
  584. package/dist/ui/calendar.js.map +0 -1
  585. package/dist/ui/carousel.cjs.map +0 -1
  586. package/dist/ui/carousel.js.map +0 -1
  587. package/dist/ui/collapsible.cjs.map +0 -1
  588. package/dist/ui/collapsible.js.map +0 -1
  589. package/dist/ui/context-menu.cjs.map +0 -1
  590. package/dist/ui/context-menu.js.map +0 -1
  591. package/dist/ui/file-uploader.cjs.map +0 -1
  592. package/dist/ui/file-uploader.js.map +0 -1
  593. package/dist/ui/hover-card.cjs.map +0 -1
  594. package/dist/ui/hover-card.js.map +0 -1
  595. package/dist/ui/input-otp.cjs.map +0 -1
  596. package/dist/ui/input-otp.js.map +0 -1
  597. package/dist/ui/menubar.cjs.map +0 -1
  598. package/dist/ui/menubar.js.map +0 -1
  599. package/dist/ui/multi-select.cjs.map +0 -1
  600. package/dist/ui/multi-select.js.map +0 -1
  601. package/dist/ui/navigation-menu.cjs.map +0 -1
  602. package/dist/ui/navigation-menu.js.map +0 -1
  603. package/dist/ui/pagination.cjs.map +0 -1
  604. package/dist/ui/pagination.js.map +0 -1
  605. package/dist/ui/popover.cjs.map +0 -1
  606. package/dist/ui/popover.js.map +0 -1
  607. package/dist/ui/radio-group.cjs.map +0 -1
  608. package/dist/ui/radio-group.js.map +0 -1
  609. package/dist/ui/resizable.cjs.map +0 -1
  610. package/dist/ui/resizable.js.map +0 -1
  611. package/dist/ui/slider.cjs.map +0 -1
  612. package/dist/ui/slider.js.map +0 -1
  613. package/dist/ui/sonner.cjs.map +0 -1
  614. package/dist/ui/sonner.js.map +0 -1
  615. package/dist/ui/switch.cjs.map +0 -1
  616. package/dist/ui/switch.js.map +0 -1
  617. package/dist/ui/tabs.cjs.map +0 -1
  618. package/dist/ui/tabs.js.map +0 -1
  619. package/dist/ui/textarea.cjs.map +0 -1
  620. package/dist/ui/textarea.js.map +0 -1
  621. package/dist/ui/toggle-group.cjs.map +0 -1
  622. package/dist/ui/toggle-group.js.map +0 -1
  623. package/dist/utils-BsjVK5EW.cjs +0 -2
  624. package/dist/utils-BsjVK5EW.cjs.map +0 -1
  625. package/dist/utils-D9AH0PUV.js.map +0 -1
@@ -0,0 +1,17 @@
1
+ import { DialogContent } from "@/components/ui/dialog";
2
+
3
+ export const DetailDialogWrapper: React.FC<React.PropsWithChildren> = ({
4
+ children,
5
+ }) => {
6
+ return (
7
+ <DialogContent
8
+ className="relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]"
9
+ onInteractOutside={(e) => {
10
+ e.preventDefault();
11
+ e.stopPropagation();
12
+ }}
13
+ >
14
+ {children}
15
+ </DialogContent>
16
+ );
17
+ };
@@ -0,0 +1,100 @@
1
+ import { CatIcon } from "lucide-react";
2
+
3
+ import { Flex } from "@/components/layouts/flex";
4
+ import { Dialog } from "@/components/ui/dialog";
5
+
6
+ import { DetailDialogHeader } from "./component/header";
7
+ import { DetailDialogMain, DetailDialogMainHeader } from "./component/main";
8
+ import {
9
+ Sidebar,
10
+ SidebarContent,
11
+ SidebarFooter,
12
+ SidebarGroup,
13
+ SidebarHeader,
14
+ SidebarMenu,
15
+ SidebarMenuButton,
16
+ SidebarMenuItem,
17
+ SidebarProvider,
18
+ } from "./component/sidebar";
19
+ import { DetailDialogWrapper } from "./component/wrapper";
20
+
21
+ const DetailDialogSidebar: React.FC<
22
+ React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>
23
+ > = ({ title, sidebarFooter, children }) => {
24
+ return (
25
+ <Sidebar collapsible="icon" className="hidden border-r md:flex">
26
+ <SidebarHeader>
27
+ <SidebarMenu>
28
+ <SidebarMenuItem>
29
+ <SidebarMenuButton size="lg" tabIndex={-1}>
30
+ <div className="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg">
31
+ <CatIcon size={16} />
32
+ </div>
33
+ <div className="grid flex-1 text-left text-sm leading-tight">
34
+ <span className="truncate font-medium">
35
+ {title || "Detail Dialog"}
36
+ </span>
37
+ <span className="truncate text-xs">Lunas Enterprise</span>
38
+ </div>
39
+ </SidebarMenuButton>
40
+ </SidebarMenuItem>
41
+ </SidebarMenu>
42
+ </SidebarHeader>
43
+ <SidebarContent>
44
+ <SidebarGroup>{children}</SidebarGroup>
45
+ </SidebarContent>
46
+ {sidebarFooter && <SidebarFooter>{sidebarFooter}</SidebarFooter>}
47
+ </Sidebar>
48
+ );
49
+ };
50
+
51
+ type Props = {
52
+ open?: boolean;
53
+ isLoading?: boolean;
54
+ sidebarTitle?: string;
55
+ sidebar?: React.ReactNode;
56
+ sidebarFooter?: React.ReactNode;
57
+ title: string;
58
+ createdAt: string | Date | number;
59
+ onOpenChange?: (open: boolean) => void | Promise<void>;
60
+ };
61
+ export const DetailDialog: React.FC<React.PropsWithChildren<Props>> = ({
62
+ open,
63
+ isLoading = false,
64
+ sidebarTitle,
65
+ sidebar,
66
+ sidebarFooter,
67
+ title,
68
+ createdAt,
69
+ onOpenChange,
70
+ children,
71
+ }) => {
72
+ return (
73
+ <Dialog open={open} onOpenChange={onOpenChange}>
74
+ <DetailDialogWrapper>
75
+ <DetailDialogHeader />
76
+
77
+ <SidebarProvider className="h-full min-h-[85svh] items-start">
78
+ <DetailDialogSidebar
79
+ title={sidebarTitle}
80
+ sidebarFooter={sidebarFooter}
81
+ >
82
+ {sidebar}
83
+ </DetailDialogSidebar>
84
+ <DetailDialogMain>
85
+ <DetailDialogMainHeader title={title} createdAt={createdAt} />
86
+ {isLoading ? (
87
+ <Flex justify="center" className="bg-muted/50 size-full">
88
+ <div className="loader" />
89
+ </Flex>
90
+ ) : (
91
+ <section className="bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm">
92
+ {children}
93
+ </section>
94
+ )}
95
+ </DetailDialogMain>
96
+ </SidebarProvider>
97
+ </DetailDialogWrapper>
98
+ </Dialog>
99
+ );
100
+ };
@@ -0,0 +1,48 @@
1
+ import React from "react";
2
+ import { AlertTriangleIcon } from "lucide-react";
3
+
4
+ import {
5
+ AlertDialog,
6
+ AlertDialogAction,
7
+ AlertDialogContent,
8
+ AlertDialogFooter,
9
+ AlertDialogHeader,
10
+ AlertDialogTitle,
11
+ } from "../ui/alert-dialog";
12
+
13
+ type Props = {
14
+ open?: boolean;
15
+ title?: string;
16
+ description?: string;
17
+ onOpenChange?: (open: boolean) => void;
18
+ };
19
+ export const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({
20
+ open,
21
+ title,
22
+ children,
23
+ onOpenChange,
24
+ }) => {
25
+ const handleClose = React.useCallback(() => {
26
+ onOpenChange?.(false);
27
+ }, [onOpenChange]);
28
+ return (
29
+ <AlertDialog open={open} onOpenChange={onOpenChange}>
30
+ <AlertDialogContent className="gap-8 p-4 sm:max-w-md">
31
+ <AlertDialogHeader>
32
+ <div className="text-destructive flex flex-col items-center">
33
+ <AlertTriangleIcon size={42} />
34
+ <AlertDialogTitle className="text-xl font-medium">
35
+ {title || "An error occurred"}
36
+ </AlertDialogTitle>
37
+ </div>
38
+ </AlertDialogHeader>
39
+ {children}
40
+ <AlertDialogFooter>
41
+ <AlertDialogAction className="w-28" onClick={handleClose}>
42
+ Đóng
43
+ </AlertDialogAction>
44
+ </AlertDialogFooter>
45
+ </AlertDialogContent>
46
+ </AlertDialog>
47
+ );
48
+ };
@@ -0,0 +1,106 @@
1
+ import type {
2
+ FieldValues,
3
+ FormState,
4
+ SubmitErrorHandler,
5
+ UseFormProps,
6
+ } from "react-hook-form";
7
+
8
+ import { cn } from "@/lib/utils";
9
+
10
+ import { FormWrapper } from "../forms/form-wrapper";
11
+ import { Button } from "../ui/button";
12
+ import {
13
+ Dialog,
14
+ DialogContent,
15
+ DialogDescription,
16
+ DialogFooter,
17
+ DialogHeader,
18
+ DialogTitle,
19
+ } from "../ui/dialog";
20
+
21
+ type Props<TFieldValues extends FieldValues = FieldValues> = {
22
+ form: UseFormProps<TFieldValues>;
23
+
24
+ open: boolean;
25
+ isSubmitting?: boolean;
26
+ isResetAfterSubmit?: boolean;
27
+ disableSubmit?: boolean;
28
+ title?: string;
29
+ description?: string;
30
+ className?: string;
31
+
32
+ onOpenChange: (open: boolean) => void;
33
+ onSubmit: (
34
+ data: TFieldValues,
35
+ formState: FormState<FieldValues>,
36
+ dirtyFields: FormState<FieldValues>["dirtyFields"],
37
+ ) => void | Promise<void>;
38
+ onError?: SubmitErrorHandler<TFieldValues>;
39
+ onReset?: () => void;
40
+ };
41
+ export const FormDialog = <TFieldValues extends FieldValues = FieldValues>({
42
+ form,
43
+ open,
44
+ isSubmitting = false,
45
+ isResetAfterSubmit = true,
46
+ disableSubmit = false,
47
+ title,
48
+ description,
49
+ className,
50
+
51
+ onOpenChange,
52
+ onSubmit,
53
+ onError,
54
+ onReset,
55
+ children,
56
+ }: React.PropsWithChildren<Props<TFieldValues>>) => {
57
+ return (
58
+ <Dialog open={open} onOpenChange={onOpenChange}>
59
+ <DialogContent
60
+ className={cn("flex flex-col gap-0 border-none p-0", className)}
61
+ onInteractOutside={(e) => {
62
+ e.preventDefault();
63
+ e.stopPropagation();
64
+ }}
65
+ >
66
+ <DialogHeader className="flex-0 gap-2 border-b px-6 pt-6 pb-4">
67
+ <DialogTitle>{title || "Form Dialog"}</DialogTitle>
68
+ <DialogDescription>
69
+ {description ||
70
+ "This is a form dialog where you can add your form elements."}
71
+ </DialogDescription>
72
+ </DialogHeader>
73
+ <FormWrapper
74
+ form={form}
75
+ isResetAfterSubmit={isResetAfterSubmit}
76
+ className="flex flex-1 flex-col overflow-y-auto pt-4"
77
+ onSubmit={onSubmit}
78
+ onError={onError}
79
+ >
80
+ <main className="flex-1 overflow-y-auto px-6">{children}</main>
81
+ <DialogFooter className="border-t px-6 pt-4 pb-6">
82
+ <Button
83
+ tabIndex={-1}
84
+ type="button"
85
+ variant="outline"
86
+ className="w-30 rounded-full"
87
+ onClick={onReset}
88
+ >
89
+ Reset
90
+ </Button>
91
+ <Button
92
+ autoFocus
93
+ tabIndex={0}
94
+ type="submit"
95
+ isLoading={isSubmitting}
96
+ disabled={disableSubmit}
97
+ className="w-30 rounded-full"
98
+ >
99
+ Xác nhận
100
+ </Button>
101
+ </DialogFooter>
102
+ </FormWrapper>
103
+ </DialogContent>
104
+ </Dialog>
105
+ );
106
+ };
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+
3
+ import { Dialog, DialogContent, DialogTitle } from "../ui/dialog";
4
+
5
+ type Props = {
6
+ open?: boolean;
7
+ onOpenChange?: (open: boolean) => void;
8
+ };
9
+ export const LoadingDialog: React.FC<Props> = ({ open, onOpenChange }) => {
10
+ return (
11
+ <Dialog open={open} onOpenChange={onOpenChange}>
12
+ <DialogContent
13
+ showCloseButton={false}
14
+ className="pointer-events-none border-none bg-transparent shadow-none outline-0 [&>div]:bg-transparent"
15
+ >
16
+ <DialogTitle />
17
+ <div className="flex items-center justify-center">
18
+ <div className="loader opacity-60" />
19
+ </div>
20
+ </DialogContent>
21
+ </Dialog>
22
+ );
23
+ };
@@ -0,0 +1,113 @@
1
+ "use client"
2
+ import React from 'react'
3
+ import type { FieldPath, FieldValues } from 'react-hook-form'
4
+ import { ChevronDownIcon, PlusIcon } from 'lucide-react'
5
+
6
+ import { Button } from '@/components/ui/button'
7
+ import {
8
+ Command,
9
+ CommandEmpty,
10
+ CommandGroup,
11
+ CommandInput,
12
+ CommandItem,
13
+ CommandList,
14
+ CommandSeparator,
15
+ } from '@/components/ui/command'
16
+ import { FormControl, FormDescription, FormField, FormItem, FormLabel } from '@/components/ui/form'
17
+ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
18
+ import { cn } from '@/lib/utils'
19
+ import { PopoverPortal } from '@radix-ui/react-popover'
20
+
21
+ type Props<TFieldValues extends FieldValues = FieldValues> = {
22
+ name: FieldPath<TFieldValues>
23
+ label?: string
24
+ placeholder?: string
25
+ options?: { value: string | number; label: string }[]
26
+ isShowErrorMsg?: boolean
27
+ modal?: boolean
28
+ description?: string
29
+ onAddNewItem?: () => void
30
+ }
31
+
32
+ export const ComboboxField = <TFieldValues extends FieldValues = FieldValues>({
33
+ name,
34
+ label = 'Combobox',
35
+ placeholder = 'Chọn một mục',
36
+ description,
37
+ options,
38
+ onAddNewItem,
39
+ }: Props<TFieldValues>) => {
40
+ return (
41
+ <FormField
42
+ name={name}
43
+ render={({ field }) => {
44
+ return (
45
+ <FormItem className="w-full">
46
+ <FormLabel>{label}</FormLabel>
47
+ <Popover modal={true}>
48
+ <PopoverTrigger asChild>
49
+ <FormControl>
50
+ <Button
51
+ type="button"
52
+ variant="outline"
53
+ role="combobox"
54
+ className={cn(
55
+ 'flex justify-between rounded-md px-3',
56
+ 'font-normal outline-offset-0',
57
+ 'focus-visible:outline-[3px]',
58
+ '[&_div]:justify-between',
59
+ 'data-[state=open]:border-primary',
60
+ 'data-[state=open]:ring-ring',
61
+ 'data-[state=open]:ring-4',
62
+ 'focus:border-primary',
63
+ 'focus:ring-ring',
64
+ 'focus:ring-4',
65
+ )}
66
+ >
67
+ {field.value ? (
68
+ <span className="flex min-w-0 items-center gap-2">
69
+ {options?.find(({ value }) => value === field.value)?.label}
70
+ </span>
71
+ ) : (
72
+ <span className="text-muted-foreground">{placeholder}</span>
73
+ )}
74
+ <ChevronDownIcon size={16} className="text-muted-foreground/80 shrink-0" aria-hidden="true" />
75
+ </Button>
76
+ </FormControl>
77
+ </PopoverTrigger>
78
+ <PopoverPortal>
79
+ <PopoverContent className="border-input w-full max-w-[var(--radix-popover-trigger-width)] p-0">
80
+ <Command>
81
+ <CommandInput placeholder={placeholder ?? 'Tìm kiếm'} />
82
+ <CommandList>
83
+ <CommandGroup className="max-h-40 overflow-y-auto">
84
+ {options?.map(({ value, label }) => (
85
+ <CommandItem key={value} value={label} onSelect={() => field.onChange(value)}>
86
+ {label}
87
+ </CommandItem>
88
+ ))}
89
+ </CommandGroup>
90
+ {onAddNewItem && (
91
+ <React.Fragment>
92
+ <CommandSeparator />
93
+ <CommandGroup>
94
+ <Button type="button" variant="ghost" className="w-full justify-start font-normal">
95
+ <PlusIcon size={14} className="-ms-2 opacity-60" aria-hidden="true" />
96
+ Thêm mới
97
+ </Button>
98
+ </CommandGroup>
99
+ </React.Fragment>
100
+ )}
101
+ </CommandList>
102
+ <CommandEmpty>Không có kết quả</CommandEmpty>
103
+ </Command>
104
+ </PopoverContent>
105
+ </PopoverPortal>
106
+ </Popover>
107
+ {!!description && <FormDescription>{description}</FormDescription>}
108
+ </FormItem>
109
+ )
110
+ }}
111
+ />
112
+ )
113
+ }
@@ -0,0 +1,65 @@
1
+ "use client"
2
+ import type { FieldPath, FieldValues } from 'react-hook-form'
3
+ import { format } from 'date-fns'
4
+ import { CalendarIcon } from 'lucide-react'
5
+
6
+ import { cn } from '@/lib/utils'
7
+
8
+ import { Button } from '../ui/button'
9
+ import { Calendar } from '../ui/calendar'
10
+ import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '../ui/form'
11
+ import { Popover, PopoverContent, PopoverTrigger } from '../ui/popover'
12
+
13
+ type Props<TFieldValues extends FieldValues = FieldValues> = {
14
+ name: FieldPath<TFieldValues>
15
+ label?: string
16
+ placeholder?: string
17
+ description?: string
18
+ isShowErrorMsg?: boolean
19
+ modal?: boolean
20
+ }
21
+
22
+ export const DateField = <TFieldValues extends FieldValues = FieldValues>({
23
+ name,
24
+ label = 'Date Field',
25
+ placeholder = 'Select a date',
26
+ description = '',
27
+ isShowErrorMsg = false,
28
+ }: Props<TFieldValues>) => {
29
+ return (
30
+ <FormField
31
+ name={name}
32
+ render={({ field }) => (
33
+ <FormItem className="w-full">
34
+ <FormLabel>{label}</FormLabel>
35
+ <Popover modal>
36
+ <PopoverTrigger asChild>
37
+ <FormControl>
38
+ <Button
39
+ variant="outline"
40
+ className={cn('w-full pl-3 text-left font-normal', !field.value && 'text-muted-foreground')}
41
+ >
42
+ {field.value ? format(field.value, 'PPP') : <span> {placeholder || 'Pick a date'}</span>}
43
+ <CalendarIcon className="ml-auto size-4 opacity-50" />
44
+ </Button>
45
+ </FormControl>
46
+ </PopoverTrigger>
47
+ <PopoverContent className="w-auto p-0" align="start">
48
+ <Calendar
49
+ mode="single"
50
+ selected={field.value}
51
+ onSelect={(date) => {
52
+ field.onChange(date?.toISOString())
53
+ }}
54
+ captionLayout="dropdown"
55
+ disabled={(date) => date < new Date('2022-01-01')}
56
+ />
57
+ </PopoverContent>
58
+ </Popover>
59
+ {!!description && <FormDescription>{description}</FormDescription>}
60
+ {isShowErrorMsg && <FormMessage />}
61
+ </FormItem>
62
+ )}
63
+ />
64
+ )
65
+ }
@@ -0,0 +1,146 @@
1
+ import React from "react";
2
+ import {
3
+ type FieldValues,
4
+ type FormState,
5
+ type SubmitErrorHandler,
6
+ type SubmitHandler,
7
+ useForm,
8
+ type UseFormProps,
9
+ } from "react-hook-form";
10
+ import { AlertCircleIcon } from "lucide-react";
11
+
12
+ import type { AnyEntity } from "@/types";
13
+ import { ErrorMessage } from "@hookform/error-message";
14
+
15
+ import { ErrorDialog } from "../dialogs/error-dialog";
16
+ import { Form } from "../ui/form";
17
+
18
+ type Props<TFieldValues extends FieldValues = FieldValues> = {
19
+ form: UseFormProps<TFieldValues>;
20
+ isResetAfterSubmit?: boolean;
21
+ className?: string;
22
+ onSubmit: (
23
+ data: TFieldValues,
24
+ formState: FormState<FieldValues>,
25
+ dirtyFields: FormState<FieldValues>["dirtyFields"],
26
+ ) => void | Promise<void>;
27
+ onError?: SubmitErrorHandler<TFieldValues>;
28
+ onSubcribe?: (values: TFieldValues) => void;
29
+ };
30
+
31
+ export const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({
32
+ form: FormConfig,
33
+ isResetAfterSubmit = true,
34
+ className,
35
+ onSubmit,
36
+ onError,
37
+ onSubcribe,
38
+ children,
39
+ }: React.PropsWithChildren<Props<TFieldValues>>) => {
40
+ const form = useForm({
41
+ ...FormConfig,
42
+ criteriaMode: "all",
43
+ });
44
+
45
+ const { formState, reset, handleSubmit, subscribe } = form;
46
+ const { dirtyFields } = formState;
47
+
48
+ const [errorOpen, setErrorOpen] = React.useState<boolean>(false);
49
+
50
+ const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(
51
+ (data) => {
52
+ onSubmit(data, formState, dirtyFields);
53
+ if (isResetAfterSubmit) {
54
+ reset();
55
+ }
56
+ },
57
+ [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],
58
+ );
59
+
60
+ const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(
61
+ (errors) => {
62
+ const errorKeys = Object.keys(errors);
63
+ if (errorKeys.length === 0) return;
64
+ onError?.(errors);
65
+ setErrorOpen(true);
66
+ },
67
+ [onError],
68
+ );
69
+
70
+ React.useEffect(() => {
71
+ if (!onSubcribe) return;
72
+ const callback = subscribe({
73
+ formState: { values: true },
74
+ callback: ({ values }) => {
75
+ onSubcribe(values);
76
+ },
77
+ });
78
+ return () => callback();
79
+ }, [onSubcribe, subscribe]);
80
+
81
+ return (
82
+ <Form {...form}>
83
+ <form
84
+ className={className}
85
+ onSubmit={handleSubmit(handleFormSubmit, handleFormError)}
86
+ >
87
+ {children}
88
+ </form>
89
+ <ErrorDialog
90
+ open={errorOpen}
91
+ title="Lỗi nhập dữ liệu"
92
+ description="An unexpected error has occurred. Please check the errors below and try again."
93
+ onOpenChange={setErrorOpen}
94
+ >
95
+ {errorOpen && (
96
+ <>
97
+ {Object.keys(formState.errors).length > 0 ? (
98
+ <div className="flex max-w-100 flex-col gap-2 px-4">
99
+ <p className="text-muted-foreground text-sm font-semibold">
100
+ Cảnh báo: Vui lòng kiểm tra các lỗi sau:
101
+ </p>
102
+ <div className="flex flex-col space-y-1">
103
+ {Object.entries(formState.errors).map(([key]) => (
104
+ <ErrorMessage
105
+ key={key}
106
+ errors={formState.errors}
107
+ name={key as AnyEntity}
108
+ render={({ messages }) => {
109
+ return (
110
+ <>
111
+ {messages
112
+ ? Object.entries(messages).map(
113
+ ([type, message]) => {
114
+ return (
115
+ <div
116
+ key={type}
117
+ className="text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal"
118
+ >
119
+ <AlertCircleIcon
120
+ size={16}
121
+ className="text-destructive mt-0.5 min-w-4 flex-0"
122
+ />
123
+ <p className="line-clamp-2 flex-1 text-wrap">
124
+ {message}
125
+ </p>
126
+ </div>
127
+ );
128
+ },
129
+ )
130
+ : null}
131
+ </>
132
+ );
133
+ }}
134
+ />
135
+ ))}
136
+ </div>
137
+ </div>
138
+ ) : (
139
+ <p className="text-muted-foreground text-sm">No errors found.</p>
140
+ )}
141
+ </>
142
+ )}
143
+ </ErrorDialog>
144
+ </Form>
145
+ );
146
+ };
@@ -0,0 +1,56 @@
1
+ "use client"
2
+ import type { FieldPath, FieldValues } from 'react-hook-form'
3
+
4
+ import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '../ui/form'
5
+ import MultipleSelector, { type Option } from '../ui/multi-select'
6
+
7
+ type Props<TFieldValues extends FieldValues = FieldValues> = {
8
+ name: FieldPath<TFieldValues>
9
+ isShowLabel?: boolean
10
+ isShowErrorMsg?: boolean
11
+ label?: string
12
+ description?: string
13
+ placeholder?: string
14
+ options?: { value: string; label: string }[]
15
+ onAdd?: () => void
16
+ }
17
+ export const MultiSelectField = <TFieldValues extends FieldValues = FieldValues>({
18
+ name,
19
+ label = 'Multi Select Field',
20
+ isShowLabel = true,
21
+ isShowErrorMsg,
22
+ placeholder = 'Select options',
23
+ description = '',
24
+ options = [],
25
+ onAdd,
26
+ }: Props<TFieldValues>) => {
27
+ return (
28
+ <FormField
29
+ name={name}
30
+ render={({ field: { value, onChange } }) => {
31
+ const val = options.filter((option) => value?.includes(option.value))
32
+ const handleOnChange = (value: Option[]) => {
33
+ const selectedValues = value.map((v) => v.value)
34
+ onChange(selectedValues)
35
+ }
36
+ return (
37
+ <FormItem className="w-full gap-0">
38
+ {isShowLabel && <FormLabel>{label}</FormLabel>}
39
+ <FormControl>
40
+ <MultipleSelector
41
+ placeholder={placeholder}
42
+ emptyIndicator="No options available"
43
+ value={val}
44
+ options={options}
45
+ onChange={handleOnChange}
46
+ onAddNewItem={onAdd}
47
+ />
48
+ </FormControl>
49
+ {!!description && <FormDescription>{description}</FormDescription>}
50
+ {isShowErrorMsg && <FormMessage />}
51
+ </FormItem>
52
+ )
53
+ }}
54
+ />
55
+ )
56
+ }