@customafk/lunas-ui 0.2.20 → 0.2.21

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 (334) hide show
  1. package/dist/{alert-iwPuxYjG.d.cts → alert-BVAbQWFI.d.cts} +7 -7
  2. package/dist/{alert-Dn5x8pBc.mjs → alert-C-Y4ZWNd.mjs} +1 -1
  3. package/dist/{alert-Dn5x8pBc.mjs.map → alert-C-Y4ZWNd.mjs.map} +1 -1
  4. package/dist/{alert-CwIH3Hkd.d.mts → alert-CSWXGnl2.d.mts} +7 -7
  5. package/dist/{avatar-5LzTjIjo.mjs → avatar-SJmvlfqm.mjs} +1 -1
  6. package/dist/{avatar-5LzTjIjo.mjs.map → avatar-SJmvlfqm.mjs.map} +1 -1
  7. package/dist/{badge-DBsYYM8d.d.cts → badge-BnpWeeM-.d.cts} +5 -5
  8. package/dist/{badge-DYcJtNU0.mjs → badge-DSwkF4C4.mjs} +1 -1
  9. package/dist/{badge-DYcJtNU0.mjs.map → badge-DSwkF4C4.mjs.map} +1 -1
  10. package/dist/{badge-CINaZwOW.d.mts → badge-DjmK3DTo.d.mts} +3 -3
  11. package/dist/{button-DPABon17.mjs → button-Bc8L9sFb.mjs} +2 -2
  12. package/dist/{button-DPABon17.mjs.map → button-Bc8L9sFb.mjs.map} +1 -1
  13. package/dist/{button-UgIAM1cP.d.cts → button-BxGWLI9o.d.cts} +5 -5
  14. package/dist/{button-DdwLbwWQ.d.mts → button-DxWrJ_EO.d.mts} +5 -5
  15. package/dist/{button.variants-B8KCLWPT.mjs → button.variants-CwcJHcI5.mjs} +1 -1
  16. package/dist/{button.variants-B8KCLWPT.mjs.map → button.variants-CwcJHcI5.mjs.map} +1 -1
  17. package/dist/{calendar-DJnuujFC.mjs → calendar-C2psGpju.mjs} +2 -2
  18. package/dist/{calendar-DJnuujFC.mjs.map → calendar-C2psGpju.mjs.map} +1 -1
  19. package/dist/cards/grid-product-card.mjs +1 -1
  20. package/dist/cards/product-card.mjs +1 -1
  21. package/dist/cards/simple-card.mjs +1 -1
  22. package/dist/{checkbox-dDSDiwLB.mjs → checkbox-Bwy_4QS_.mjs} +1 -1
  23. package/dist/{checkbox-dDSDiwLB.mjs.map → checkbox-Bwy_4QS_.mjs.map} +1 -1
  24. package/dist/{close-BcOkVqd8.mjs → close-BS6EeCrQ.mjs} +1 -1
  25. package/dist/{close-BcOkVqd8.mjs.map → close-BS6EeCrQ.mjs.map} +1 -1
  26. package/dist/{cms-layout-CujBx9FA.mjs → cms-layout-DCODI3eE.mjs} +2 -2
  27. package/dist/{cms-layout-CujBx9FA.mjs.map → cms-layout-DCODI3eE.mjs.map} +1 -1
  28. package/dist/{command-B8y4H5q5.mjs → command-B5DpL6OG.mjs} +2 -2
  29. package/dist/{command-B8y4H5q5.mjs.map → command-B5DpL6OG.mjs.map} +1 -1
  30. package/dist/data-display/country.d.cts +1 -1
  31. package/dist/data-display/country.d.mts +1 -1
  32. package/dist/data-display/country.mjs +1 -1
  33. package/dist/data-display/date-tooltip.mjs +1 -1
  34. package/dist/data-display/date.mjs +1 -1
  35. package/dist/data-display/name.mjs +1 -1
  36. package/dist/data-display/phone-number.mjs +1 -1
  37. package/dist/data-display/role-badge.d.cts +1 -1
  38. package/dist/data-display/role-badge.d.mts +1 -1
  39. package/dist/data-display/role-badge.mjs +1 -1
  40. package/dist/data-display/statistic.d.mts +2 -2
  41. package/dist/data-display/user.mjs +1 -1
  42. package/dist/{date-C76vNHGL.mjs → date-D_nB7Lh1.mjs} +1 -1
  43. package/dist/{date-C76vNHGL.mjs.map → date-D_nB7Lh1.mjs.map} +1 -1
  44. package/dist/{dialog-HXH3FYKH.d.cts → dialog-D28jTUyP.d.cts} +12 -12
  45. package/dist/{dialog-dqqupmOT.mjs → dialog-DG4vMCr5.mjs} +2 -2
  46. package/dist/{dialog-dqqupmOT.mjs.map → dialog-DG4vMCr5.mjs.map} +1 -1
  47. package/dist/{dialog-CfbtCisP.d.mts → dialog-Fcy96kRf.d.mts} +12 -12
  48. package/dist/dialogs/confirm-dialog.mjs +1 -1
  49. package/dist/dialogs/detail-dialog/components/sidebar.d.cts +1 -1
  50. package/dist/dialogs/detail-dialog/components/sidebar.d.mts +24 -24
  51. package/dist/dialogs/detail-dialog/components/sidebar.mjs +1 -1
  52. package/dist/dialogs/detail-dialog/index.mjs +1 -1
  53. package/dist/dialogs/error-dialog.mjs +1 -1
  54. package/dist/dialogs/loading-dialog.mjs +1 -1
  55. package/dist/{dist-DPEjz4kv.mjs → dist-XxWAVHy8.mjs} +1 -1
  56. package/dist/{dist-DPEjz4kv.mjs.map → dist-XxWAVHy8.mjs.map} +1 -1
  57. package/dist/{dropdown-menu-BocQ2Vev.mjs → dropdown-menu-BlsIwe4B.mjs} +1 -1
  58. package/dist/{dropdown-menu-BocQ2Vev.mjs.map → dropdown-menu-BlsIwe4B.mjs.map} +1 -1
  59. package/dist/features/descriptions/index.d.cts +5 -5
  60. package/dist/features/descriptions/index.d.mts +5 -5
  61. package/dist/features/descriptions/index.mjs +1 -1
  62. package/dist/features/search-modal/index.d.cts +2 -2
  63. package/dist/features/search-modal/index.d.mts +2 -2
  64. package/dist/features/search-modal/index.mjs +1 -1
  65. package/dist/features/tables/index.d.cts +1 -1
  66. package/dist/features/tables/index.d.mts +2 -2
  67. package/dist/features/tables/index.mjs +1 -1
  68. package/dist/features/tanstack-form/index.d.cts +1 -1
  69. package/dist/features/tanstack-form/index.d.mts +1 -1
  70. package/dist/features/tanstack-form/index.mjs +1 -1
  71. package/dist/features/text-editor/index.d.cts +1 -1
  72. package/dist/features/text-editor/index.d.mts +1 -1
  73. package/dist/features/text-editor/index.mjs +1 -1
  74. package/dist/{field-DaZocB_E.mjs → field-Mn2bf2Ns.mjs} +2 -2
  75. package/dist/{field-DaZocB_E.mjs.map → field-Mn2bf2Ns.mjs.map} +1 -1
  76. package/dist/{flex-zl_w1yeZ.mjs → flex-Br7F9Fln.mjs} +1 -1
  77. package/dist/{flex-zl_w1yeZ.mjs.map → flex-Br7F9Fln.mjs.map} +1 -1
  78. package/dist/{heading-D8K7UGv2.mjs → heading-BnaNuvDS.mjs} +1 -1
  79. package/dist/{heading-D8K7UGv2.mjs.map → heading-BnaNuvDS.mjs.map} +1 -1
  80. package/dist/{image-WRAFECmc.mjs → image-C-CdKKP1.mjs} +2 -2
  81. package/dist/{image-WRAFECmc.mjs.map → image-C-CdKKP1.mjs.map} +1 -1
  82. package/dist/{index-DWGlOnex.d.cts → index--EqgvW4c.d.cts} +29 -29
  83. package/dist/{index-D09-9eQ8.d.cts → index-CST_ZBzY.d.mts} +294 -294
  84. package/dist/{index-Dn6FVL5X.d.cts → index-CrnEUjWU.d.mts} +6 -6
  85. package/dist/{index-DXXR4oq-.d.mts → index-DYKVk2cJ.d.cts} +102 -102
  86. package/dist/{index-BreahdZP.d.mts → index-DtwMtKUS.d.mts} +9 -9
  87. package/dist/{index-3ZBP9XKI.d.mts → index-y3v1_4XZ.d.cts} +6 -6
  88. package/dist/index.cjs +1 -1
  89. package/dist/index.d.cts +13 -10
  90. package/dist/index.d.mts +13 -10
  91. package/dist/index.mjs +1 -1
  92. package/dist/{input-BpTmuYnJ.d.mts → input-CK10I74-.d.cts} +5 -5
  93. package/dist/{input-BTm2GrZP.mjs → input-DLRypEj3.mjs} +1 -1
  94. package/dist/{input-BTm2GrZP.mjs.map → input-DLRypEj3.mjs.map} +1 -1
  95. package/dist/{input-DjEul_uK.d.cts → input-DP5cYLNw.d.mts} +5 -5
  96. package/dist/{label-BC2u42kJ.mjs → label-BukQnBn7.mjs} +1 -1
  97. package/dist/{label-BC2u42kJ.mjs.map → label-BukQnBn7.mjs.map} +1 -1
  98. package/dist/layouts/cms-layout/index.mjs +1 -1
  99. package/dist/layouts/flex.d.cts +2 -2
  100. package/dist/layouts/flex.d.mts +4 -4
  101. package/dist/layouts/flex.mjs +1 -1
  102. package/dist/layouts/payment-layout/index.cjs +1 -1
  103. package/dist/layouts/payment-layout/index.d.cts +17 -2
  104. package/dist/layouts/payment-layout/index.d.mts +17 -2
  105. package/dist/layouts/payment-layout/index.mjs +1 -1
  106. package/dist/pages/FeatureDeveloping.d.cts +2 -2
  107. package/dist/pages/FeatureDeveloping.d.mts +2 -2
  108. package/dist/pages/FeatureDeveloping.mjs +1 -1
  109. package/dist/pages/FeatureFixing.d.cts +2 -2
  110. package/dist/pages/FeatureFixing.d.mts +2 -2
  111. package/dist/pages/FeatureFixing.mjs +1 -1
  112. package/dist/pages/LoginPage.cjs +2 -0
  113. package/dist/pages/LoginPage.cjs.map +1 -0
  114. package/dist/pages/LoginPage.d.cts +55 -0
  115. package/dist/pages/LoginPage.d.mts +55 -0
  116. package/dist/pages/LoginPage.mjs +2 -0
  117. package/dist/pages/LoginPage.mjs.map +1 -0
  118. package/dist/pages/NotAuthorized.d.cts +2 -2
  119. package/dist/pages/NotAuthorized.d.mts +2 -2
  120. package/dist/pages/NotAuthorized.mjs +1 -1
  121. package/dist/pages/NotFound.d.cts +2 -2
  122. package/dist/pages/NotFound.d.mts +2 -2
  123. package/dist/pages/NotFound.mjs +1 -1
  124. package/dist/pages/RegisterPage.cjs +2 -0
  125. package/dist/pages/RegisterPage.cjs.map +1 -0
  126. package/dist/pages/RegisterPage.d.cts +52 -0
  127. package/dist/pages/RegisterPage.d.mts +52 -0
  128. package/dist/pages/RegisterPage.mjs +2 -0
  129. package/dist/pages/RegisterPage.mjs.map +1 -0
  130. package/dist/pages/VerifyEmailPage.cjs +2 -0
  131. package/dist/pages/VerifyEmailPage.cjs.map +1 -0
  132. package/dist/pages/VerifyEmailPage.d.cts +64 -0
  133. package/dist/pages/VerifyEmailPage.d.mts +64 -0
  134. package/dist/pages/VerifyEmailPage.mjs +2 -0
  135. package/dist/pages/VerifyEmailPage.mjs.map +1 -0
  136. package/dist/{paragraph-jzLzzEYZ.mjs → paragraph-CnHNC0rS.mjs} +1 -1
  137. package/dist/{paragraph-jzLzzEYZ.mjs.map → paragraph-CnHNC0rS.mjs.map} +1 -1
  138. package/dist/payment-layout-0mqqno1V.cjs +2 -0
  139. package/dist/payment-layout-0mqqno1V.cjs.map +1 -0
  140. package/dist/payment-layout-ClqGIxV7.mjs +2 -0
  141. package/dist/payment-layout-ClqGIxV7.mjs.map +1 -0
  142. package/dist/{popover-HZvZNeka.mjs → popover-DvGJ23lJ.mjs} +2 -2
  143. package/dist/{popover-HZvZNeka.mjs.map → popover-DvGJ23lJ.mjs.map} +1 -1
  144. package/dist/{progress-CgQ13rSf.mjs → progress-2G9rCupJ.mjs} +1 -1
  145. package/dist/{progress-CgQ13rSf.mjs.map → progress-2G9rCupJ.mjs.map} +1 -1
  146. package/dist/{radio-group-BN5y5gZY.mjs → radio-group-fN6o0QBx.mjs} +1 -1
  147. package/dist/{radio-group-BN5y5gZY.mjs.map → radio-group-fN6o0QBx.mjs.map} +1 -1
  148. package/dist/{resizable-CLUR91Hx.mjs → resizable-BxsL978e.mjs} +1 -1
  149. package/dist/{resizable-CLUR91Hx.mjs.map → resizable-BxsL978e.mjs.map} +1 -1
  150. package/dist/{search-modal-Dz7rfifb.mjs → search-modal-DZI6O6ua.mjs} +2 -2
  151. package/dist/{search-modal-Dz7rfifb.mjs.map → search-modal-DZI6O6ua.mjs.map} +1 -1
  152. package/dist/{select-1Z1p9bmp.mjs → select-Ze8Fq88G.mjs} +1 -1
  153. package/dist/{select-1Z1p9bmp.mjs.map → select-Ze8Fq88G.mjs.map} +1 -1
  154. package/dist/{separator-DVI2h_rd.mjs → separator-DXnFHf3v.mjs} +1 -1
  155. package/dist/{separator-DVI2h_rd.mjs.map → separator-DXnFHf3v.mjs.map} +1 -1
  156. package/dist/{sheet-BRXYSJDv.mjs → sheet-GUUifKAd.mjs} +1 -1
  157. package/dist/{sheet-BRXYSJDv.mjs.map → sheet-GUUifKAd.mjs.map} +1 -1
  158. package/dist/{sidebar-QPaK3ryM.mjs → sidebar-C_jArO1q.mjs} +2 -2
  159. package/dist/{sidebar-QPaK3ryM.mjs.map → sidebar-C_jArO1q.mjs.map} +1 -1
  160. package/dist/{skeleton-CZVkWN4p.mjs → skeleton-BLwzHejl.mjs} +1 -1
  161. package/dist/{skeleton-CZVkWN4p.mjs.map → skeleton-BLwzHejl.mjs.map} +1 -1
  162. package/dist/{spinner-DkmcGiVT.mjs → spinner-BaZ19Lla.mjs} +1 -1
  163. package/dist/{spinner-DkmcGiVT.mjs.map → spinner-BaZ19Lla.mjs.map} +1 -1
  164. package/dist/{tables-BZ5jLRGG.mjs → tables-BZQ6E523.mjs} +2 -2
  165. package/dist/{tables-BZ5jLRGG.mjs.map → tables-BZQ6E523.mjs.map} +1 -1
  166. package/dist/{tanstack-form-Sqj9ZD9z.mjs → tanstack-form-C1EVQJ-n.mjs} +2 -2
  167. package/dist/{tanstack-form-Sqj9ZD9z.mjs.map → tanstack-form-C1EVQJ-n.mjs.map} +1 -1
  168. package/dist/{text-editor-BLK_EeiU.mjs → text-editor-ae2UTKW8.mjs} +1 -1
  169. package/dist/{text-editor-BLK_EeiU.mjs.map → text-editor-ae2UTKW8.mjs.map} +1 -1
  170. package/dist/{textarea-D2ILgz82.mjs → textarea-CEtUNLwy.mjs} +1 -1
  171. package/dist/{textarea-D2ILgz82.mjs.map → textarea-CEtUNLwy.mjs.map} +1 -1
  172. package/dist/{tooltip-C7UhtrFf.mjs → tooltip-Cy0HbyAx.mjs} +1 -1
  173. package/dist/{tooltip-C7UhtrFf.mjs.map → tooltip-Cy0HbyAx.mjs.map} +1 -1
  174. package/dist/{types-BonWRhox.d.mts → types-CLkAmCre.d.cts} +1 -1
  175. package/dist/{types-COppLTPh.mjs → types-CuAlMviO.mjs} +1 -1
  176. package/dist/{types-COppLTPh.mjs.map → types-CuAlMviO.mjs.map} +1 -1
  177. package/dist/{types-CILbFL3j.d.cts → types-wApFGHmV.d.mts} +1 -1
  178. package/dist/typography/paragraph.d.cts +3 -3
  179. package/dist/typography/paragraph.d.mts +5 -5
  180. package/dist/typography/paragraph.mjs +1 -1
  181. package/dist/typography/title.d.cts +2 -2
  182. package/dist/typography/title.d.mts +2 -2
  183. package/dist/ui/alert-dialog.d.cts +12 -12
  184. package/dist/ui/alert-dialog.d.mts +12 -12
  185. package/dist/ui/alert-dialog.mjs +1 -1
  186. package/dist/ui/alert.d.cts +1 -1
  187. package/dist/ui/alert.d.mts +1 -1
  188. package/dist/ui/alert.mjs +1 -1
  189. package/dist/ui/aspect-ratio.d.cts +2 -2
  190. package/dist/ui/aspect-ratio.d.mts +2 -2
  191. package/dist/ui/avatar.d.cts +4 -4
  192. package/dist/ui/avatar.d.mts +4 -4
  193. package/dist/ui/avatar.mjs +1 -1
  194. package/dist/ui/badge.d.cts +1 -1
  195. package/dist/ui/badge.d.mts +1 -1
  196. package/dist/ui/badge.mjs +1 -1
  197. package/dist/ui/breadcrumb.d.cts +8 -8
  198. package/dist/ui/breadcrumb.d.mts +8 -8
  199. package/dist/ui/breadcrumb.mjs +1 -1
  200. package/dist/ui/button-group.d.cts +6 -6
  201. package/dist/ui/button-group.d.mts +4 -4
  202. package/dist/ui/button-group.mjs +1 -1
  203. package/dist/ui/button.d.cts +1 -1
  204. package/dist/ui/button.d.mts +1 -1
  205. package/dist/ui/button.mjs +1 -1
  206. package/dist/ui/buttons/add-new.mjs +1 -1
  207. package/dist/ui/buttons/edit.mjs +1 -1
  208. package/dist/ui/buttons/refresh.mjs +1 -1
  209. package/dist/ui/buttons/trash.mjs +1 -1
  210. package/dist/ui/buttons/upload-image.mjs +1 -1
  211. package/dist/ui/calendar.d.cts +4 -4
  212. package/dist/ui/calendar.d.mts +4 -4
  213. package/dist/ui/calendar.mjs +1 -1
  214. package/dist/ui/card.d.cts +8 -8
  215. package/dist/ui/card.d.mts +8 -8
  216. package/dist/ui/card.mjs +1 -1
  217. package/dist/ui/carousel.d.cts +7 -7
  218. package/dist/ui/carousel.d.mts +7 -7
  219. package/dist/ui/carousel.mjs +1 -1
  220. package/dist/ui/checkbox.d.cts +2 -2
  221. package/dist/ui/checkbox.d.mts +2 -2
  222. package/dist/ui/checkbox.mjs +1 -1
  223. package/dist/ui/collapsible.d.cts +4 -4
  224. package/dist/ui/collapsible.d.mts +4 -4
  225. package/dist/ui/command.d.cts +11 -11
  226. package/dist/ui/command.d.mts +11 -11
  227. package/dist/ui/command.mjs +1 -1
  228. package/dist/ui/context-menu.d.cts +16 -16
  229. package/dist/ui/context-menu.d.mts +16 -16
  230. package/dist/ui/dialog.d.cts +1 -1
  231. package/dist/ui/dialog.d.mts +1 -1
  232. package/dist/ui/dialog.mjs +1 -1
  233. package/dist/ui/drawer.d.cts +11 -11
  234. package/dist/ui/drawer.d.mts +11 -11
  235. package/dist/ui/dropdown-menu.d.cts +16 -16
  236. package/dist/ui/dropdown-menu.d.mts +16 -16
  237. package/dist/ui/dropdown-menu.mjs +1 -1
  238. package/dist/ui/empty.d.cts +9 -9
  239. package/dist/ui/empty.d.mts +7 -7
  240. package/dist/ui/field.d.cts +24 -24
  241. package/dist/ui/field.d.mts +13 -13
  242. package/dist/ui/field.mjs +1 -1
  243. package/dist/ui/file-uploader.d.cts +2 -2
  244. package/dist/ui/file-uploader.d.mts +2 -2
  245. package/dist/ui/file-uploader.mjs +1 -1
  246. package/dist/ui/form.d.cts +11 -11
  247. package/dist/ui/form.d.mts +11 -11
  248. package/dist/ui/form.mjs +1 -1
  249. package/dist/ui/hover-card.d.cts +4 -4
  250. package/dist/ui/hover-card.d.mts +4 -4
  251. package/dist/ui/image.mjs +1 -1
  252. package/dist/ui/input-otp.d.cts +5 -5
  253. package/dist/ui/input-otp.d.mts +5 -5
  254. package/dist/ui/input.d.cts +1 -1
  255. package/dist/ui/input.d.mts +1 -1
  256. package/dist/ui/input.mjs +1 -1
  257. package/dist/ui/inputs/search-input.d.cts +3 -3
  258. package/dist/ui/inputs/search-input.d.mts +3 -3
  259. package/dist/ui/inputs/search-input.mjs +1 -1
  260. package/dist/ui/item.d.cts +14 -14
  261. package/dist/ui/item.d.mts +11 -11
  262. package/dist/ui/item.mjs +1 -1
  263. package/dist/ui/label.d.cts +2 -2
  264. package/dist/ui/label.d.mts +2 -2
  265. package/dist/ui/label.mjs +1 -1
  266. package/dist/ui/menubar.d.cts +17 -17
  267. package/dist/ui/menubar.d.mts +17 -17
  268. package/dist/ui/multi-select.d.cts +2 -2
  269. package/dist/ui/multi-select.d.mts +3 -3
  270. package/dist/ui/multi-select.mjs +1 -1
  271. package/dist/ui/navigation-menu.d.cts +11 -11
  272. package/dist/ui/navigation-menu.d.mts +9 -9
  273. package/dist/ui/pagination.d.cts +9 -9
  274. package/dist/ui/pagination.d.mts +9 -9
  275. package/dist/ui/pagination.mjs +1 -1
  276. package/dist/ui/popover.d.cts +6 -6
  277. package/dist/ui/popover.d.mts +6 -6
  278. package/dist/ui/popover.mjs +1 -1
  279. package/dist/ui/progress.d.cts +2 -2
  280. package/dist/ui/progress.d.mts +2 -2
  281. package/dist/ui/progress.mjs +1 -1
  282. package/dist/ui/radio-group.d.cts +3 -3
  283. package/dist/ui/radio-group.d.mts +3 -3
  284. package/dist/ui/radio-group.mjs +1 -1
  285. package/dist/ui/resizable.d.cts +9 -9
  286. package/dist/ui/resizable.d.mts +1 -1
  287. package/dist/ui/resizable.mjs +1 -1
  288. package/dist/ui/scroll-area.d.cts +3 -3
  289. package/dist/ui/scroll-area.d.mts +6 -6
  290. package/dist/ui/select.d.cts +9 -9
  291. package/dist/ui/select.d.mts +9 -9
  292. package/dist/ui/select.mjs +1 -1
  293. package/dist/ui/separator.d.cts +2 -2
  294. package/dist/ui/separator.d.mts +2 -2
  295. package/dist/ui/separator.mjs +1 -1
  296. package/dist/ui/sheet.d.cts +9 -9
  297. package/dist/ui/sheet.d.mts +9 -9
  298. package/dist/ui/sheet.mjs +1 -1
  299. package/dist/ui/sidebar.d.cts +28 -28
  300. package/dist/ui/sidebar.d.mts +28 -28
  301. package/dist/ui/sidebar.mjs +1 -1
  302. package/dist/ui/skeleton.d.cts +2 -2
  303. package/dist/ui/skeleton.d.mts +2 -2
  304. package/dist/ui/skeleton.mjs +1 -1
  305. package/dist/ui/slider.d.cts +2 -2
  306. package/dist/ui/slider.d.mts +2 -2
  307. package/dist/ui/sonner.d.cts +2 -2
  308. package/dist/ui/sonner.d.mts +2 -2
  309. package/dist/ui/spinner.d.cts +2 -2
  310. package/dist/ui/spinner.d.mts +2 -2
  311. package/dist/ui/spinner.mjs +1 -1
  312. package/dist/ui/switch.d.cts +2 -2
  313. package/dist/ui/switch.d.mts +2 -2
  314. package/dist/ui/table.d.cts +18 -18
  315. package/dist/ui/table.d.mts +18 -18
  316. package/dist/ui/tabs.d.cts +5 -5
  317. package/dist/ui/tabs.d.mts +5 -5
  318. package/dist/ui/textarea.d.cts +2 -2
  319. package/dist/ui/textarea.d.mts +2 -2
  320. package/dist/ui/textarea.mjs +1 -1
  321. package/dist/ui/toggle-group.d.cts +3 -3
  322. package/dist/ui/toggle-group.d.mts +3 -3
  323. package/dist/ui/toggle.d.cts +4 -4
  324. package/dist/ui/toggle.d.mts +4 -4
  325. package/dist/ui/tooltip.d.cts +5 -5
  326. package/dist/ui/tooltip.d.mts +5 -5
  327. package/dist/ui/tooltip.mjs +1 -1
  328. package/dist/{user-DIEH54XW.mjs → user-DxSilm4V.mjs} +2 -2
  329. package/dist/{user-DIEH54XW.mjs.map → user-DxSilm4V.mjs.map} +1 -1
  330. package/package.json +13 -1
  331. package/dist/payment-layout-BKJ5xJra.mjs +0 -2
  332. package/dist/payment-layout-BKJ5xJra.mjs.map +0 -1
  333. package/dist/payment-layout-CcMvKPaX.cjs +0 -2
  334. package/dist/payment-layout-CcMvKPaX.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime23 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime24 from "react/jsx-runtime";
2
2
  import * as class_variance_authority_types1 from "class-variance-authority/types";
3
3
  import * as react0 from "react";
4
4
  import { VariantProps } from "class-variance-authority";
@@ -112,7 +112,7 @@ declare const Flex: react0.MemoExoticComponent<({
112
112
  align,
113
113
  className,
114
114
  children
115
- }: React.PropsWithChildren<Props>) => react_jsx_runtime23.JSX.Element>;
115
+ }: React.PropsWithChildren<Props>) => react_jsx_runtime24.JSX.Element>;
116
116
  //#endregion
117
117
  export { Flex };
118
118
  //# sourceMappingURL=flex.d.cts.map
@@ -1,7 +1,7 @@
1
1
  import * as react0 from "react";
2
- import * as react_jsx_runtime27 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime28 from "react/jsx-runtime";
3
3
  import { VariantProps } from "class-variance-authority";
4
- import * as class_variance_authority_types2 from "class-variance-authority/types";
4
+ import * as class_variance_authority_types1 from "class-variance-authority/types";
5
5
 
6
6
  //#region packages/components/layouts/flex.d.ts
7
7
  declare const flexVariants: (props?: ({
@@ -13,7 +13,7 @@ declare const flexVariants: (props?: ({
13
13
  gap?: "xs" | "sm" | "md" | "lg" | "xl" | "none" | null | undefined;
14
14
  justify?: "start" | "center" | "end" | "between" | "around" | "evenly" | "stretch" | null | undefined;
15
15
  align?: "start" | "center" | "end" | "stretch" | "baseline" | null | undefined;
16
- } & class_variance_authority_types2.ClassProp) | undefined) => string;
16
+ } & class_variance_authority_types1.ClassProp) | undefined) => string;
17
17
  type Props = {
18
18
  /** Additional Tailwind classes merged on top of the variant-generated classes. */
19
19
  className?: string;
@@ -112,7 +112,7 @@ declare const Flex: react0.MemoExoticComponent<({
112
112
  align,
113
113
  className,
114
114
  children
115
- }: React.PropsWithChildren<Props>) => react_jsx_runtime27.JSX.Element>;
115
+ }: React.PropsWithChildren<Props>) => react_jsx_runtime28.JSX.Element>;
116
116
  //#endregion
117
117
  export { Flex };
118
118
  //# sourceMappingURL=flex.d.mts.map
@@ -1 +1 @@
1
- "use client";import{t as e}from"../flex-zl_w1yeZ.mjs";export{e as Flex};
1
+ "use client";import{t as e}from"../flex-Br7F9Fln.mjs";export{e as Flex};
@@ -1 +1 @@
1
- require(`../../button.variants-tnhb123u.cjs`),require(`../../button-CwDT3m4m.cjs`),require(`../../skeleton-BfMCjXYM.cjs`),require(`../../tooltip-itUmYz9k.cjs`),require(`../../separator-BwZb12bh.cjs`),require(`../../sheet-CaDXTx7n.cjs`),require(`../../input-BMOYFJYM.cjs`);const e=require(`../../payment-layout-CcMvKPaX.cjs`);exports.PaymentLayout=e.t;
1
+ require(`../../button.variants-tnhb123u.cjs`),require(`../../button-CwDT3m4m.cjs`),require(`../../skeleton-BfMCjXYM.cjs`),require(`../../tooltip-itUmYz9k.cjs`),require(`../../avatar-CTS9-raY.cjs`),require(`../../separator-BwZb12bh.cjs`),require(`../../sheet-CaDXTx7n.cjs`),require(`../../dropdown-menu-Ct9BLGfa.cjs`),require(`../../input-BMOYFJYM.cjs`);const e=require(`../../payment-layout-0mqqno1V.cjs`);exports.PaymentLayout=e.t;
@@ -1,4 +1,12 @@
1
1
  //#region packages/components/layouts/payment-layout/index.d.ts
2
+ type PaymentLayoutUser = {
3
+ /** Display name shown in the header and dropdown. */
4
+ fullname: string;
5
+ /** Email address shown in the user dropdown. */
6
+ email: string;
7
+ /** Optional avatar image URL; falls back to initials when omitted. */
8
+ avatar?: string;
9
+ };
2
10
  /**
3
11
  * Full-page payment application shell with a collapsible inset sidebar and a fixed header.
4
12
  *
@@ -20,6 +28,9 @@
20
28
  * },
21
29
  * ],
22
30
  * }}
31
+ * user={{ fullname: 'Nguyen Van A', email: 'a@example.com' }}
32
+ * onLogin={() => setLoginOpen(true)}
33
+ * onLogout={() => authService.logout()}
23
34
  * >
24
35
  * <TransactionsPage />
25
36
  * </PaymentLayout>
@@ -47,9 +58,13 @@ declare const PaymentLayout: React.FC<React.PropsWithChildren<{
47
58
  }[];
48
59
  }[];
49
60
  };
50
- /** Reserved for a future logout action (currently unused in the rendered output). */
61
+ /** Authenticated user; when provided the header shows user info and a logout option, otherwise a login button. */
62
+ user?: PaymentLayoutUser | null;
63
+ /** Called when the login button in the header is clicked (only shown when `user` is absent). */
64
+ onLogin?: () => void;
65
+ /** Called when the logout item in the user dropdown is clicked. */
51
66
  onLogout?: () => void;
52
67
  }>>;
53
68
  //#endregion
54
- export { PaymentLayout };
69
+ export { PaymentLayout, PaymentLayoutUser };
55
70
  //# sourceMappingURL=index.d.cts.map
@@ -1,4 +1,12 @@
1
1
  //#region packages/components/layouts/payment-layout/index.d.ts
2
+ type PaymentLayoutUser = {
3
+ /** Display name shown in the header and dropdown. */
4
+ fullname: string;
5
+ /** Email address shown in the user dropdown. */
6
+ email: string;
7
+ /** Optional avatar image URL; falls back to initials when omitted. */
8
+ avatar?: string;
9
+ };
2
10
  /**
3
11
  * Full-page payment application shell with a collapsible inset sidebar and a fixed header.
4
12
  *
@@ -20,6 +28,9 @@
20
28
  * },
21
29
  * ],
22
30
  * }}
31
+ * user={{ fullname: 'Nguyen Van A', email: 'a@example.com' }}
32
+ * onLogin={() => setLoginOpen(true)}
33
+ * onLogout={() => authService.logout()}
23
34
  * >
24
35
  * <TransactionsPage />
25
36
  * </PaymentLayout>
@@ -47,9 +58,13 @@ declare const PaymentLayout: React.FC<React.PropsWithChildren<{
47
58
  }[];
48
59
  }[];
49
60
  };
50
- /** Reserved for a future logout action (currently unused in the rendered output). */
61
+ /** Authenticated user; when provided the header shows user info and a logout option, otherwise a login button. */
62
+ user?: PaymentLayoutUser | null;
63
+ /** Called when the login button in the header is clicked (only shown when `user` is absent). */
64
+ onLogin?: () => void;
65
+ /** Called when the logout item in the user dropdown is clicked. */
51
66
  onLogout?: () => void;
52
67
  }>>;
53
68
  //#endregion
54
- export { PaymentLayout };
69
+ export { PaymentLayout, PaymentLayoutUser };
55
70
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- import"../../button.variants-B8KCLWPT.mjs";import"../../button-DPABon17.mjs";import"../../skeleton-CZVkWN4p.mjs";import"../../tooltip-C7UhtrFf.mjs";import"../../separator-DVI2h_rd.mjs";import"../../sheet-BRXYSJDv.mjs";import"../../input-BTm2GrZP.mjs";import{t as e}from"../../payment-layout-BKJ5xJra.mjs";export{e as PaymentLayout};
1
+ import"../../button.variants-CwcJHcI5.mjs";import"../../button-Bc8L9sFb.mjs";import"../../skeleton-BLwzHejl.mjs";import"../../tooltip-Cy0HbyAx.mjs";import"../../avatar-SJmvlfqm.mjs";import"../../separator-DXnFHf3v.mjs";import"../../sheet-GUUifKAd.mjs";import"../../dropdown-menu-BlsIwe4B.mjs";import"../../input-DLRypEj3.mjs";import{t as e}from"../../payment-layout-ClqGIxV7.mjs";export{e as PaymentLayout};
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime286 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime28 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/FeatureDeveloping.d.ts
4
4
  interface FeatureDevelopingProps {
@@ -37,7 +37,7 @@ declare const FeatureDeveloping: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: FeatureDevelopingProps) => react_jsx_runtime286.JSX.Element;
40
+ }: FeatureDevelopingProps) => react_jsx_runtime28.JSX.Element;
41
41
  //#endregion
42
42
  export { FeatureDeveloping, FeatureDeveloping as default, FeatureDevelopingProps };
43
43
  //# sourceMappingURL=FeatureDeveloping.d.cts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime53 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime27 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/FeatureDeveloping.d.ts
4
4
  interface FeatureDevelopingProps {
@@ -37,7 +37,7 @@ declare const FeatureDeveloping: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: FeatureDevelopingProps) => react_jsx_runtime53.JSX.Element;
40
+ }: FeatureDevelopingProps) => react_jsx_runtime27.JSX.Element;
41
41
  //#endregion
42
42
  export { FeatureDeveloping, FeatureDeveloping as default, FeatureDevelopingProps };
43
43
  //# sourceMappingURL=FeatureDeveloping.d.mts.map
@@ -1,2 +1,2 @@
1
- import"../button.variants-B8KCLWPT.mjs";import{t as e}from"../button-DPABon17.mjs";import{Construction as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Tính năng đang phát triển`,subtitle:o=`Chúng tôi đang phát triển tính năng này. Vui lòng quay lại sau.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-yellow-500`,u)}),n(`div`,{className:`text-3xl sm:text-5xl font-bold text-yellow-500`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as FeatureDeveloping,o as default};
1
+ import"../button.variants-CwcJHcI5.mjs";import{t as e}from"../button-Bc8L9sFb.mjs";import{Construction as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Tính năng đang phát triển`,subtitle:o=`Chúng tôi đang phát triển tính năng này. Vui lòng quay lại sau.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-yellow-500`,u)}),n(`div`,{className:`text-3xl sm:text-5xl font-bold text-yellow-500`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as FeatureDeveloping,o as default};
2
2
  //# sourceMappingURL=FeatureDeveloping.mjs.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime24 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime25 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/FeatureFixing.d.ts
4
4
  interface FeatureFixingProps {
@@ -37,7 +37,7 @@ declare const FeatureFixing: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: FeatureFixingProps) => react_jsx_runtime24.JSX.Element;
40
+ }: FeatureFixingProps) => react_jsx_runtime25.JSX.Element;
41
41
  //#endregion
42
42
  export { FeatureFixing, FeatureFixing as default, FeatureFixingProps };
43
43
  //# sourceMappingURL=FeatureFixing.d.cts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime2 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime24 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/FeatureFixing.d.ts
4
4
  interface FeatureFixingProps {
@@ -37,7 +37,7 @@ declare const FeatureFixing: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: FeatureFixingProps) => react_jsx_runtime2.JSX.Element;
40
+ }: FeatureFixingProps) => react_jsx_runtime24.JSX.Element;
41
41
  //#endregion
42
42
  export { FeatureFixing, FeatureFixing as default, FeatureFixingProps };
43
43
  //# sourceMappingURL=FeatureFixing.d.mts.map
@@ -1,2 +1,2 @@
1
- import"../button.variants-B8KCLWPT.mjs";import{t as e}from"../button-DPABon17.mjs";import{Wrench as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Tính năng đang bảo trì`,subtitle:o=`Chúng tôi đang khắc phục vấn đề với tính năng này. Vui lòng quay lại sau.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-orange-500`,u)}),n(`div`,{className:`text-3xl sm:text-5xl font-bold text-orange-500`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as FeatureFixing,o as default};
1
+ import"../button.variants-CwcJHcI5.mjs";import{t as e}from"../button-Bc8L9sFb.mjs";import{Wrench as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Tính năng đang bảo trì`,subtitle:o=`Chúng tôi đang khắc phục vấn đề với tính năng này. Vui lòng quay lại sau.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-orange-500`,u)}),n(`div`,{className:`text-3xl sm:text-5xl font-bold text-orange-500`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as FeatureFixing,o as default};
2
2
  //# sourceMappingURL=FeatureFixing.mjs.map
@@ -0,0 +1,2 @@
1
+ "use client";const e=require(`../chunk-Bmb41Sf3.cjs`);require(`../button.variants-tnhb123u.cjs`);const t=require(`../button-CwDT3m4m.cjs`);require(`../heading-AKz5ewy-.cjs`),require(`../paragraph-DN85Huc4.cjs`),require(`../close-DXk_H3Gt.cjs`);const n=require(`../dialog-o_68LQXd.cjs`),r=require(`../input-BMOYFJYM.cjs`),i=require(`../label-DYsRdKMt.cjs`),a=require(`../alert-B7TDxb35.cjs`);let o=require(`lucide-react`),s=require(`react`),c=require(`react/jsx-runtime`),l=require(`zod`);const u=l.z.object({email:l.z.string().min(1,`Vui lòng nhập email`).email(`Email không hợp lệ`),password:l.z.string().min(1,`Vui lòng nhập mật khẩu`)}),d=({open:e,onOpenChange:l,onLogin:d,onForgotPassword:f,onRegister:p,isLoading:m=!1,errorMessage:h,title:g=`Đăng nhập`,subtitle:_=`Nhập thông tin để tiếp tục`})=>{let v=(0,s.useId)(),y=(0,s.useId)(),[b,x]=(0,s.useState)(``),[S,C]=(0,s.useState)(``),[w,T]=(0,s.useState)(!1),[E,D]=(0,s.useState)({});return(0,c.jsx)(n.t,{open:e,onOpenChange:l,children:(0,c.jsxs)(n.r,{className:`sm:max-w-sm`,children:[(0,c.jsxs)(n.o,{children:[(0,c.jsx)(n.l,{children:g}),(0,c.jsx)(n.i,{children:_})]}),(0,c.jsxs)(`form`,{onSubmit:async e=>{e.preventDefault();let t=u.safeParse({email:b,password:S});if(!t.success){let e=t.error.flatten().fieldErrors;D({email:e.email?.[0],password:e.password?.[0]});return}D({}),await d(b,S)},noValidate:!0,className:`flex flex-col gap-4`,children:[h&&(0,c.jsx)(a.t,{variant:`destructive`,children:(0,c.jsx)(a.n,{children:h})}),(0,c.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,c.jsx)(i.t,{htmlFor:v,children:`Email`}),(0,c.jsx)(r.t,{id:v,type:`email`,autoComplete:`email`,placeholder:`you@example.com`,value:b,onChange:e=>x(e.target.value),"aria-invalid":!!E.email,disabled:m}),E.email&&(0,c.jsx)(`p`,{className:`text-destructive text-xs`,children:E.email})]}),(0,c.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsx)(i.t,{htmlFor:y,children:`Mật khẩu`}),f&&(0,c.jsx)(t.t,{type:`button`,variant:`link`,size:`sm`,className:`h-auto p-0 text-xs`,onClick:f,children:`Quên mật khẩu?`})]}),(0,c.jsxs)(`div`,{className:`relative`,children:[(0,c.jsx)(r.t,{id:y,type:w?`text`:`password`,autoComplete:`current-password`,placeholder:`••••••••`,value:S,onChange:e=>C(e.target.value),"aria-invalid":!!E.password,disabled:m,className:`pr-10`}),(0,c.jsx)(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),T(e=>!e)},"aria-label":w?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:w?(0,c.jsx)(o.EyeOff,{size:16}):(0,c.jsx)(o.Eye,{size:16})})]}),E.password&&(0,c.jsx)(`p`,{className:`text-destructive text-xs`,children:E.password})]}),(0,c.jsx)(t.t,{type:`submit`,isLoading:m,className:`w-full`,children:`Đăng nhập`})]}),p&&(0,c.jsxs)(`div`,{className:`flex justify-center gap-1 text-muted-foreground text-sm`,children:[(0,c.jsx)(`span`,{children:`Chưa có tài khoản?`}),(0,c.jsx)(t.t,{variant:`link`,size:`sm`,className:`h-auto p-0`,onClick:p,children:`Đăng ký`})]})]})})};exports.LoginPage=d;
2
+ //# sourceMappingURL=LoginPage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginPage.cjs","names":["z","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Alert","AlertDescription","Label","Input","Button","EyeOff","Eye"],"sources":["../../packages/components/pages/LoginPage.tsx"],"sourcesContent":["'use client';\n\nimport { useId, useState } from 'react';\n\nimport { Eye, EyeOff } from 'lucide-react';\nimport { z } from 'zod';\n\nimport { Alert, AlertDescription } from '../ui/alert';\nimport { Button } from '../ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/dialog';\nimport { Input } from '../ui/input';\nimport { Label } from '../ui/label';\n\nexport interface LoginPageProps {\n /** Controls whether the dialog is open */\n open: boolean;\n /** Called when the dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** Called when the user submits login credentials */\n onLogin: (email: string, password: string) => Promise<void> | void;\n /** Called when the \"Quên mật khẩu?\" link is clicked */\n onForgotPassword?: () => void;\n /** Called when the \"Đăng ký\" link is clicked */\n onRegister?: () => void;\n /** Disables the form and shows a spinner on the submit button */\n isLoading?: boolean;\n /** Server-side error message rendered in a destructive Alert */\n errorMessage?: string;\n /** Dialog heading. Default: \"Đăng nhập\" */\n title?: string;\n /** Dialog subheading. Default: \"Nhập thông tin để tiếp tục\" */\n subtitle?: string;\n}\n\nconst loginSchema = z.object({\n email: z.string().min(1, 'Vui lòng nhập email').email('Email không hợp lệ'),\n password: z.string().min(1, 'Vui lòng nhập mật khẩu'),\n});\n\n/**\n * Modal login dialog for the client authentication flow.\n *\n * @example\n * ```tsx\n * import { LoginPage } from '@customafk/lunas-ui/pages/LoginPage';\n *\n * <LoginPage\n * open={open}\n * onOpenChange={setOpen}\n * onLogin={async (email, password) => {\n * await authService.login(email, password);\n * setOpen(false);\n * }}\n * onRegister={() => { setOpen(false); setRegisterOpen(true); }}\n * />\n * ```\n */\nexport const LoginPage = ({\n open,\n onOpenChange,\n onLogin,\n onForgotPassword,\n onRegister,\n isLoading = false,\n errorMessage,\n title = 'Đăng nhập',\n subtitle = 'Nhập thông tin để tiếp tục',\n}: LoginPageProps) => {\n const emailId = useId();\n const passwordId = useId();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [fieldErrors, setFieldErrors] = useState<{ email?: string; password?: string }>({});\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = loginSchema.safeParse({ email, password });\n if (!result.success) {\n const errors = result.error.flatten().fieldErrors;\n setFieldErrors({ email: errors.email?.[0], password: errors.password?.[0] });\n return;\n }\n setFieldErrors({});\n await onLogin(email, password);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{subtitle}</DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} noValidate className=\"flex flex-col gap-4\">\n {errorMessage && (\n <Alert variant=\"destructive\">\n <AlertDescription>{errorMessage}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={emailId}>Email</Label>\n <Input\n id={emailId}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n aria-invalid={!!fieldErrors.email}\n disabled={isLoading}\n />\n {fieldErrors.email && <p className=\"text-destructive text-xs\">{fieldErrors.email}</p>}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={passwordId}>Mật khẩu</Label>\n {onForgotPassword && (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto p-0 text-xs\" onClick={onForgotPassword}>\n Quên mật khẩu?\n </Button>\n )}\n </div>\n <div className=\"relative\">\n <Input\n id={passwordId}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n aria-invalid={!!fieldErrors.password}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowPassword(v => !v);\n }}\n aria-label={showPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.password && <p className=\"text-destructive text-xs\">{fieldErrors.password}</p>}\n </div>\n\n <Button type=\"submit\" isLoading={isLoading} className=\"w-full\">\n Đăng nhập\n </Button>\n </form>\n\n {onRegister && (\n <div className=\"flex justify-center gap-1 text-muted-foreground text-sm\">\n <span>Chưa có tài khoản?</span>\n <Button variant=\"link\" size=\"sm\" className=\"h-auto p-0\" onClick={onRegister}>\n Đăng ký\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import * as react_jsx_runtime29 from "react/jsx-runtime";
2
+
3
+ //#region packages/components/pages/LoginPage.d.ts
4
+ interface LoginPageProps {
5
+ /** Controls whether the dialog is open */
6
+ open: boolean;
7
+ /** Called when the dialog open state changes */
8
+ onOpenChange: (open: boolean) => void;
9
+ /** Called when the user submits login credentials */
10
+ onLogin: (email: string, password: string) => Promise<void> | void;
11
+ /** Called when the "Quên mật khẩu?" link is clicked */
12
+ onForgotPassword?: () => void;
13
+ /** Called when the "Đăng ký" link is clicked */
14
+ onRegister?: () => void;
15
+ /** Disables the form and shows a spinner on the submit button */
16
+ isLoading?: boolean;
17
+ /** Server-side error message rendered in a destructive Alert */
18
+ errorMessage?: string;
19
+ /** Dialog heading. Default: "Đăng nhập" */
20
+ title?: string;
21
+ /** Dialog subheading. Default: "Nhập thông tin để tiếp tục" */
22
+ subtitle?: string;
23
+ }
24
+ /**
25
+ * Modal login dialog for the client authentication flow.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * import { LoginPage } from '@customafk/lunas-ui/pages/LoginPage';
30
+ *
31
+ * <LoginPage
32
+ * open={open}
33
+ * onOpenChange={setOpen}
34
+ * onLogin={async (email, password) => {
35
+ * await authService.login(email, password);
36
+ * setOpen(false);
37
+ * }}
38
+ * onRegister={() => { setOpen(false); setRegisterOpen(true); }}
39
+ * />
40
+ * ```
41
+ */
42
+ declare const LoginPage: ({
43
+ open,
44
+ onOpenChange,
45
+ onLogin,
46
+ onForgotPassword,
47
+ onRegister,
48
+ isLoading,
49
+ errorMessage,
50
+ title,
51
+ subtitle
52
+ }: LoginPageProps) => react_jsx_runtime29.JSX.Element;
53
+ //#endregion
54
+ export { LoginPage, LoginPageProps };
55
+ //# sourceMappingURL=LoginPage.d.cts.map
@@ -0,0 +1,55 @@
1
+ import * as react_jsx_runtime25 from "react/jsx-runtime";
2
+
3
+ //#region packages/components/pages/LoginPage.d.ts
4
+ interface LoginPageProps {
5
+ /** Controls whether the dialog is open */
6
+ open: boolean;
7
+ /** Called when the dialog open state changes */
8
+ onOpenChange: (open: boolean) => void;
9
+ /** Called when the user submits login credentials */
10
+ onLogin: (email: string, password: string) => Promise<void> | void;
11
+ /** Called when the "Quên mật khẩu?" link is clicked */
12
+ onForgotPassword?: () => void;
13
+ /** Called when the "Đăng ký" link is clicked */
14
+ onRegister?: () => void;
15
+ /** Disables the form and shows a spinner on the submit button */
16
+ isLoading?: boolean;
17
+ /** Server-side error message rendered in a destructive Alert */
18
+ errorMessage?: string;
19
+ /** Dialog heading. Default: "Đăng nhập" */
20
+ title?: string;
21
+ /** Dialog subheading. Default: "Nhập thông tin để tiếp tục" */
22
+ subtitle?: string;
23
+ }
24
+ /**
25
+ * Modal login dialog for the client authentication flow.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * import { LoginPage } from '@customafk/lunas-ui/pages/LoginPage';
30
+ *
31
+ * <LoginPage
32
+ * open={open}
33
+ * onOpenChange={setOpen}
34
+ * onLogin={async (email, password) => {
35
+ * await authService.login(email, password);
36
+ * setOpen(false);
37
+ * }}
38
+ * onRegister={() => { setOpen(false); setRegisterOpen(true); }}
39
+ * />
40
+ * ```
41
+ */
42
+ declare const LoginPage: ({
43
+ open,
44
+ onOpenChange,
45
+ onLogin,
46
+ onForgotPassword,
47
+ onRegister,
48
+ isLoading,
49
+ errorMessage,
50
+ title,
51
+ subtitle
52
+ }: LoginPageProps) => react_jsx_runtime25.JSX.Element;
53
+ //#endregion
54
+ export { LoginPage, LoginPageProps };
55
+ //# sourceMappingURL=LoginPage.d.mts.map
@@ -0,0 +1,2 @@
1
+ "use client";import"../button.variants-CwcJHcI5.mjs";import{t as e}from"../button-Bc8L9sFb.mjs";import"../heading-BnaNuvDS.mjs";import"../paragraph-CnHNC0rS.mjs";import"../close-BS6EeCrQ.mjs";import{i as t,l as n,o as r,r as i,t as a}from"../dialog-DG4vMCr5.mjs";import{t as o}from"../input-DLRypEj3.mjs";import{t as s}from"../label-BukQnBn7.mjs";import{n as c,t as l}from"../alert-C-Y4ZWNd.mjs";import{Eye as u,EyeOff as d}from"lucide-react";import{useId as f,useState as p}from"react";import{jsx as m,jsxs as h}from"react/jsx-runtime";import{z as g}from"zod";const _=g.object({email:g.string().min(1,`Vui lòng nhập email`).email(`Email không hợp lệ`),password:g.string().min(1,`Vui lòng nhập mật khẩu`)}),v=({open:g,onOpenChange:v,onLogin:y,onForgotPassword:b,onRegister:x,isLoading:S=!1,errorMessage:C,title:w=`Đăng nhập`,subtitle:T=`Nhập thông tin để tiếp tục`})=>{let E=f(),D=f(),[O,k]=p(``),[A,j]=p(``),[M,N]=p(!1),[P,F]=p({});return m(a,{open:g,onOpenChange:v,children:h(i,{className:`sm:max-w-sm`,children:[h(r,{children:[m(n,{children:w}),m(t,{children:T})]}),h(`form`,{onSubmit:async e=>{e.preventDefault();let t=_.safeParse({email:O,password:A});if(!t.success){let e=t.error.flatten().fieldErrors;F({email:e.email?.[0],password:e.password?.[0]});return}F({}),await y(O,A)},noValidate:!0,className:`flex flex-col gap-4`,children:[C&&m(l,{variant:`destructive`,children:m(c,{children:C})}),h(`div`,{className:`flex flex-col gap-1.5`,children:[m(s,{htmlFor:E,children:`Email`}),m(o,{id:E,type:`email`,autoComplete:`email`,placeholder:`you@example.com`,value:O,onChange:e=>k(e.target.value),"aria-invalid":!!P.email,disabled:S}),P.email&&m(`p`,{className:`text-destructive text-xs`,children:P.email})]}),h(`div`,{className:`flex flex-col gap-1.5`,children:[h(`div`,{className:`flex items-center justify-between`,children:[m(s,{htmlFor:D,children:`Mật khẩu`}),b&&m(e,{type:`button`,variant:`link`,size:`sm`,className:`h-auto p-0 text-xs`,onClick:b,children:`Quên mật khẩu?`})]}),h(`div`,{className:`relative`,children:[m(o,{id:D,type:M?`text`:`password`,autoComplete:`current-password`,placeholder:`••••••••`,value:A,onChange:e=>j(e.target.value),"aria-invalid":!!P.password,disabled:S,className:`pr-10`}),m(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),N(e=>!e)},"aria-label":M?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:m(M?d:u,{size:16})})]}),P.password&&m(`p`,{className:`text-destructive text-xs`,children:P.password})]}),m(e,{type:`submit`,isLoading:S,className:`w-full`,children:`Đăng nhập`})]}),x&&h(`div`,{className:`flex justify-center gap-1 text-muted-foreground text-sm`,children:[m(`span`,{children:`Chưa có tài khoản?`}),m(e,{variant:`link`,size:`sm`,className:`h-auto p-0`,onClick:x,children:`Đăng ký`})]})]})})};export{v as LoginPage};
2
+ //# sourceMappingURL=LoginPage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginPage.mjs","names":[],"sources":["../../packages/components/pages/LoginPage.tsx"],"sourcesContent":["'use client';\n\nimport { useId, useState } from 'react';\n\nimport { Eye, EyeOff } from 'lucide-react';\nimport { z } from 'zod';\n\nimport { Alert, AlertDescription } from '../ui/alert';\nimport { Button } from '../ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/dialog';\nimport { Input } from '../ui/input';\nimport { Label } from '../ui/label';\n\nexport interface LoginPageProps {\n /** Controls whether the dialog is open */\n open: boolean;\n /** Called when the dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** Called when the user submits login credentials */\n onLogin: (email: string, password: string) => Promise<void> | void;\n /** Called when the \"Quên mật khẩu?\" link is clicked */\n onForgotPassword?: () => void;\n /** Called when the \"Đăng ký\" link is clicked */\n onRegister?: () => void;\n /** Disables the form and shows a spinner on the submit button */\n isLoading?: boolean;\n /** Server-side error message rendered in a destructive Alert */\n errorMessage?: string;\n /** Dialog heading. Default: \"Đăng nhập\" */\n title?: string;\n /** Dialog subheading. Default: \"Nhập thông tin để tiếp tục\" */\n subtitle?: string;\n}\n\nconst loginSchema = z.object({\n email: z.string().min(1, 'Vui lòng nhập email').email('Email không hợp lệ'),\n password: z.string().min(1, 'Vui lòng nhập mật khẩu'),\n});\n\n/**\n * Modal login dialog for the client authentication flow.\n *\n * @example\n * ```tsx\n * import { LoginPage } from '@customafk/lunas-ui/pages/LoginPage';\n *\n * <LoginPage\n * open={open}\n * onOpenChange={setOpen}\n * onLogin={async (email, password) => {\n * await authService.login(email, password);\n * setOpen(false);\n * }}\n * onRegister={() => { setOpen(false); setRegisterOpen(true); }}\n * />\n * ```\n */\nexport const LoginPage = ({\n open,\n onOpenChange,\n onLogin,\n onForgotPassword,\n onRegister,\n isLoading = false,\n errorMessage,\n title = 'Đăng nhập',\n subtitle = 'Nhập thông tin để tiếp tục',\n}: LoginPageProps) => {\n const emailId = useId();\n const passwordId = useId();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [fieldErrors, setFieldErrors] = useState<{ email?: string; password?: string }>({});\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = loginSchema.safeParse({ email, password });\n if (!result.success) {\n const errors = result.error.flatten().fieldErrors;\n setFieldErrors({ email: errors.email?.[0], password: errors.password?.[0] });\n return;\n }\n setFieldErrors({});\n await onLogin(email, password);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{subtitle}</DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} noValidate className=\"flex flex-col gap-4\">\n {errorMessage && (\n <Alert variant=\"destructive\">\n <AlertDescription>{errorMessage}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={emailId}>Email</Label>\n <Input\n id={emailId}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n aria-invalid={!!fieldErrors.email}\n disabled={isLoading}\n />\n {fieldErrors.email && <p className=\"text-destructive text-xs\">{fieldErrors.email}</p>}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={passwordId}>Mật khẩu</Label>\n {onForgotPassword && (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto p-0 text-xs\" onClick={onForgotPassword}>\n Quên mật khẩu?\n </Button>\n )}\n </div>\n <div className=\"relative\">\n <Input\n id={passwordId}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n aria-invalid={!!fieldErrors.password}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowPassword(v => !v);\n }}\n aria-label={showPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.password && <p className=\"text-destructive text-xs\">{fieldErrors.password}</p>}\n </div>\n\n <Button type=\"submit\" isLoading={isLoading} className=\"w-full\">\n Đăng nhập\n </Button>\n </form>\n\n {onRegister && (\n <div className=\"flex justify-center gap-1 text-muted-foreground text-sm\">\n <span>Chưa có tài khoản?</span>\n <Button variant=\"link\" size=\"sm\" className=\"h-auto p-0\" onClick={onRegister}>\n Đăng ký\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime26 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime30 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/NotAuthorized.d.ts
4
4
  interface NotAuthorizedProps {
@@ -37,7 +37,7 @@ declare const NotAuthorized: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: NotAuthorizedProps) => react_jsx_runtime26.JSX.Element;
40
+ }: NotAuthorizedProps) => react_jsx_runtime30.JSX.Element;
41
41
  //#endregion
42
42
  export { NotAuthorized, NotAuthorized as default, NotAuthorizedProps };
43
43
  //# sourceMappingURL=NotAuthorized.d.cts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime1 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime30 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/NotAuthorized.d.ts
4
4
  interface NotAuthorizedProps {
@@ -37,7 +37,7 @@ declare const NotAuthorized: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: NotAuthorizedProps) => react_jsx_runtime1.JSX.Element;
40
+ }: NotAuthorizedProps) => react_jsx_runtime30.JSX.Element;
41
41
  //#endregion
42
42
  export { NotAuthorized, NotAuthorized as default, NotAuthorizedProps };
43
43
  //# sourceMappingURL=NotAuthorized.d.mts.map
@@ -1,2 +1,2 @@
1
- import"../button.variants-B8KCLWPT.mjs";import{t as e}from"../button-DPABon17.mjs";import{ShieldAlert as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Quyền truy cập bị từ chối`,subtitle:o=`Xin lỗi, bạn không có quyền truy cập vào trang này.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-primary`,u)}),n(`div`,{className:`text-4xl sm:text-6xl font-bold text-primary`,children:`403`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as NotAuthorized,o as default};
1
+ import"../button.variants-CwcJHcI5.mjs";import{t as e}from"../button-Bc8L9sFb.mjs";import{ShieldAlert as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Quyền truy cập bị từ chối`,subtitle:o=`Xin lỗi, bạn không có quyền truy cập vào trang này.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-primary`,u)}),n(`div`,{className:`text-4xl sm:text-6xl font-bold text-primary`,children:`403`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as NotAuthorized,o as default};
2
2
  //# sourceMappingURL=NotAuthorized.mjs.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime28 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime26 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/NotFound.d.ts
4
4
  interface NotFoundProps {
@@ -37,7 +37,7 @@ declare const NotFound: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: NotFoundProps) => react_jsx_runtime28.JSX.Element;
40
+ }: NotFoundProps) => react_jsx_runtime26.JSX.Element;
41
41
  //#endregion
42
42
  export { NotFound, NotFound as default, NotFoundProps };
43
43
  //# sourceMappingURL=NotFound.d.cts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime34 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime29 from "react/jsx-runtime";
2
2
 
3
3
  //#region packages/components/pages/NotFound.d.ts
4
4
  interface NotFoundProps {
@@ -37,7 +37,7 @@ declare const NotFound: ({
37
37
  onButtonClick,
38
38
  className,
39
39
  iconClassName
40
- }: NotFoundProps) => react_jsx_runtime34.JSX.Element;
40
+ }: NotFoundProps) => react_jsx_runtime29.JSX.Element;
41
41
  //#endregion
42
42
  export { NotFound, NotFound as default, NotFoundProps };
43
43
  //# sourceMappingURL=NotFound.d.mts.map
@@ -1,2 +1,2 @@
1
- import"../button.variants-B8KCLWPT.mjs";import{t as e}from"../button-DPABon17.mjs";import{FileQuestion as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Không tìm thấy trang`,subtitle:o=`Xin lỗi, trang bạn đang tìm kiếm không tồn tại hoặc đã bị di chuyển.`,buttonText:s=`Trở về trang chủ`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-primary`,u)}),n(`div`,{className:`text-4xl sm:text-6xl font-bold text-primary`,children:`404`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as NotFound,o as default};
1
+ import"../button.variants-CwcJHcI5.mjs";import{t as e}from"../button-Bc8L9sFb.mjs";import{FileQuestion as t}from"lucide-react";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{cn as i}from"@customafk/react-toolkit/utils";const a=({title:a=`Không tìm thấy trang`,subtitle:o=`Xin lỗi, trang bạn đang tìm kiếm không tồn tại hoặc đã bị di chuyển.`,buttonText:s=`Trở về trang chủ`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>r(`div`,{className:i(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[r(`div`,{className:`flex flex-col items-center gap-2`,children:[n(t,{className:i(`size-16 sm:size-24 text-primary`,u)}),n(`div`,{className:`text-4xl sm:text-6xl font-bold text-primary`,children:`404`})]}),n(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),n(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),n(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as NotFound,o as default};
2
2
  //# sourceMappingURL=NotFound.mjs.map
@@ -0,0 +1,2 @@
1
+ "use client";const e=require(`../chunk-Bmb41Sf3.cjs`);require(`../button.variants-tnhb123u.cjs`);const t=require(`../button-CwDT3m4m.cjs`);require(`../heading-AKz5ewy-.cjs`),require(`../paragraph-DN85Huc4.cjs`),require(`../close-DXk_H3Gt.cjs`);const n=require(`../dialog-o_68LQXd.cjs`),r=require(`../input-BMOYFJYM.cjs`),i=require(`../label-DYsRdKMt.cjs`),a=require(`../alert-B7TDxb35.cjs`);let o=require(`lucide-react`),s=require(`react`),c=require(`react/jsx-runtime`),l=require(`zod`);const u=l.z.object({email:l.z.string().min(1,`Vui lòng nhập email`).email(`Email không hợp lệ`),password:l.z.string().min(8,`Mật khẩu phải có ít nhất 8 ký tự`).max(50,`Mật khẩu không được vượt quá 50 ký tự`).regex(/[A-Z]/,`Phải có ít nhất một chữ hoa`).regex(/[a-z]/,`Phải có ít nhất một chữ thường`).regex(/[0-9]/,`Phải có ít nhất một chữ số`).regex(/[^A-Za-z0-9]/,`Phải có ít nhất một ký tự đặc biệt`),confirmPassword:l.z.string().min(1,`Vui lòng xác nhận mật khẩu`)}).refine(e=>e.password===e.confirmPassword,{message:`Mật khẩu xác nhận không khớp`,path:[`confirmPassword`]}),d=({open:e,onOpenChange:l,onRegister:d,onLogin:f,isLoading:p=!1,errorMessage:m,title:h=`Đăng ký`,subtitle:g=`Tạo tài khoản mới để bắt đầu`})=>{let _=(0,s.useId)(),v=(0,s.useId)(),y=(0,s.useId)(),[b,x]=(0,s.useState)(``),[S,C]=(0,s.useState)(``),[w,T]=(0,s.useState)(``),[E,D]=(0,s.useState)(!1),[O,k]=(0,s.useState)(!1),[A,j]=(0,s.useState)({});return(0,c.jsx)(n.t,{open:e,onOpenChange:l,children:(0,c.jsxs)(n.r,{className:`sm:max-w-sm`,children:[(0,c.jsxs)(n.o,{children:[(0,c.jsx)(n.l,{children:h}),(0,c.jsx)(n.i,{children:g})]}),(0,c.jsxs)(`form`,{onSubmit:async e=>{e.preventDefault();let t=u.safeParse({email:b,password:S,confirmPassword:w});if(!t.success){let e=t.error.flatten().fieldErrors;j({email:e.email?.[0],password:e.password?.[0],confirmPassword:e.confirmPassword?.[0]});return}j({}),await d(b,S)},noValidate:!0,className:`flex flex-col gap-4`,children:[m&&(0,c.jsx)(a.t,{variant:`destructive`,children:(0,c.jsx)(a.n,{children:m})}),(0,c.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,c.jsx)(i.t,{htmlFor:_,children:`Email`}),(0,c.jsx)(r.t,{id:_,type:`email`,autoComplete:`email`,placeholder:`you@example.com`,value:b,onChange:e=>x(e.target.value),"aria-invalid":!!A.email,disabled:p}),A.email&&(0,c.jsx)(`p`,{className:`text-destructive text-xs`,children:A.email})]}),(0,c.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,c.jsx)(i.t,{htmlFor:v,children:`Mật khẩu`}),(0,c.jsxs)(`div`,{className:`relative`,children:[(0,c.jsx)(r.t,{id:v,type:E?`text`:`password`,autoComplete:`new-password`,placeholder:`••••••••`,value:S,onChange:e=>C(e.target.value),"aria-invalid":!!A.password,disabled:p,className:`pr-10`}),(0,c.jsx)(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),D(e=>!e)},"aria-label":E?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:E?(0,c.jsx)(o.EyeOff,{size:16}):(0,c.jsx)(o.Eye,{size:16})})]}),A.password?(0,c.jsx)(`p`,{className:`text-destructive text-xs`,children:A.password}):(0,c.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`Tối thiểu 8 ký tự, bao gồm chữ hoa, chữ thường, số và ký tự đặc biệt.`})]}),(0,c.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,c.jsx)(i.t,{htmlFor:y,children:`Xác nhận mật khẩu`}),(0,c.jsxs)(`div`,{className:`relative`,children:[(0,c.jsx)(r.t,{id:y,type:O?`text`:`password`,autoComplete:`new-password`,placeholder:`••••••••`,value:w,onChange:e=>T(e.target.value),"aria-invalid":!!A.confirmPassword,disabled:p,className:`pr-10`}),(0,c.jsx)(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),k(e=>!e)},"aria-label":O?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:O?(0,c.jsx)(o.EyeOff,{size:16}):(0,c.jsx)(o.Eye,{size:16})})]}),A.confirmPassword&&(0,c.jsx)(`p`,{className:`text-destructive text-xs`,children:A.confirmPassword})]}),(0,c.jsx)(t.t,{type:`submit`,isLoading:p,className:`w-full`,children:`Đăng ký`})]}),f&&(0,c.jsxs)(`div`,{className:`flex justify-center gap-1 text-muted-foreground text-sm`,children:[(0,c.jsx)(`span`,{children:`Đã có tài khoản?`}),(0,c.jsx)(t.t,{variant:`link`,size:`sm`,className:`h-auto p-0`,onClick:f,children:`Đăng nhập`})]})]})})};exports.RegisterPage=d;
2
+ //# sourceMappingURL=RegisterPage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegisterPage.cjs","names":["z","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Alert","AlertDescription","Label","Input","EyeOff","Eye","Button"],"sources":["../../packages/components/pages/RegisterPage.tsx"],"sourcesContent":["'use client';\n\nimport { useId, useState } from 'react';\n\nimport { Eye, EyeOff } from 'lucide-react';\nimport { z } from 'zod';\n\nimport { Alert, AlertDescription } from '../ui/alert';\nimport { Button } from '../ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/dialog';\nimport { Input } from '../ui/input';\nimport { Label } from '../ui/label';\n\nexport interface RegisterPageProps {\n /** Controls whether the dialog is open */\n open: boolean;\n /** Called when the dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** Called when the user submits registration credentials */\n onRegister: (email: string, password: string) => Promise<void> | void;\n /** Called when the \"Đăng nhập\" link is clicked */\n onLogin?: () => void;\n /** Disables the form and shows a spinner on the submit button */\n isLoading?: boolean;\n /** Server-side error message rendered in a destructive Alert */\n errorMessage?: string;\n /** Dialog heading. Default: \"Đăng ký\" */\n title?: string;\n /** Dialog subheading. Default: \"Tạo tài khoản mới để bắt đầu\" */\n subtitle?: string;\n}\n\nconst registerSchema = z\n .object({\n email: z.string().min(1, 'Vui lòng nhập email').email('Email không hợp lệ'),\n password: z\n .string()\n .min(8, 'Mật khẩu phải có ít nhất 8 ký tự')\n .max(50, 'Mật khẩu không được vượt quá 50 ký tự')\n .regex(/[A-Z]/, 'Phải có ít nhất một chữ hoa')\n .regex(/[a-z]/, 'Phải có ít nhất một chữ thường')\n .regex(/[0-9]/, 'Phải có ít nhất một chữ số')\n .regex(/[^A-Za-z0-9]/, 'Phải có ít nhất một ký tự đặc biệt'),\n confirmPassword: z.string().min(1, 'Vui lòng xác nhận mật khẩu'),\n })\n .refine(data => data.password === data.confirmPassword, {\n message: 'Mật khẩu xác nhận không khớp',\n path: ['confirmPassword'],\n });\n\n/**\n * Modal registration dialog for the client authentication flow.\n *\n * @example\n * ```tsx\n * import { RegisterPage } from '@customafk/lunas-ui/pages/RegisterPage';\n *\n * <RegisterPage\n * open={open}\n * onOpenChange={setOpen}\n * onRegister={async (email, password) => {\n * await authService.register(email, password);\n * setOpen(false);\n * }}\n * onLogin={() => { setOpen(false); setLoginOpen(true); }}\n * />\n * ```\n */\nexport const RegisterPage = ({\n open,\n onOpenChange,\n onRegister,\n onLogin,\n isLoading = false,\n errorMessage,\n title = 'Đăng ký',\n subtitle = 'Tạo tài khoản mới để bắt đầu',\n}: RegisterPageProps) => {\n const emailId = useId();\n const passwordId = useId();\n const confirmPasswordId = useId();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [fieldErrors, setFieldErrors] = useState<{\n email?: string;\n password?: string;\n confirmPassword?: string;\n }>({});\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = registerSchema.safeParse({ email, password, confirmPassword });\n if (!result.success) {\n const errors = result.error.flatten().fieldErrors;\n setFieldErrors({\n email: errors.email?.[0],\n password: errors.password?.[0],\n confirmPassword: errors.confirmPassword?.[0],\n });\n return;\n }\n setFieldErrors({});\n await onRegister(email, password);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{subtitle}</DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} noValidate className=\"flex flex-col gap-4\">\n {errorMessage && (\n <Alert variant=\"destructive\">\n <AlertDescription>{errorMessage}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={emailId}>Email</Label>\n <Input\n id={emailId}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n aria-invalid={!!fieldErrors.email}\n disabled={isLoading}\n />\n {fieldErrors.email && <p className=\"text-destructive text-xs\">{fieldErrors.email}</p>}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={passwordId}>Mật khẩu</Label>\n <div className=\"relative\">\n <Input\n id={passwordId}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n aria-invalid={!!fieldErrors.password}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowPassword(v => !v);\n }}\n aria-label={showPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.password ? (\n <p className=\"text-destructive text-xs\">{fieldErrors.password}</p>\n ) : (\n <p className=\"text-muted-foreground text-xs\">Tối thiểu 8 ký tự, bao gồm chữ hoa, chữ thường, số và ký tự đặc biệt.</p>\n )}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={confirmPasswordId}>Xác nhận mật khẩu</Label>\n <div className=\"relative\">\n <Input\n id={confirmPasswordId}\n type={showConfirmPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n placeholder=\"••••••••\"\n value={confirmPassword}\n onChange={e => setConfirmPassword(e.target.value)}\n aria-invalid={!!fieldErrors.confirmPassword}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowConfirmPassword(v => !v);\n }}\n aria-label={showConfirmPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showConfirmPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.confirmPassword && <p className=\"text-destructive text-xs\">{fieldErrors.confirmPassword}</p>}\n </div>\n\n <Button type=\"submit\" isLoading={isLoading} className=\"w-full\">\n Đăng ký\n </Button>\n </form>\n\n {onLogin && (\n <div className=\"flex justify-center gap-1 text-muted-foreground text-sm\">\n <span>Đã có tài khoản?</span>\n <Button variant=\"link\" size=\"sm\" className=\"h-auto p-0\" onClick={onLogin}>\n Đăng nhập\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import * as react_jsx_runtime40 from "react/jsx-runtime";
2
+
3
+ //#region packages/components/pages/RegisterPage.d.ts
4
+ interface RegisterPageProps {
5
+ /** Controls whether the dialog is open */
6
+ open: boolean;
7
+ /** Called when the dialog open state changes */
8
+ onOpenChange: (open: boolean) => void;
9
+ /** Called when the user submits registration credentials */
10
+ onRegister: (email: string, password: string) => Promise<void> | void;
11
+ /** Called when the "Đăng nhập" link is clicked */
12
+ onLogin?: () => void;
13
+ /** Disables the form and shows a spinner on the submit button */
14
+ isLoading?: boolean;
15
+ /** Server-side error message rendered in a destructive Alert */
16
+ errorMessage?: string;
17
+ /** Dialog heading. Default: "Đăng ký" */
18
+ title?: string;
19
+ /** Dialog subheading. Default: "Tạo tài khoản mới để bắt đầu" */
20
+ subtitle?: string;
21
+ }
22
+ /**
23
+ * Modal registration dialog for the client authentication flow.
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * import { RegisterPage } from '@customafk/lunas-ui/pages/RegisterPage';
28
+ *
29
+ * <RegisterPage
30
+ * open={open}
31
+ * onOpenChange={setOpen}
32
+ * onRegister={async (email, password) => {
33
+ * await authService.register(email, password);
34
+ * setOpen(false);
35
+ * }}
36
+ * onLogin={() => { setOpen(false); setLoginOpen(true); }}
37
+ * />
38
+ * ```
39
+ */
40
+ declare const RegisterPage: ({
41
+ open,
42
+ onOpenChange,
43
+ onRegister,
44
+ onLogin,
45
+ isLoading,
46
+ errorMessage,
47
+ title,
48
+ subtitle
49
+ }: RegisterPageProps) => react_jsx_runtime40.JSX.Element;
50
+ //#endregion
51
+ export { RegisterPage, RegisterPageProps };
52
+ //# sourceMappingURL=RegisterPage.d.cts.map