@customafk/lunas-ui 0.2.45 → 0.2.48

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 (614) hide show
  1. package/dist/{alert-BbvPwf2x.mjs → alert-BzBDfGk2.js} +1 -1
  2. package/dist/alert-BzBDfGk2.js.map +1 -0
  3. package/dist/{alert-C32Lwu87.d.cts → alert-CNFuxKp7.d.cts} +5 -5
  4. package/dist/{alert-Cx-dxCP5.d.mts → alert-EH6BsbAj.d.ts} +7 -7
  5. package/dist/{avatar-fltdRVsJ.mjs → avatar-Hpj8lmux.js} +1 -1
  6. package/dist/avatar-Hpj8lmux.js.map +1 -0
  7. package/dist/{badge-CDGBGq8X.mjs → badge-CRpRXSuO.js} +1 -1
  8. package/dist/badge-CRpRXSuO.js.map +1 -0
  9. package/dist/{badge-B6WaU_xD.d.mts → badge-Cca0AHjT.d.ts} +6 -6
  10. package/dist/{badge-C-IINKGX.d.cts → badge-D0JnPurs.d.cts} +6 -6
  11. package/dist/{button-BrRUQsVc.d.mts → button-Cr817M3U.d.cts} +5 -5
  12. package/dist/{button-9rG12f55.d.cts → button-DuZy_wDo.d.ts} +6 -6
  13. package/dist/button-LMMbL-uH.js +2 -0
  14. package/dist/button-LMMbL-uH.js.map +1 -0
  15. package/dist/{button.variants-DkMqWB8G.mjs → button.variants-CoSpd71B.js} +1 -1
  16. package/dist/button.variants-CoSpd71B.js.map +1 -0
  17. package/dist/calendar-DzPt7b6k.js +2 -0
  18. package/dist/calendar-DzPt7b6k.js.map +1 -0
  19. package/dist/cards/{grid-product-card.d.mts → grid-product-card.d.ts} +1 -1
  20. package/dist/cards/grid-product-card.js +2 -0
  21. package/dist/cards/grid-product-card.js.map +1 -0
  22. package/dist/cards/{product-card.d.mts → product-card.d.ts} +1 -1
  23. package/dist/cards/product-card.js +2 -0
  24. package/dist/cards/product-card.js.map +1 -0
  25. package/dist/cards/{simple-card.d.mts → simple-card.d.ts} +1 -1
  26. package/dist/cards/simple-card.js +2 -0
  27. package/dist/cards/simple-card.js.map +1 -0
  28. package/dist/{checkbox-Cat3i08X.mjs → checkbox-DLGDoU-1.js} +1 -1
  29. package/dist/checkbox-DLGDoU-1.js.map +1 -0
  30. package/dist/{close-_UHFeiLS.mjs → close-C0PdZGxr.js} +1 -1
  31. package/dist/close-C0PdZGxr.js.map +1 -0
  32. package/dist/cms-layout-tPwrgJZc.js +2 -0
  33. package/dist/cms-layout-tPwrgJZc.js.map +1 -0
  34. package/dist/command-2gUejA6g.js +2 -0
  35. package/dist/command-2gUejA6g.js.map +1 -0
  36. package/dist/data-display/{country.d.mts → country.d.ts} +2 -2
  37. package/dist/data-display/country.js +2 -0
  38. package/dist/data-display/country.js.map +1 -0
  39. package/dist/data-display/{data-list.d.mts → data-list.d.ts} +1 -1
  40. package/dist/data-display/{data-list.mjs → data-list.js} +1 -1
  41. package/dist/data-display/data-list.js.map +1 -0
  42. package/dist/data-display/{date-tooltip.d.mts → date-tooltip.d.ts} +1 -1
  43. package/dist/data-display/date-tooltip.js +2 -0
  44. package/dist/data-display/date-tooltip.js.map +1 -0
  45. package/dist/data-display/{date.d.mts → date.d.ts} +1 -1
  46. package/dist/data-display/date.js +1 -0
  47. package/dist/data-display/{empty.d.mts → empty.d.ts} +1 -1
  48. package/dist/data-display/{empty.mjs → empty.js} +1 -1
  49. package/dist/data-display/empty.js.map +1 -0
  50. package/dist/data-display/{name.d.mts → name.d.ts} +1 -1
  51. package/dist/data-display/name.js +2 -0
  52. package/dist/data-display/name.js.map +1 -0
  53. package/dist/data-display/{phone-number.d.mts → phone-number.d.ts} +1 -1
  54. package/dist/data-display/phone-number.js +2 -0
  55. package/dist/data-display/phone-number.js.map +1 -0
  56. package/dist/data-display/{role-badge.d.mts → role-badge.d.ts} +2 -2
  57. package/dist/data-display/role-badge.js +2 -0
  58. package/dist/data-display/role-badge.js.map +1 -0
  59. package/dist/data-display/statistic.d.cts +3 -3
  60. package/dist/data-display/{statistic.d.mts → statistic.d.ts} +1 -1
  61. package/dist/data-display/statistic.js +1 -0
  62. package/dist/data-display/{user.d.mts → user.d.ts} +1 -1
  63. package/dist/data-display/user.js +1 -0
  64. package/dist/{date-fY3sUcLp.mjs → date-BIqCFM1Z.js} +1 -1
  65. package/dist/date-BIqCFM1Z.js.map +1 -0
  66. package/dist/{dialog-CsltUGHB.d.mts → dialog-C48T3MZN.d.cts} +12 -12
  67. package/dist/{dialog-C44AIKLb.d.cts → dialog-CQygxUtj.d.ts} +12 -12
  68. package/dist/dialog-CmutQ3rp.js +2 -0
  69. package/dist/dialog-CmutQ3rp.js.map +1 -0
  70. package/dist/dialogs/{confirm-dialog.d.mts → confirm-dialog.d.ts} +1 -1
  71. package/dist/dialogs/confirm-dialog.js +2 -0
  72. package/dist/dialogs/confirm-dialog.js.map +1 -0
  73. package/dist/dialogs/detail-dialog/components/sidebar.d.cts +26 -26
  74. package/dist/dialogs/detail-dialog/components/{sidebar.d.mts → sidebar.d.ts} +29 -29
  75. package/dist/dialogs/detail-dialog/components/sidebar.js +1 -0
  76. package/dist/dialogs/detail-dialog/{index.d.mts → index.d.ts} +1 -1
  77. package/dist/dialogs/detail-dialog/index.js +2 -0
  78. package/dist/dialogs/detail-dialog/index.js.map +1 -0
  79. package/dist/dialogs/{error-dialog.d.mts → error-dialog.d.ts} +1 -1
  80. package/dist/dialogs/error-dialog.js +2 -0
  81. package/dist/dialogs/error-dialog.js.map +1 -0
  82. package/dist/dialogs/{loading-dialog.d.mts → loading-dialog.d.ts} +1 -1
  83. package/dist/dialogs/loading-dialog.js +2 -0
  84. package/dist/dialogs/loading-dialog.js.map +1 -0
  85. package/dist/{dist-DVrfqn8H.mjs → dist-EPxjIRJp.js} +1 -1
  86. package/dist/dist-EPxjIRJp.js.map +1 -0
  87. package/dist/{drawer-CMD7JWH8.mjs → drawer-B3qXaN5p.js} +1 -1
  88. package/dist/drawer-B3qXaN5p.js.map +1 -0
  89. package/dist/{dropdown-menu-BWhiVsEf.mjs → dropdown-menu-DeHCVyby.js} +1 -1
  90. package/dist/dropdown-menu-DeHCVyby.js.map +1 -0
  91. package/dist/features/descriptions/index.d.cts +6 -6
  92. package/dist/features/descriptions/{index.d.mts → index.d.ts} +7 -7
  93. package/dist/features/descriptions/index.js +2 -0
  94. package/dist/features/descriptions/index.js.map +1 -0
  95. package/dist/features/search-modal/index.d.cts +2 -2
  96. package/dist/features/search-modal/{index.d.mts → index.d.ts} +3 -3
  97. package/dist/features/search-modal/index.js +1 -0
  98. package/dist/features/tables/index.d.cts +1 -1
  99. package/dist/features/tables/{index.d.mts → index.d.ts} +2 -2
  100. package/dist/features/tables/index.js +1 -0
  101. package/dist/features/tanstack-form/index.d.cts +1 -1
  102. package/dist/features/tanstack-form/{index.d.mts → index.d.ts} +1 -1
  103. package/dist/features/tanstack-form/index.js +1 -0
  104. package/dist/features/text-editor/index.d.cts +1 -1
  105. package/dist/features/text-editor/{index.d.mts → index.d.ts} +1 -1
  106. package/dist/features/text-editor/index.js +1 -0
  107. package/dist/field-DpoKF1nY.js +2 -0
  108. package/dist/field-DpoKF1nY.js.map +1 -0
  109. package/dist/{flex-B6YSJzGe.mjs → flex-CinRrgEy.js} +1 -1
  110. package/dist/flex-CinRrgEy.js.map +1 -0
  111. package/dist/{heading-De4Pn3mZ.mjs → heading-Bz-hSatD.js} +1 -1
  112. package/dist/heading-Bz-hSatD.js.map +1 -0
  113. package/dist/image-BpTuF_1w.js +2 -0
  114. package/dist/image-BpTuF_1w.js.map +1 -0
  115. package/dist/{index-DrmdHOJL.d.mts → index-Bc9X8pLk.d.cts} +6 -6
  116. package/dist/{index-Cm62M0Ft.d.mts → index-BlQGXGqt.d.ts} +1 -1
  117. package/dist/{index-Bpsn3Z_G.d.cts → index-C1O2C-cg.d.ts} +6 -6
  118. package/dist/{index-Cuhf_ZXn.d.cts → index-CgH0tiiC.d.cts} +30 -30
  119. package/dist/{index-ks5jfaQb.d.mts → index-D5u9CKyd.d.cts} +305 -305
  120. package/dist/{index-DgHXQffp.d.mts → index-DFUF27Yy.d.ts} +31 -31
  121. package/dist/{index-D8d60P7q.d.cts → index-Ilj04YNO.d.ts} +305 -305
  122. package/dist/index.d.cts +8 -8
  123. package/dist/{index.d.mts → index.d.ts} +92 -92
  124. package/dist/index.js +1 -0
  125. package/dist/{input-hFHi7RiN.d.mts → input-B_gst0eJ.d.cts} +6 -6
  126. package/dist/{input-ff6sQNN4.d.cts → input-BkHdaXGY.d.ts} +6 -6
  127. package/dist/{input-NJP2wQOm.mjs → input-DAfP6LZ7.js} +1 -1
  128. package/dist/input-DAfP6LZ7.js.map +1 -0
  129. package/dist/{label-CUCpwS5D.mjs → label-B8cAG2kc.js} +1 -1
  130. package/dist/label-B8cAG2kc.js.map +1 -0
  131. package/dist/layouts/cms-layout/index.d.ts +2 -0
  132. package/dist/layouts/cms-layout/index.js +1 -0
  133. package/dist/layouts/flex.d.cts +3 -3
  134. package/dist/layouts/{flex.d.mts → flex.d.ts} +6 -6
  135. package/dist/layouts/flex.js +1 -0
  136. package/dist/layouts/{grid.d.mts → grid.d.ts} +1 -1
  137. package/dist/layouts/{grid.mjs → grid.js} +1 -1
  138. package/dist/layouts/grid.js.map +1 -0
  139. package/dist/layouts/payment-layout/{index.d.mts → index.d.ts} +1 -1
  140. package/dist/layouts/payment-layout/index.js +1 -0
  141. package/dist/pages/FeatureDeveloping.d.cts +2 -2
  142. package/dist/pages/{FeatureDeveloping.d.mts → FeatureDeveloping.d.ts} +3 -3
  143. package/dist/pages/FeatureDeveloping.js +2 -0
  144. package/dist/pages/FeatureDeveloping.js.map +1 -0
  145. package/dist/pages/FeatureFixing.d.cts +2 -2
  146. package/dist/pages/{FeatureFixing.d.mts → FeatureFixing.d.ts} +3 -3
  147. package/dist/pages/FeatureFixing.js +2 -0
  148. package/dist/pages/FeatureFixing.js.map +1 -0
  149. package/dist/pages/LoginPage.d.cts +2 -2
  150. package/dist/pages/{LoginPage.d.mts → LoginPage.d.ts} +3 -3
  151. package/dist/pages/LoginPage.js +2 -0
  152. package/dist/pages/LoginPage.js.map +1 -0
  153. package/dist/pages/NotAuthorized.d.cts +2 -2
  154. package/dist/pages/{NotAuthorized.d.mts → NotAuthorized.d.ts} +3 -3
  155. package/dist/pages/NotAuthorized.js +2 -0
  156. package/dist/pages/NotAuthorized.js.map +1 -0
  157. package/dist/pages/NotFound.d.cts +2 -2
  158. package/dist/pages/{NotFound.d.mts → NotFound.d.ts} +3 -3
  159. package/dist/pages/NotFound.js +2 -0
  160. package/dist/pages/NotFound.js.map +1 -0
  161. package/dist/pages/RegisterPage.d.cts +2 -2
  162. package/dist/pages/{RegisterPage.d.mts → RegisterPage.d.ts} +3 -3
  163. package/dist/pages/RegisterPage.js +2 -0
  164. package/dist/pages/RegisterPage.js.map +1 -0
  165. package/dist/pages/VerifyEmailPage.d.cts +2 -2
  166. package/dist/pages/{VerifyEmailPage.d.mts → VerifyEmailPage.d.ts} +3 -3
  167. package/dist/pages/VerifyEmailPage.js +2 -0
  168. package/dist/pages/VerifyEmailPage.js.map +1 -0
  169. package/dist/{paragraph-DYLaQtTV.mjs → paragraph-Cc13ZI4d.js} +1 -1
  170. package/dist/paragraph-Cc13ZI4d.js.map +1 -0
  171. package/dist/payment-layout-giaGvs8T.js +2 -0
  172. package/dist/payment-layout-giaGvs8T.js.map +1 -0
  173. package/dist/popover-6233wU1s.js +2 -0
  174. package/dist/popover-6233wU1s.js.map +1 -0
  175. package/dist/{progress-CLeM0e7Z.mjs → progress-AYknlEgK.js} +1 -1
  176. package/dist/progress-AYknlEgK.js.map +1 -0
  177. package/dist/{radio-group-Y9bhdr55.mjs → radio-group-ImoBjpqZ.js} +1 -1
  178. package/dist/radio-group-ImoBjpqZ.js.map +1 -0
  179. package/dist/{resizable-CpCaSCFB.mjs → resizable-C-M-mu6b.js} +1 -1
  180. package/dist/resizable-C-M-mu6b.js.map +1 -0
  181. package/dist/search-modal-b2AE5WEW.js +2 -0
  182. package/dist/search-modal-b2AE5WEW.js.map +1 -0
  183. package/dist/{select-LlPCZFSF.mjs → select-CryLzZA0.js} +1 -1
  184. package/dist/select-CryLzZA0.js.map +1 -0
  185. package/dist/{separator-D3Gmkxzq.mjs → separator-BM8hA4DP.js} +1 -1
  186. package/dist/separator-BM8hA4DP.js.map +1 -0
  187. package/dist/{sheet-BFlIfNaA.mjs → sheet-DGXXYgWB.js} +1 -1
  188. package/dist/sheet-DGXXYgWB.js.map +1 -0
  189. package/dist/sidebar-BDrsbzo5.js +2 -0
  190. package/dist/sidebar-BDrsbzo5.js.map +1 -0
  191. package/dist/{skeleton-C51IdOfK.mjs → skeleton-DlRDNM97.js} +1 -1
  192. package/dist/skeleton-DlRDNM97.js.map +1 -0
  193. package/dist/{spinner-eClTgHjk.mjs → spinner-C1eamx3w.js} +1 -1
  194. package/dist/spinner-C1eamx3w.js.map +1 -0
  195. package/dist/{statistic-cwLwcukn.mjs → statistic-CYMqAYNc.js} +1 -1
  196. package/dist/statistic-CYMqAYNc.js.map +1 -0
  197. package/dist/{switch-BP7EPatj.mjs → switch-BLHmdRq2.js} +1 -1
  198. package/dist/switch-BLHmdRq2.js.map +1 -0
  199. package/dist/systems/{google.d.mts → google.d.ts} +1 -1
  200. package/dist/systems/{google.mjs → google.js} +1 -1
  201. package/dist/systems/google.js.map +1 -0
  202. package/dist/tables-DWQytYNm.js +4 -0
  203. package/dist/tables-DWQytYNm.js.map +1 -0
  204. package/dist/tanstack-form-CCDV-3Ml.js +12 -0
  205. package/dist/tanstack-form-CCDV-3Ml.js.map +1 -0
  206. package/dist/text-editor-WbS7pJJs.js +2 -0
  207. package/dist/text-editor-WbS7pJJs.js.map +1 -0
  208. package/dist/{textarea-7HDXcaK9.mjs → textarea-Bp6VvhiA.js} +1 -1
  209. package/dist/textarea-Bp6VvhiA.js.map +1 -0
  210. package/dist/{tooltip-Dxl5Wa8i.mjs → tooltip-CVIl6Hln.js} +1 -1
  211. package/dist/tooltip-CVIl6Hln.js.map +1 -0
  212. package/dist/{types-YLu40dXY.d.mts → types-BVSfF-1o.d.ts} +1 -1
  213. package/dist/{types-B5nyTWtO.mjs → types-BZqffRVJ.js} +1 -1
  214. package/dist/types-BZqffRVJ.js.map +1 -0
  215. package/dist/typography/paragraph.d.cts +5 -5
  216. package/dist/typography/{paragraph.d.mts → paragraph.d.ts} +6 -6
  217. package/dist/typography/paragraph.js +1 -0
  218. package/dist/typography/{title.d.mts → title.d.ts} +1 -1
  219. package/dist/typography/{title.mjs → title.js} +1 -1
  220. package/dist/typography/title.js.map +1 -0
  221. package/dist/ui/alert-dialog.d.cts +12 -12
  222. package/dist/ui/{alert-dialog.d.mts → alert-dialog.d.ts} +13 -13
  223. package/dist/ui/alert-dialog.js +2 -0
  224. package/dist/ui/alert-dialog.js.map +1 -0
  225. package/dist/ui/alert.d.cts +1 -1
  226. package/dist/ui/{alert.d.mts → alert.d.ts} +1 -1
  227. package/dist/ui/alert.js +1 -0
  228. package/dist/ui/aspect-ratio.d.cts +2 -2
  229. package/dist/ui/{aspect-ratio.d.mts → aspect-ratio.d.ts} +3 -3
  230. package/dist/ui/{aspect-ratio.mjs → aspect-ratio.js} +1 -1
  231. package/dist/ui/aspect-ratio.js.map +1 -0
  232. package/dist/ui/avatar.d.cts +4 -4
  233. package/dist/ui/{avatar.d.mts → avatar.d.ts} +5 -5
  234. package/dist/ui/avatar.js +1 -0
  235. package/dist/ui/badge.d.cts +1 -1
  236. package/dist/ui/badge.d.ts +2 -0
  237. package/dist/ui/badge.js +1 -0
  238. package/dist/ui/breadcrumb.d.cts +8 -8
  239. package/dist/ui/{breadcrumb.d.mts → breadcrumb.d.ts} +9 -9
  240. package/dist/ui/breadcrumb.js +2 -0
  241. package/dist/ui/breadcrumb.js.map +1 -0
  242. package/dist/ui/button-group.d.cts +6 -6
  243. package/dist/ui/{button-group.d.mts → button-group.d.ts} +6 -6
  244. package/dist/ui/button-group.js +2 -0
  245. package/dist/ui/button-group.js.map +1 -0
  246. package/dist/ui/button.d.cts +1 -1
  247. package/dist/ui/button.d.ts +2 -0
  248. package/dist/ui/button.js +1 -0
  249. package/dist/ui/buttons/{add-new.d.mts → add-new.d.ts} +1 -1
  250. package/dist/ui/buttons/add-new.js +2 -0
  251. package/dist/ui/buttons/add-new.js.map +1 -0
  252. package/dist/ui/buttons/{edit.d.mts → edit.d.ts} +1 -1
  253. package/dist/ui/buttons/edit.js +2 -0
  254. package/dist/ui/buttons/edit.js.map +1 -0
  255. package/dist/ui/buttons/{refresh.d.mts → refresh.d.ts} +1 -1
  256. package/dist/ui/buttons/refresh.js +2 -0
  257. package/dist/ui/buttons/refresh.js.map +1 -0
  258. package/dist/ui/buttons/{trash.d.mts → trash.d.ts} +1 -1
  259. package/dist/ui/buttons/trash.js +2 -0
  260. package/dist/ui/buttons/trash.js.map +1 -0
  261. package/dist/ui/buttons/{upload-image.d.mts → upload-image.d.ts} +1 -1
  262. package/dist/ui/buttons/upload-image.js +2 -0
  263. package/dist/ui/buttons/upload-image.js.map +1 -0
  264. package/dist/ui/calendar.d.cts +4 -4
  265. package/dist/ui/{calendar.d.mts → calendar.d.ts} +5 -5
  266. package/dist/ui/calendar.js +1 -0
  267. package/dist/ui/card.d.cts +8 -8
  268. package/dist/ui/{card.d.mts → card.d.ts} +9 -9
  269. package/dist/ui/card.js +2 -0
  270. package/dist/ui/card.js.map +1 -0
  271. package/dist/ui/carousel.d.cts +7 -7
  272. package/dist/ui/{carousel.d.mts → carousel.d.ts} +8 -8
  273. package/dist/ui/carousel.js +2 -0
  274. package/dist/ui/carousel.js.map +1 -0
  275. package/dist/ui/checkbox.d.cts +2 -2
  276. package/dist/ui/{checkbox.d.mts → checkbox.d.ts} +3 -3
  277. package/dist/ui/checkbox.js +1 -0
  278. package/dist/ui/collapsible.d.cts +4 -4
  279. package/dist/ui/{collapsible.d.mts → collapsible.d.ts} +5 -5
  280. package/dist/ui/{collapsible.mjs → collapsible.js} +1 -1
  281. package/dist/ui/collapsible.js.map +1 -0
  282. package/dist/ui/command.d.cts +11 -11
  283. package/dist/ui/{command.d.mts → command.d.ts} +12 -12
  284. package/dist/ui/command.js +1 -0
  285. package/dist/ui/context-menu.d.cts +16 -16
  286. package/dist/ui/{context-menu.d.mts → context-menu.d.ts} +17 -17
  287. package/dist/ui/{context-menu.mjs → context-menu.js} +1 -1
  288. package/dist/ui/context-menu.js.map +1 -0
  289. package/dist/ui/dialog.d.cts +1 -1
  290. package/dist/ui/{dialog.d.mts → dialog.d.ts} +1 -1
  291. package/dist/ui/dialog.js +1 -0
  292. package/dist/ui/drawer.d.cts +11 -11
  293. package/dist/ui/{drawer.d.mts → drawer.d.ts} +12 -12
  294. package/dist/ui/drawer.js +1 -0
  295. package/dist/ui/dropdown-menu.d.cts +16 -16
  296. package/dist/ui/{dropdown-menu.d.mts → dropdown-menu.d.ts} +17 -17
  297. package/dist/ui/dropdown-menu.js +1 -0
  298. package/dist/ui/empty.d.cts +9 -9
  299. package/dist/ui/{empty.d.mts → empty.d.ts} +10 -10
  300. package/dist/ui/{empty.mjs → empty.js} +1 -1
  301. package/dist/ui/empty.js.map +1 -0
  302. package/dist/ui/field.d.cts +23 -23
  303. package/dist/ui/field.d.ts +65 -0
  304. package/dist/ui/field.js +1 -0
  305. package/dist/ui/file-uploader.d.cts +2 -2
  306. package/dist/ui/{file-uploader.d.mts → file-uploader.d.ts} +3 -3
  307. package/dist/ui/file-uploader.js +3 -0
  308. package/dist/ui/file-uploader.js.map +1 -0
  309. package/dist/ui/form.d.cts +10 -10
  310. package/dist/ui/{form.d.mts → form.d.ts} +11 -11
  311. package/dist/ui/form.js +2 -0
  312. package/dist/ui/form.js.map +1 -0
  313. package/dist/ui/hover-card.d.cts +4 -4
  314. package/dist/ui/{hover-card.d.mts → hover-card.d.ts} +5 -5
  315. package/dist/ui/{hover-card.mjs → hover-card.js} +1 -1
  316. package/dist/ui/hover-card.js.map +1 -0
  317. package/dist/ui/{image.d.mts → image.d.ts} +1 -1
  318. package/dist/ui/image.js +1 -0
  319. package/dist/ui/input-otp.d.cts +5 -5
  320. package/dist/ui/{input-otp.d.mts → input-otp.d.ts} +6 -6
  321. package/dist/ui/{input-otp.mjs → input-otp.js} +1 -1
  322. package/dist/ui/input-otp.js.map +1 -0
  323. package/dist/ui/input.d.cts +1 -1
  324. package/dist/ui/input.d.ts +2 -0
  325. package/dist/ui/input.js +1 -0
  326. package/dist/ui/inputs/search-input.d.cts +3 -3
  327. package/dist/ui/inputs/{search-input.d.mts → search-input.d.ts} +4 -4
  328. package/dist/ui/inputs/search-input.js +2 -0
  329. package/dist/ui/inputs/search-input.js.map +1 -0
  330. package/dist/ui/item.d.cts +14 -14
  331. package/dist/ui/{item.d.mts → item.d.ts} +13 -13
  332. package/dist/ui/item.js +2 -0
  333. package/dist/ui/item.js.map +1 -0
  334. package/dist/ui/label.d.cts +2 -2
  335. package/dist/ui/{label.d.mts → label.d.ts} +3 -3
  336. package/dist/ui/label.js +1 -0
  337. package/dist/ui/menubar.d.cts +17 -17
  338. package/dist/ui/{menubar.d.mts → menubar.d.ts} +18 -18
  339. package/dist/ui/{menubar.mjs → menubar.js} +1 -1
  340. package/dist/ui/menubar.js.map +1 -0
  341. package/dist/ui/multi-select.d.cts +2 -2
  342. package/dist/ui/{multi-select.d.mts → multi-select.d.ts} +5 -5
  343. package/dist/ui/multi-select.js +2 -0
  344. package/dist/ui/multi-select.js.map +1 -0
  345. package/dist/ui/navigation-menu.d.cts +9 -9
  346. package/dist/ui/{navigation-menu.d.mts → navigation-menu.d.ts} +12 -12
  347. package/dist/ui/{navigation-menu.mjs → navigation-menu.js} +1 -1
  348. package/dist/ui/navigation-menu.js.map +1 -0
  349. package/dist/ui/pagination.d.cts +9 -9
  350. package/dist/ui/{pagination.d.mts → pagination.d.ts} +10 -10
  351. package/dist/ui/pagination.js +2 -0
  352. package/dist/ui/pagination.js.map +1 -0
  353. package/dist/ui/popover.d.cts +6 -6
  354. package/dist/ui/{popover.d.mts → popover.d.ts} +7 -7
  355. package/dist/ui/popover.js +1 -0
  356. package/dist/ui/progress.d.cts +2 -2
  357. package/dist/ui/{progress.d.mts → progress.d.ts} +3 -3
  358. package/dist/ui/progress.js +1 -0
  359. package/dist/ui/radio-group.d.cts +3 -3
  360. package/dist/ui/{radio-group.d.mts → radio-group.d.ts} +4 -4
  361. package/dist/ui/radio-group.js +1 -0
  362. package/dist/ui/resizable.d.cts +9 -9
  363. package/dist/ui/{resizable.d.mts → resizable.d.ts} +10 -10
  364. package/dist/ui/resizable.js +1 -0
  365. package/dist/ui/scroll-area.d.cts +5 -5
  366. package/dist/ui/{scroll-area.d.mts → scroll-area.d.ts} +6 -6
  367. package/dist/ui/{scroll-area.mjs → scroll-area.js} +1 -1
  368. package/dist/ui/scroll-area.js.map +1 -0
  369. package/dist/ui/select.d.cts +9 -9
  370. package/dist/ui/{select.d.mts → select.d.ts} +10 -10
  371. package/dist/ui/select.js +1 -0
  372. package/dist/ui/separator.d.cts +2 -2
  373. package/dist/ui/{separator.d.mts → separator.d.ts} +3 -3
  374. package/dist/ui/separator.js +1 -0
  375. package/dist/ui/sheet.d.cts +9 -9
  376. package/dist/ui/{sheet.d.mts → sheet.d.ts} +10 -10
  377. package/dist/ui/sheet.js +1 -0
  378. package/dist/ui/skeleton.d.cts +2 -2
  379. package/dist/ui/{skeleton.d.mts → skeleton.d.ts} +3 -3
  380. package/dist/ui/skeleton.js +1 -0
  381. package/dist/ui/slider.d.cts +2 -2
  382. package/dist/ui/{slider.d.mts → slider.d.ts} +3 -3
  383. package/dist/ui/{slider.mjs → slider.js} +1 -1
  384. package/dist/ui/slider.js.map +1 -0
  385. package/dist/ui/sonner.d.cts +2 -2
  386. package/dist/ui/{sonner.d.mts → sonner.d.ts} +3 -3
  387. package/dist/ui/{sonner.mjs → sonner.js} +1 -1
  388. package/dist/ui/sonner.js.map +1 -0
  389. package/dist/ui/spinner.d.cts +2 -2
  390. package/dist/ui/{spinner.d.mts → spinner.d.ts} +3 -3
  391. package/dist/ui/spinner.js +1 -0
  392. package/dist/ui/switch.d.cts +2 -2
  393. package/dist/ui/{switch.d.mts → switch.d.ts} +3 -3
  394. package/dist/ui/switch.js +1 -0
  395. package/dist/ui/table.d.cts +17 -17
  396. package/dist/ui/{table.d.mts → table.d.ts} +18 -18
  397. package/dist/ui/{table.mjs → table.js} +1 -1
  398. package/dist/ui/table.js.map +1 -0
  399. package/dist/ui/tabs.d.cts +5 -5
  400. package/dist/ui/{tabs.d.mts → tabs.d.ts} +6 -6
  401. package/dist/ui/{tabs.mjs → tabs.js} +1 -1
  402. package/dist/ui/tabs.js.map +1 -0
  403. package/dist/ui/textarea.d.cts +2 -2
  404. package/dist/ui/{textarea.d.mts → textarea.d.ts} +3 -3
  405. package/dist/ui/textarea.js +1 -0
  406. package/dist/ui/toggle-group.d.cts +3 -3
  407. package/dist/ui/{toggle-group.d.mts → toggle-group.d.ts} +5 -5
  408. package/dist/ui/toggle-group.js +2 -0
  409. package/dist/ui/toggle-group.js.map +1 -0
  410. package/dist/ui/toggle.d.cts +4 -4
  411. package/dist/ui/{toggle.d.mts → toggle.d.ts} +5 -5
  412. package/dist/ui/{toggle.mjs → toggle.js} +1 -1
  413. package/dist/ui/toggle.js.map +1 -0
  414. package/dist/ui/tooltip.d.cts +5 -5
  415. package/dist/ui/{tooltip.d.mts → tooltip.d.ts} +6 -6
  416. package/dist/ui/tooltip.js +1 -0
  417. package/dist/user-BSpgswEC.js +2 -0
  418. package/dist/user-BSpgswEC.js.map +1 -0
  419. package/package.json +97 -97
  420. package/dist/alert-BbvPwf2x.mjs.map +0 -1
  421. package/dist/avatar-fltdRVsJ.mjs.map +0 -1
  422. package/dist/badge-CDGBGq8X.mjs.map +0 -1
  423. package/dist/button-CCVJTHBI.mjs +0 -2
  424. package/dist/button-CCVJTHBI.mjs.map +0 -1
  425. package/dist/button.variants-DkMqWB8G.mjs.map +0 -1
  426. package/dist/calendar-R866yyd1.mjs +0 -2
  427. package/dist/calendar-R866yyd1.mjs.map +0 -1
  428. package/dist/cards/grid-product-card.mjs +0 -2
  429. package/dist/cards/grid-product-card.mjs.map +0 -1
  430. package/dist/cards/product-card.mjs +0 -2
  431. package/dist/cards/product-card.mjs.map +0 -1
  432. package/dist/cards/simple-card.mjs +0 -2
  433. package/dist/cards/simple-card.mjs.map +0 -1
  434. package/dist/checkbox-Cat3i08X.mjs.map +0 -1
  435. package/dist/close-_UHFeiLS.mjs.map +0 -1
  436. package/dist/cms-layout-DkCR1AfG.mjs +0 -2
  437. package/dist/cms-layout-DkCR1AfG.mjs.map +0 -1
  438. package/dist/command-D6_CSbwJ.mjs +0 -2
  439. package/dist/command-D6_CSbwJ.mjs.map +0 -1
  440. package/dist/data-display/country.mjs +0 -2
  441. package/dist/data-display/country.mjs.map +0 -1
  442. package/dist/data-display/data-list.mjs.map +0 -1
  443. package/dist/data-display/date-tooltip.mjs +0 -2
  444. package/dist/data-display/date-tooltip.mjs.map +0 -1
  445. package/dist/data-display/date.mjs +0 -1
  446. package/dist/data-display/empty.mjs.map +0 -1
  447. package/dist/data-display/name.mjs +0 -2
  448. package/dist/data-display/name.mjs.map +0 -1
  449. package/dist/data-display/phone-number.mjs +0 -2
  450. package/dist/data-display/phone-number.mjs.map +0 -1
  451. package/dist/data-display/role-badge.mjs +0 -2
  452. package/dist/data-display/role-badge.mjs.map +0 -1
  453. package/dist/data-display/statistic.mjs +0 -1
  454. package/dist/data-display/user.mjs +0 -1
  455. package/dist/date-fY3sUcLp.mjs.map +0 -1
  456. package/dist/dialog-CLDnvNH_.mjs +0 -2
  457. package/dist/dialog-CLDnvNH_.mjs.map +0 -1
  458. package/dist/dialogs/confirm-dialog.mjs +0 -2
  459. package/dist/dialogs/confirm-dialog.mjs.map +0 -1
  460. package/dist/dialogs/detail-dialog/components/sidebar.mjs +0 -1
  461. package/dist/dialogs/detail-dialog/index.mjs +0 -2
  462. package/dist/dialogs/detail-dialog/index.mjs.map +0 -1
  463. package/dist/dialogs/error-dialog.mjs +0 -2
  464. package/dist/dialogs/error-dialog.mjs.map +0 -1
  465. package/dist/dialogs/loading-dialog.mjs +0 -2
  466. package/dist/dialogs/loading-dialog.mjs.map +0 -1
  467. package/dist/dist-DVrfqn8H.mjs.map +0 -1
  468. package/dist/drawer-CMD7JWH8.mjs.map +0 -1
  469. package/dist/dropdown-menu-BWhiVsEf.mjs.map +0 -1
  470. package/dist/features/descriptions/index.mjs +0 -2
  471. package/dist/features/descriptions/index.mjs.map +0 -1
  472. package/dist/features/search-modal/index.mjs +0 -1
  473. package/dist/features/tables/index.mjs +0 -1
  474. package/dist/features/tanstack-form/index.mjs +0 -1
  475. package/dist/features/text-editor/index.mjs +0 -1
  476. package/dist/field-dYemS0hQ.mjs +0 -2
  477. package/dist/field-dYemS0hQ.mjs.map +0 -1
  478. package/dist/flex-B6YSJzGe.mjs.map +0 -1
  479. package/dist/heading-De4Pn3mZ.mjs.map +0 -1
  480. package/dist/image-D7OZ13Ib.mjs +0 -2
  481. package/dist/image-D7OZ13Ib.mjs.map +0 -1
  482. package/dist/index.mjs +0 -1
  483. package/dist/input-NJP2wQOm.mjs.map +0 -1
  484. package/dist/label-CUCpwS5D.mjs.map +0 -1
  485. package/dist/layouts/cms-layout/index.d.mts +0 -2
  486. package/dist/layouts/cms-layout/index.mjs +0 -1
  487. package/dist/layouts/flex.mjs +0 -1
  488. package/dist/layouts/grid.mjs.map +0 -1
  489. package/dist/layouts/payment-layout/index.mjs +0 -1
  490. package/dist/pages/FeatureDeveloping.mjs +0 -2
  491. package/dist/pages/FeatureDeveloping.mjs.map +0 -1
  492. package/dist/pages/FeatureFixing.mjs +0 -2
  493. package/dist/pages/FeatureFixing.mjs.map +0 -1
  494. package/dist/pages/LoginPage.mjs +0 -2
  495. package/dist/pages/LoginPage.mjs.map +0 -1
  496. package/dist/pages/NotAuthorized.mjs +0 -2
  497. package/dist/pages/NotAuthorized.mjs.map +0 -1
  498. package/dist/pages/NotFound.mjs +0 -2
  499. package/dist/pages/NotFound.mjs.map +0 -1
  500. package/dist/pages/RegisterPage.mjs +0 -2
  501. package/dist/pages/RegisterPage.mjs.map +0 -1
  502. package/dist/pages/VerifyEmailPage.mjs +0 -2
  503. package/dist/pages/VerifyEmailPage.mjs.map +0 -1
  504. package/dist/paragraph-DYLaQtTV.mjs.map +0 -1
  505. package/dist/payment-layout-DrQ0kZPX.mjs +0 -2
  506. package/dist/payment-layout-DrQ0kZPX.mjs.map +0 -1
  507. package/dist/popover-C8rcemA3.mjs +0 -2
  508. package/dist/popover-C8rcemA3.mjs.map +0 -1
  509. package/dist/progress-CLeM0e7Z.mjs.map +0 -1
  510. package/dist/radio-group-Y9bhdr55.mjs.map +0 -1
  511. package/dist/resizable-CpCaSCFB.mjs.map +0 -1
  512. package/dist/search-modal-Bn-GOOCy.mjs +0 -2
  513. package/dist/search-modal-Bn-GOOCy.mjs.map +0 -1
  514. package/dist/select-LlPCZFSF.mjs.map +0 -1
  515. package/dist/separator-D3Gmkxzq.mjs.map +0 -1
  516. package/dist/sheet-BFlIfNaA.mjs.map +0 -1
  517. package/dist/sidebar-ChtCyu-n.mjs +0 -2
  518. package/dist/sidebar-ChtCyu-n.mjs.map +0 -1
  519. package/dist/skeleton-C51IdOfK.mjs.map +0 -1
  520. package/dist/spinner-eClTgHjk.mjs.map +0 -1
  521. package/dist/statistic-cwLwcukn.mjs.map +0 -1
  522. package/dist/switch-BP7EPatj.mjs.map +0 -1
  523. package/dist/systems/google.mjs.map +0 -1
  524. package/dist/tables-CFrsk2lM.mjs +0 -4
  525. package/dist/tables-CFrsk2lM.mjs.map +0 -1
  526. package/dist/tanstack-form-C_pyibTQ.mjs +0 -12
  527. package/dist/tanstack-form-C_pyibTQ.mjs.map +0 -1
  528. package/dist/text-editor-5mA7XyaI.mjs +0 -2
  529. package/dist/text-editor-5mA7XyaI.mjs.map +0 -1
  530. package/dist/textarea-7HDXcaK9.mjs.map +0 -1
  531. package/dist/tooltip-Dxl5Wa8i.mjs.map +0 -1
  532. package/dist/types-B5nyTWtO.mjs.map +0 -1
  533. package/dist/typography/paragraph.mjs +0 -1
  534. package/dist/typography/title.mjs.map +0 -1
  535. package/dist/ui/alert-dialog.mjs +0 -2
  536. package/dist/ui/alert-dialog.mjs.map +0 -1
  537. package/dist/ui/alert.mjs +0 -1
  538. package/dist/ui/aspect-ratio.mjs.map +0 -1
  539. package/dist/ui/avatar.mjs +0 -1
  540. package/dist/ui/badge.d.mts +0 -2
  541. package/dist/ui/badge.mjs +0 -1
  542. package/dist/ui/breadcrumb.mjs +0 -2
  543. package/dist/ui/breadcrumb.mjs.map +0 -1
  544. package/dist/ui/button-group.mjs +0 -2
  545. package/dist/ui/button-group.mjs.map +0 -1
  546. package/dist/ui/button.d.mts +0 -2
  547. package/dist/ui/button.mjs +0 -1
  548. package/dist/ui/buttons/add-new.mjs +0 -2
  549. package/dist/ui/buttons/add-new.mjs.map +0 -1
  550. package/dist/ui/buttons/edit.mjs +0 -2
  551. package/dist/ui/buttons/edit.mjs.map +0 -1
  552. package/dist/ui/buttons/refresh.mjs +0 -2
  553. package/dist/ui/buttons/refresh.mjs.map +0 -1
  554. package/dist/ui/buttons/trash.mjs +0 -2
  555. package/dist/ui/buttons/trash.mjs.map +0 -1
  556. package/dist/ui/buttons/upload-image.mjs +0 -2
  557. package/dist/ui/buttons/upload-image.mjs.map +0 -1
  558. package/dist/ui/calendar.mjs +0 -1
  559. package/dist/ui/card.mjs +0 -2
  560. package/dist/ui/card.mjs.map +0 -1
  561. package/dist/ui/carousel.mjs +0 -2
  562. package/dist/ui/carousel.mjs.map +0 -1
  563. package/dist/ui/checkbox.mjs +0 -1
  564. package/dist/ui/collapsible.mjs.map +0 -1
  565. package/dist/ui/command.mjs +0 -1
  566. package/dist/ui/context-menu.mjs.map +0 -1
  567. package/dist/ui/dialog.mjs +0 -1
  568. package/dist/ui/drawer.mjs +0 -1
  569. package/dist/ui/dropdown-menu.mjs +0 -1
  570. package/dist/ui/empty.mjs.map +0 -1
  571. package/dist/ui/field.d.mts +0 -65
  572. package/dist/ui/field.mjs +0 -1
  573. package/dist/ui/file-uploader.mjs +0 -3
  574. package/dist/ui/file-uploader.mjs.map +0 -1
  575. package/dist/ui/form.mjs +0 -2
  576. package/dist/ui/form.mjs.map +0 -1
  577. package/dist/ui/hover-card.mjs.map +0 -1
  578. package/dist/ui/image.mjs +0 -1
  579. package/dist/ui/input-otp.mjs.map +0 -1
  580. package/dist/ui/input.d.mts +0 -2
  581. package/dist/ui/input.mjs +0 -1
  582. package/dist/ui/inputs/search-input.mjs +0 -2
  583. package/dist/ui/inputs/search-input.mjs.map +0 -1
  584. package/dist/ui/item.mjs +0 -2
  585. package/dist/ui/item.mjs.map +0 -1
  586. package/dist/ui/label.mjs +0 -1
  587. package/dist/ui/menubar.mjs.map +0 -1
  588. package/dist/ui/multi-select.mjs +0 -2
  589. package/dist/ui/multi-select.mjs.map +0 -1
  590. package/dist/ui/navigation-menu.mjs.map +0 -1
  591. package/dist/ui/pagination.mjs +0 -2
  592. package/dist/ui/pagination.mjs.map +0 -1
  593. package/dist/ui/popover.mjs +0 -1
  594. package/dist/ui/progress.mjs +0 -1
  595. package/dist/ui/radio-group.mjs +0 -1
  596. package/dist/ui/resizable.mjs +0 -1
  597. package/dist/ui/scroll-area.mjs.map +0 -1
  598. package/dist/ui/select.mjs +0 -1
  599. package/dist/ui/separator.mjs +0 -1
  600. package/dist/ui/sheet.mjs +0 -1
  601. package/dist/ui/skeleton.mjs +0 -1
  602. package/dist/ui/slider.mjs.map +0 -1
  603. package/dist/ui/sonner.mjs.map +0 -1
  604. package/dist/ui/spinner.mjs +0 -1
  605. package/dist/ui/switch.mjs +0 -1
  606. package/dist/ui/table.mjs.map +0 -1
  607. package/dist/ui/tabs.mjs.map +0 -1
  608. package/dist/ui/textarea.mjs +0 -1
  609. package/dist/ui/toggle-group.mjs +0 -2
  610. package/dist/ui/toggle-group.mjs.map +0 -1
  611. package/dist/ui/toggle.mjs.map +0 -1
  612. package/dist/ui/tooltip.mjs +0 -1
  613. package/dist/user-DtZy4P9d.mjs +0 -2
  614. package/dist/user-DtZy4P9d.mjs.map +0 -1
@@ -1,2 +0,0 @@
1
- import{n as e}from"./button.variants-DkMqWB8G.mjs";import{t}from"./button-CCVJTHBI.mjs";import{ChevronDownIcon as n,ChevronLeftIcon as r,ChevronRightIcon as i}from"lucide-react";import{useEffect as a,useRef as o}from"react";import{cn as s}from"@customafk/react-toolkit/utils";import{jsx as c}from"react/jsx-runtime";import{DayPicker as l,getDefaultClassNames as u}from"react-day-picker";const d=({rootRef:e,className:t,...n})=>c(`div`,{"data-slot":`calendar`,ref:e,className:s(t),...n}),f=e=>e.orientation===`left`?c(r,{size:16,className:e.className,...e}):e.orientation===`right`?c(i,{size:16,className:e.className,...e}):c(n,{size:16,className:e.className,...e}),p=({className:e,day:n,modifiers:r,color:i,...l})=>{let d=u(),f=o(null);return a(()=>{r.focused&&f.current?.focus()},[r.focused]),c(t,{ref:f,variant:`ghost`,color:`muted`,"data-day":n.date.toLocaleDateString(),"data-selected-single":r.selected&&!r.range_start&&!r.range_end&&!r.range_middle,"data-range-start":r.range_start,"data-range-end":r.range_end,"data-range-middle":r.range_middle,className:s(`flex aspect-square size-9 flex-col rounded font-normal text-sm tabular-nums leading-none`,`data-[selected-single=true]:bg-primary`,`data-[selected-single=true]:text-white`,`data-[range-middle=true]:bg-muted-muted`,`data-[range-middle=true]:text-text-positive`,`data-[range-start=true]:bg-primary-muted`,`data-[range-start=true]:text-text-positive-strong`,`data-[range-end=true]:bg-primary`,`data-[range-end=true]:text-text-positive-strong`,`group-data-[focused=true]/day:border-primary-strong`,`group-data-[focused=true]/day:relative`,`group-data-[focused=true]/day:z-10`,`data-[range-end=true]:rounded`,`data-[range-end=true]:rounded-r`,`data-[range-middle=true]:rounded-none`,`data-[range-start=true]:rounded`,`data-[range-start=true]:rounded-l`,`[&>span]:text-xs [&>span]:opacity-70`,d.day,e),...l})},m=({children:e,...t})=>c(`td`,{...t,children:c(`div`,{className:`flex size-(--cell-size) items-center justify-center text-center`,children:e})});function h({className:t,classNames:n,showOutsideDays:r=!0,captionLayout:i=`label`,buttonVariant:a=`ghost`,formatters:o,components:h,...g}){let _=u();return c(l,{showOutsideDays:r,className:s(`group/calendar bg-background p-3`,`[--cell-size:--spacing(8)]`,`in-data-[slot=card-content]:bg-transparent`,`in-data-[slot=popover-content]:bg-transparent`,String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,t),captionLayout:i,formatters:{formatMonthDropdown:e=>e.toLocaleString(`default`,{month:`short`}),...o},classNames:{root:s(_.root),months:s(`flex gap-4 flex-col md:flex-row relative`,_.months),month:s(`flex flex-col w-full gap-4`,_.month),nav:s(`flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between`,_.nav),button_previous:s(e({variant:`outline`,color:`muted`}),`size-(--cell-size) aria-disabled:opacity-50 p-0 select-none`,_.button_previous),button_next:s(e({variant:`outline`,color:`muted`}),`size-(--cell-size) aria-disabled:opacity-50 p-0 select-none`,_.button_next),month_caption:s(`flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)`,_.month_caption),dropdowns:s(`w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5`,_.dropdowns),dropdown_root:s(`relative has-focus:border-primary-strong border border-border-weak shadow-xs has-focus:ring-primary-weak has-focus:ring-[3px] rounded`,_.dropdown_root),dropdown:s(`absolute inset-0 opacity-0`,_.dropdown),caption_label:s(`select-none font-medium`,i===`label`&&`text-sm`,i!==`label`&&`rounded shadow-xs px-2 flex items-center gap-0.5 text-sm h-8 [&>svg]:text-text-positive [&>svg]:size-3.5`,_.caption_label),table:`w-full border-collapse`,weekdays:s(`flex`,_.weekdays),weekday:s(`text-text-positive rounded flex-1 font-normal text-[0.8rem] select-none`,_.weekday),week:s(`flex w-full mt-2`,_.week),week_number_header:s(`select-none w-(--cell-size)`,_.week_number_header),week_number:s(`text-[0.8rem] select-none text-text-positive`,_.week_number),day:s(`relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l [&:last-child[data-selected=true]_button]:rounded-r group/day aspect-square select-none`,_.day),range_start:s(`rounded-l bg-muted-muted`,_.range_start),range_middle:s(`rounded-none`,_.range_middle),range_end:s(`rounded-r bg-muted-muted`,_.range_end),today:s(`bg-muted-muted text-text-positive rounded data-[selected=true]:rounded-none`,_.today),outside:s(`[&>button]:text-text-positive-muted aria-selected:text-text-positive`),disabled:s(`bg-muted-muted text-text-positive opacity-50`,_.disabled),hidden:s(`invisible`,_.hidden),...n},components:{Root:d,Chevron:f,DayButton:p,WeekNumber:m,...h},...g})}export{p as n,h as t};
2
- //# sourceMappingURL=calendar-R866yyd1.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar-R866yyd1.mjs","names":[],"sources":["../packages/components/ui/calendar.tsx"],"sourcesContent":["'use client';\nimport { type HTMLAttributes, type ThHTMLAttributes, useEffect, useRef } from 'react';\n\nimport { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { buttonVariants } from '@/components/ui/button.variants';\n\nimport { type CalendarWeek, type CustomComponents, type DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker';\n\nconst CalendarRoot = ({\n rootRef,\n className,\n ...props\n}: {\n rootRef?: React.Ref<HTMLDivElement>;\n} & HTMLAttributes<HTMLDivElement>) => {\n return <div data-slot=\"calendar\" ref={rootRef} className={cn(className)} {...props} />;\n};\n\nconst CalendarChevron = (props: { className?: string; size?: number; disabled?: boolean; orientation?: 'up' | 'down' | 'left' | 'right' }) => {\n if (props.orientation === 'left') {\n return <ChevronLeftIcon size={16} className={props.className} {...props} />;\n }\n\n if (props.orientation === 'right') {\n return <ChevronRightIcon size={16} className={props.className} {...props} />;\n }\n\n return <ChevronDownIcon size={16} className={props.className} {...props} />;\n};\n\nconst CalendarDayButton = ({ className, day, modifiers, color: _, ...props }: React.ComponentProps<typeof DayButton>) => {\n const defaultClassNames = getDefaultClassNames();\n\n const ref = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (modifiers.focused) ref.current?.focus();\n }, [modifiers.focused]);\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n color=\"muted\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle}\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n 'flex aspect-square size-9 flex-col rounded font-normal text-sm tabular-nums leading-none',\n 'data-[selected-single=true]:bg-primary',\n 'data-[selected-single=true]:text-white',\n 'data-[range-middle=true]:bg-muted-muted',\n 'data-[range-middle=true]:text-text-positive',\n 'data-[range-start=true]:bg-primary-muted',\n 'data-[range-start=true]:text-text-positive-strong',\n 'data-[range-end=true]:bg-primary',\n 'data-[range-end=true]:text-text-positive-strong',\n 'group-data-[focused=true]/day:border-primary-strong',\n 'group-data-[focused=true]/day:relative',\n 'group-data-[focused=true]/day:z-10',\n 'data-[range-end=true]:rounded',\n 'data-[range-end=true]:rounded-r',\n 'data-[range-middle=true]:rounded-none',\n 'data-[range-start=true]:rounded',\n 'data-[range-start=true]:rounded-l',\n '[&>span]:text-xs [&>span]:opacity-70',\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n );\n};\n\nconst CalendarWeekNumber = ({\n children,\n ...props\n}: {\n week: CalendarWeek;\n} & ThHTMLAttributes<HTMLTableCellElement>) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">{children}</div>\n </td>\n );\n};\n\n/**\n * A fully styled date-picker calendar built on top of react-day-picker, supporting single, range, and multiple selection modes.\n *\n * @example\n * ```tsx\n * import { Calendar } from '@customafk/lunas-ui/ui/calendar';\n *\n * const [date, setDate] = React.useState<Date>();\n *\n * <Calendar\n * mode=\"single\"\n * selected={date}\n * onSelect={setDate}\n * captionLayout=\"dropdown\"\n * />\n * ```\n */\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = 'label',\n buttonVariant = 'ghost',\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n /** Variant applied to the previous/next navigation buttons. */\n buttonVariant?: React.ComponentProps<typeof Button>['variant'];\n}) {\n const defaultClassNames = getDefaultClassNames();\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n 'group/calendar bg-background p-3',\n '[--cell-size:--spacing(8)]',\n 'in-data-[slot=card-content]:bg-transparent',\n 'in-data-[slot=popover-content]:bg-transparent',\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: date => date.toLocaleString('default', { month: 'short' }),\n ...formatters,\n }}\n classNames={{\n root: cn(defaultClassNames.root),\n months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),\n month: cn('flex flex-col w-full gap-4', defaultClassNames.month),\n nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),\n button_previous: cn(\n buttonVariants({ variant: 'outline', color: 'muted' }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: 'outline', color: 'muted' }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_next\n ),\n month_caption: cn('flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)', defaultClassNames.month_caption),\n dropdowns: cn('w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5', defaultClassNames.dropdowns),\n dropdown_root: cn(\n 'relative has-focus:border-primary-strong border border-border-weak shadow-xs has-focus:ring-primary-weak has-focus:ring-[3px] rounded',\n defaultClassNames.dropdown_root\n ),\n dropdown: cn('absolute inset-0 opacity-0', defaultClassNames.dropdown),\n caption_label: cn(\n 'select-none font-medium',\n captionLayout === 'label' && 'text-sm',\n captionLayout !== 'label' && 'rounded shadow-xs px-2 flex items-center gap-0.5 text-sm h-8 [&>svg]:text-text-positive [&>svg]:size-3.5',\n defaultClassNames.caption_label\n ),\n table: 'w-full border-collapse',\n weekdays: cn('flex', defaultClassNames.weekdays),\n weekday: cn('text-text-positive rounded flex-1 font-normal text-[0.8rem] select-none', defaultClassNames.weekday),\n week: cn('flex w-full mt-2', defaultClassNames.week),\n week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),\n week_number: cn('text-[0.8rem] select-none text-text-positive', defaultClassNames.week_number),\n day: cn(\n 'relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l [&:last-child[data-selected=true]_button]:rounded-r group/day aspect-square select-none',\n defaultClassNames.day\n ),\n range_start: cn('rounded-l bg-muted-muted', defaultClassNames.range_start),\n range_middle: cn('rounded-none', defaultClassNames.range_middle),\n range_end: cn('rounded-r bg-muted-muted', defaultClassNames.range_end),\n today: cn('bg-muted-muted text-text-positive rounded data-[selected=true]:rounded-none', defaultClassNames.today),\n outside: cn('[&>button]:text-text-positive-muted aria-selected:text-text-positive'),\n disabled: cn('bg-muted-muted text-text-positive opacity-50', defaultClassNames.disabled),\n hidden: cn('invisible', defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: CalendarRoot as CustomComponents['Root'],\n Chevron: CalendarChevron as CustomComponents['Chevron'],\n DayButton: CalendarDayButton as CustomComponents['DayButton'],\n WeekNumber: CalendarWeekNumber as CustomComponents['WeekNumber'],\n ...components,\n }}\n {...props}\n />\n );\n}\n\nexport { Calendar, CalendarDayButton };\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import{Card as t}from"../ui/card.mjs";import"../skeleton-C51IdOfK.mjs";import{t as n}from"../image-D7OZ13Ib.mjs";import{HeartIcon as r,ShoppingCartIcon as i}from"lucide-react";import{jsx as a,jsxs as o}from"react/jsx-runtime";const s=({name:s,thumbnail:c,price:l})=>o(t,{className:`h-36 w-full flex-row gap-4 p-2 pr-4`,children:[a(n,{className:`aspect-square h-full flex-0`,src:c}),o(`div`,{className:`flex flex-1 flex-col gap-y-1`,children:[a(`p`,{className:`line-clamp-2 h-10 font-semibold text-sm text-text-positive`,children:s}),o(`p`,{className:`font-bold text-base text-success`,children:[l.toLocaleString(`vi-VN`),a(`small`,{className:`ml-0.5`,children:`VND`})]}),o(`div`,{className:`mb-3 flex flex-1 items-end justify-end gap-x-1`,children:[a(e,{size:`icon`,variant:`outline`,color:`muted`,className:`size-9`,children:a(r,{})}),o(e,{className:`max-w-52 max-sm:size-9 sm:flex-1`,children:[a(i,{}),a(`p`,{className:`sr-only sm:not-sr-only`,children:`Thêm vào giỏ`})]})]})]})]});export{s as GridProductCard};
2
- //# sourceMappingURL=grid-product-card.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grid-product-card.mjs","names":["GridProductCard: React.FC<Props>","Image"],"sources":["../../packages/components/cards/grid-product-card.tsx"],"sourcesContent":["import { HeartIcon, ShoppingCartIcon } from 'lucide-react';\n\nimport { Button } from '../ui/button';\nimport { Card } from '../ui/card';\nimport { Image } from '../ui/image';\n\ntype Props = {\n /** Unique identifier for the product. */\n id: string;\n /** URL-friendly slug for the product. */\n slug: string;\n /** Display name of the product shown on the card. */\n name: string;\n /** URL of the product's thumbnail image. */\n thumbnail: string;\n /** Regular price of the product in VND. */\n price: number;\n /** Optional sale / discounted price in VND. */\n salePrice?: number;\n /** Optional sale discount percentage (0–100). */\n salePercentage?: number;\n};\n\n/**\n * A horizontal (grid-row) product card displaying a thumbnail, name, price, and add-to-cart / favourite actions.\n *\n * @example\n * ```tsx\n * import { GridProductCard } from '@customafk/lunas-ui/cards/grid-product-card';\n *\n * <GridProductCard\n * id=\"prod-1\"\n * slug=\"awesome-widget\"\n * name=\"Awesome Widget\"\n * thumbnail=\"/images/widget.png\"\n * price={299000}\n * />\n * ```\n */\nexport const GridProductCard: React.FC<Props> = ({ name, thumbnail, price }) => {\n return (\n <Card className=\"h-36 w-full flex-row gap-4 p-2 pr-4\">\n <Image className=\"aspect-square h-full flex-0\" src={thumbnail} />\n <div className=\"flex flex-1 flex-col gap-y-1\">\n <p className=\"line-clamp-2 h-10 font-semibold text-sm text-text-positive\">{name}</p>\n <p className=\"font-bold text-base text-success\">\n {price.toLocaleString('vi-VN')}\n <small className=\"ml-0.5\">VND</small>\n </p>\n <div className=\"mb-3 flex flex-1 items-end justify-end gap-x-1\">\n <Button size=\"icon\" variant=\"outline\" color=\"muted\" className=\"size-9\">\n <HeartIcon />\n </Button>\n <Button className=\"max-w-52 max-sm:size-9 sm:flex-1\">\n <ShoppingCartIcon />\n <p className=\"sr-only sm:not-sr-only\">Thêm vào giỏ</p>\n </Button>\n </div>\n </div>\n </Card>\n );\n};\n"],"mappings":"uXAuCA,MAAaA,GAAoC,CAAE,OAAM,YAAW,WAEhE,EAAC,EAAA,CAAK,UAAU,gDACd,EAACC,EAAAA,CAAM,UAAU,8BAA8B,IAAK,GAAa,CACjE,EAAC,MAAA,CAAI,UAAU,yCACb,EAAC,IAAA,CAAE,UAAU,sEAA8D,GAAS,CACpF,EAAC,IAAA,CAAE,UAAU,6CACV,EAAM,eAAe,QAAQ,CAC9B,EAAC,QAAA,CAAM,UAAU,kBAAS,OAAW,CAAA,EACnC,CACJ,EAAC,MAAA,CAAI,UAAU,2DACb,EAAC,EAAA,CAAO,KAAK,OAAO,QAAQ,UAAU,MAAM,QAAQ,UAAU,kBAC5D,EAAC,EAAA,EAAA,CAAY,EACN,CACT,EAAC,EAAA,CAAO,UAAU,6CAChB,EAAC,EAAA,EAAA,CAAmB,CACpB,EAAC,IAAA,CAAE,UAAU,kCAAyB,gBAAgB,CAAA,EAC/C,CAAA,EACL,GACF,CAAA,EACD"}
@@ -1,2 +0,0 @@
1
- import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import{Card as t}from"../ui/card.mjs";import"../skeleton-C51IdOfK.mjs";import{t as n}from"../image-D7OZ13Ib.mjs";import{HeartIcon as r,ShoppingCartIcon as i}from"lucide-react";import{jsx as a,jsxs as o}from"react/jsx-runtime";const s=({name:s,thumbnail:c,price:l})=>o(t,{className:`size-full gap-y-2 p-2 pb-4`,children:[a(n,{src:c,className:`aspect-square`}),o(`div`,{className:`flex flex-col gap-y-1`,children:[a(`p`,{className:`line-clamp-2 h-10 text-sm font-semibold`,children:s}),o(`p`,{className:`text-success text-base font-bold`,children:[l.toLocaleString(`vi-VN`),a(`small`,{className:`ml-0.5`,children:`VND`})]}),o(`div`,{className:`mt-1 flex gap-x-1`,children:[o(e,{className:`flex-1`,children:[a(i,{}),`Thêm vào giỏ`]}),a(e,{size:`icon`,variant:`outline`,color:`muted`,className:`size-9`,children:a(r,{})})]})]})]});export{s as ProductCard};
2
- //# sourceMappingURL=product-card.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"product-card.mjs","names":["ProductCard: React.FC<Props>","Image"],"sources":["../../packages/components/cards/product-card.tsx"],"sourcesContent":["import { HeartIcon, ShoppingCartIcon } from 'lucide-react';\n\nimport { Button } from '../ui/button';\nimport { Card } from '../ui/card';\nimport { Image } from '../ui/image';\n\ntype Props = {\n /** Unique identifier for the product. */\n id: string;\n /** URL-friendly slug for the product. */\n slug: string;\n /** Display name of the product shown on the card. */\n name: string;\n /** URL of the product's thumbnail image. */\n thumbnail: string;\n /** Regular price of the product in VND. */\n price: number;\n /** Optional sale / discounted price in VND. */\n salePrice?: number;\n /** Optional sale discount percentage (0–100). */\n salePercentage?: number;\n};\n\n/**\n * A vertical product card displaying a thumbnail, name, price, and add-to-cart / favourite actions.\n *\n * @example\n * ```tsx\n * import { ProductCard } from '@customafk/lunas-ui/cards/product-card';\n *\n * <ProductCard\n * id=\"prod-1\"\n * slug=\"awesome-widget\"\n * name=\"Awesome Widget\"\n * thumbnail=\"/images/widget.png\"\n * price={299000}\n * />\n * ```\n */\nexport const ProductCard: React.FC<Props> = ({ name, thumbnail, price }) => {\n return (\n <Card className=\"size-full gap-y-2 p-2 pb-4\">\n <Image src={thumbnail} className=\"aspect-square\" />\n <div className=\"flex flex-col gap-y-1\">\n <p className=\"line-clamp-2 h-10 text-sm font-semibold\">{name}</p>\n <p className=\"text-success text-base font-bold\">\n {price.toLocaleString('vi-VN')}\n <small className=\"ml-0.5\">VND</small>\n </p>\n <div className=\"mt-1 flex gap-x-1\">\n <Button className=\"flex-1\">\n <ShoppingCartIcon />\n Thêm vào giỏ\n </Button>\n <Button size=\"icon\" variant=\"outline\" color=\"muted\" className=\"size-9\">\n <HeartIcon />\n </Button>\n </div>\n </div>\n </Card>\n );\n};\n"],"mappings":"uXAuCA,MAAaA,GAAgC,CAAE,OAAM,YAAW,WAE5D,EAAC,EAAA,CAAK,UAAU,uCACd,EAACC,EAAAA,CAAM,IAAK,EAAW,UAAU,iBAAkB,CACnD,EAAC,MAAA,CAAI,UAAU,kCACb,EAAC,IAAA,CAAE,UAAU,mDAA2C,GAAS,CACjE,EAAC,IAAA,CAAE,UAAU,6CACV,EAAM,eAAe,QAAQ,CAC9B,EAAC,QAAA,CAAM,UAAU,kBAAS,OAAW,CAAA,EACnC,CACJ,EAAC,MAAA,CAAI,UAAU,8BACb,EAAC,EAAA,CAAO,UAAU,mBAChB,EAAC,EAAA,EAAA,CAAmB,CAAA,eAAA,EAEb,CACT,EAAC,EAAA,CAAO,KAAK,OAAO,QAAQ,UAAU,MAAM,QAAQ,UAAU,kBAC5D,EAAC,EAAA,EAAA,CAAY,EACN,CAAA,EACL,GACF,CAAA,EACD"}
@@ -1,2 +0,0 @@
1
- "use client";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import{Card as e,CardAction as t,CardContent as n,CardDescription as r,CardFooter as i,CardHeader as a,CardTitle as o}from"../ui/card.mjs";import{jsx as s,jsxs as c}from"react/jsx-runtime";const l=({title:l,description:u,action:d,footer:f,children:p})=>c(e,{children:[c(a,{children:[s(o,{children:l}),s(r,{children:u}),d&&s(t,{children:d})]}),s(n,{children:p}),f&&s(i,{children:f})]});export{l as SimpleCard};
2
- //# sourceMappingURL=simple-card.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-card.mjs","names":[],"sources":["../../packages/components/cards/simple-card.tsx"],"sourcesContent":["'use client';\nimport { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '../ui/card';\n\ntype Props = {\n /** The card's heading text displayed in the header. */\n title: string;\n /** Optional subtitle or description shown below the title. */\n description?: string;\n /** Optional node rendered as a card action (e.g. a button) in the header. */\n action?: React.ReactNode;\n /** Optional node rendered inside the card footer. */\n footer?: React.ReactNode;\n};\n\n/**\n * A general-purpose card with a header, optional description, action slot, content area, and footer.\n *\n * @example\n * ```tsx\n * import { SimpleCard } from '@customafk/lunas-ui/cards/simple-card';\n *\n * <SimpleCard title=\"Summary\" description=\"Overview of results\">\n * <p>Card body content goes here.</p>\n * </SimpleCard>\n * ```\n */\nexport const SimpleCard = ({ title, description, action, footer, children }: React.PropsWithChildren<Props>) => {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n {action && <CardAction>{action}</CardAction>}\n </CardHeader>\n <CardContent>{children}</CardContent>\n {footer && <CardFooter>{footer}</CardFooter>}\n </Card>\n );\n};\n"],"mappings":"4QA0BA,MAAa,GAAc,CAAE,QAAO,cAAa,SAAQ,SAAQ,cAE7D,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SAAW,EAAA,CAAkB,CAC9B,EAAC,EAAA,CAAA,SAAiB,EAAA,CAA8B,CAC/C,GAAU,EAAC,EAAA,CAAA,SAAY,EAAA,CAAoB,GACjC,CACb,EAAC,EAAA,CAAa,WAAA,CAAuB,CACpC,GAAU,EAAC,EAAA,CAAA,SAAY,EAAA,CAAoB,GACvC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkbox-Cat3i08X.mjs","names":["Checkbox","CheckboxPrimitive"],"sources":["../packages/components/ui/checkbox.tsx"],"sourcesContent":["'use client';\n\nimport { CheckIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\n\n/**\n * Accessible checkbox input built on Radix UI's Checkbox primitive with checked, indeterminate, focus, invalid, and read-only states.\n *\n * @example\n * ```tsx\n * import { Checkbox } from '@customafk/lunas-ui/ui/checkbox';\n * import { Label } from '@customafk/lunas-ui/ui/label';\n *\n * <div className=\"flex items-center gap-2\">\n * <Checkbox id=\"terms\" />\n * <Label htmlFor=\"terms\">Accept terms and conditions</Label>\n * </div>\n * ```\n */\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer border-border',\n 'size-4 shrink-0 cursor-pointer rounded border shadow-xs outline-none transition-all',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'focus-visible:border-primary-strong',\n 'focus-visible:ring-3',\n 'focus-visible:ring-primary-weak',\n 'aria-invalid:border-danger aria-invalid:ring-danger-weak',\n 'aria-readonly:bg-muted-muted',\n 'aria-readonly:pointer-events-none',\n 'data-[state=checked]:aria-readonly:bg-muted-muted',\n 'data-[state=checked]:aria-readonly:border-border',\n 'data-[state=checked]:aria-readonly:text-text-positive-strong',\n 'data-[state=checked]:bg-primary',\n 'data-[state=checked]:border-primary-strong',\n 'data-[state=checked]:text-text-negative-strong',\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator data-slot=\"checkbox-indicator\" className=\"flex items-center justify-center text-current transition-none\">\n <CheckIcon size={14} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":"yKAsBA,SAASA,EAAS,CAAE,YAAW,GAAG,GAA8D,CAC9F,OACE,EAACC,EAAkB,KAAA,CACjB,YAAU,WACV,UAAW,EACT,qBACA,sFACA,kDACA,sCACA,uBACA,kCACA,2DACA,+BACA,oCACA,oDACA,mDACA,+DACA,kCACA,6CACA,iDACA,EACD,CACD,GAAI,WAEJ,EAACA,EAAkB,UAAA,CAAU,YAAU,qBAAqB,UAAU,yEACpE,EAAC,EAAA,CAAU,KAAM,GAAA,CAAM,EACK,EACP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"close-_UHFeiLS.mjs","names":["CloseButton: React.FC<React.ComponentProps<'button'>>"],"sources":["../packages/components/ui/buttons/close.tsx"],"sourcesContent":["import { XIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nexport const CloseButton: React.FC<React.ComponentProps<'button'>> = ({ className, ...props }) => {\n return (\n <button\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[100px] p-2 text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive active:bg-muted-weak active:text-text-positive-strong disabled:pointer-events-none disabled:opacity-60',\n className\n )}\n {...props}\n >\n <XIcon size={24} />\n </button>\n );\n};\n"],"mappings":"iIAIA,MAAaA,GAAyD,CAAE,YAAW,GAAG,KAElF,EAAC,SAAA,CACC,UAAW,EACT,qQACA,EACD,CACD,GAAI,WAEJ,EAAC,EAAA,CAAM,KAAM,GAAA,CAAM,EACZ"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./dist-DVrfqn8H.mjs";import{t}from"./button-CCVJTHBI.mjs";import{i as n,n as r,r as i,t as a}from"./tooltip-Dxl5Wa8i.mjs";import{n as o,r as s,t as c}from"./avatar-fltdRVsJ.mjs";import{t as l}from"./separator-D3Gmkxzq.mjs";import{i as u,o as d,r as f,s as p,t as m}from"./sheet-BFlIfNaA.mjs";import{a as h,h as g,i as _,r as v,t as y,u as b}from"./dropdown-menu-BWhiVsEf.mjs";import{t as x}from"./input-NJP2wQOm.mjs";import{EarthIcon as S,LogOutIcon as C,MenuIcon as w,ShoppingCartIcon as T,UserRoundIcon as E}from"lucide-react";import{createContext as D,memo as O,useCallback as k,useContext as ee,useEffect as te,useMemo as ne,useState as A}from"react";import{cn as j}from"@customafk/react-toolkit/utils";import{cva as M}from"class-variance-authority";import{Fragment as N,jsx as P,jsxs as F}from"react/jsx-runtime";import{colorHashLight as I}from"@customafk/react-toolkit/color-hash";import{useIsMobile as re}from"@customafk/react-toolkit/hooks/useMobile";const L=D(null);function R(){let e=ee(L);if(!e)throw Error(`useSidebar must be used within a SidebarProvider.`);return e}function ie({defaultOpen:e=!0,open:t,onOpenChange:n,className:r,style:a,children:o,...s}){let c=re(),[l,u]=A(!1),[d,f]=A(e),p=t??d,m=k(e=>{let t=typeof e==`function`?e(p):e;n?n(t):f(t),document.cookie=`sidebar_state=${t}; path=/; max-age=604800`},[n,p]),h=k(()=>c?u(e=>!e):m(e=>!e),[c,m]);te(()=>{let e=e=>{e.key===`b`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),h())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h]);let g=p?`expanded`:`collapsed`,_=ne(()=>({state:g,open:p,setOpen:m,isMobile:c,openMobile:l,setOpenMobile:u,toggleSidebar:h}),[g,p,m,c,l,h]);return P(L.Provider,{value:_,children:P(i,{delayDuration:0,children:P(`section`,{"data-slot":`layout-wrapper`,style:{"--sidebar-width":`16rem`,"--sidebar-width-icon":`3rem`,...a},className:j(`relative group/sidebar-wrapper flex h-dvh bg-sidebar`,r),...s,children:o})})})}const z=O(({side:e=`left`,variant:n=`sidebar`,collapsible:r=`offcanvas`,className:i,children:a,...o})=>{let{isMobile:s,state:c,openMobile:l,setOpenMobile:h,toggleSidebar:g}=R(),_=k(e=>{g(),e.preventDefault(),e.stopPropagation()},[g]);return r===`none`?P(`aside`,{"data-slot":`sidebar`,className:j(`flex w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground`,i),...o,children:a}):s?P(m,{open:l,onOpenChange:h,...o,children:F(f,{"data-sidebar":`sidebar`,"data-slot":`sidebar`,"data-mobile":`true`,style:{"--sidebar-width":`18rem`},side:e,className:`w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground sm:max-w-3xs [&>button]:hidden`,children:[F(d,{className:`sr-only`,children:[P(p,{children:`Sidebar`}),P(u,{children:`Displays the mobile sidebar.`})]}),F(`div`,{className:`flex size-full flex-col`,children:[F(`div`,{className:`flex flex-0 items-center gap-x-2 border-b border-border-weak p-2 pr-4`,children:[F(t,{"data-sidebar":`trigger`,"data-slot":`sidebar-trigger`,variant:`ghost`,color:`muted`,size:`icon`,className:j(`size-10 rounded-full`,i),onClick:_,children:[P(w,{className:`size-6!`}),P(`span`,{className:`sr-only`,children:`Toggle Sidebar`})]}),P(`div`,{className:`ml-2 flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground`,children:P(T,{size:20})}),F(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[P(`span`,{className:`truncate font-medium`,children:`Lunas Store`}),P(`span`,{className:`truncate text-xs`,children:`Established 2023`})]})]}),P(`div`,{className:`flex flex-1 flex-col p-2`,children:a})]})]})}):F(`aside`,{className:`group peer hidden bg-card text-sidebar-foreground md:block`,"data-state":c,"data-collapsible":c===`collapsed`?r:``,"data-variant":n,"data-side":e,"data-slot":`sidebar`,children:[P(`div`,{"data-slot":`sidebar-gap`,className:j(`bg-transparent`,`transition-[width] duration-200 ease-linear`,`h-(--header-height) sm:h-[calc(var(--header-height)+0.5rem)]`,`w-(--sidebar-width)`,`group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]`)}),P(`div`,{"data-slot":`sidebar-container`,className:j(`hidden md:flex shadow-nav`,`fixed left-0 inset-y-0 p-2`,`top-[calc(var(--header-height)+0.5rem)] z-10`,`w-(--sidebar-width)`,`transition-all duration-200 ease-linear`,`group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]`,i),...o,children:P(`div`,{"data-sidebar":`sidebar`,"data-slot":`sidebar-inner`,className:`relative flex size-full flex-col`,children:a})})]})});z.displayName=`CMSLayoutSidebar`;const B=O(({className:e,children:t,...n})=>F(`main`,{"data-slot":`sidebar-inset`,className:j(`relative flex w-full flex-1 flex-col`,e),...n,children:[P(`div`,{className:`h-(--header-height) sm:h-[calc(var(--header-height)+0.5rem)]`}),P(`div`,{className:`relative flex-1 size-full overflow-auto`,children:t})]}));B.displayName=`CMSLayoutMain`;const V=O(({className:e,...t})=>P(x,{"data-slot":`sidebar-input`,"data-sidebar":`input`,className:j(`h-8 w-full bg-background shadow-none`,e),...t}));V.displayName=`SidebarInput`;const H=O(({className:e,...t})=>P(`div`,{"data-slot":`sidebar-header`,"data-sidebar":`header`,className:j(`flex flex-col gap-2 p-2`,e),...t}));H.displayName=`SidebarHeader`;const U=O(({className:e,...t})=>P(`div`,{"data-slot":`sidebar-footer`,"data-sidebar":`footer`,className:j(`flex flex-col gap-2`,e),...t}));U.displayName=`SidebarFooter`;const W=O(({className:e,...t})=>P(l,{"data-slot":`sidebar-separator`,"data-sidebar":`separator`,className:j(`mx-2 w-auto bg-sidebar-border`,e),...t}));W.displayName=`SidebarSeparator`;const G=O(({className:e,...t})=>P(`div`,{"data-slot":`sidebar-content`,"data-sidebar":`content`,className:j(`flex flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden`,e),...t}));G.displayName=`SidebarContent`;const K=O(({className:e,...t})=>P(`div`,{"data-slot":`sidebar-group`,"data-sidebar":`group`,className:j(`relative flex w-full flex-col`,e),...t}));K.displayName=`SidebarGroup`;const q=O(({className:t,asChild:n=!1,...r})=>P(n?e:`div`,{"data-slot":`sidebar-group-label`,"data-sidebar":`group-label`,className:j(`flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity,color] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0`,`group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0`,t),...r}));q.displayName=`SidebarGroupLabel`;const J=O(({className:e,...t})=>P(`div`,{"data-slot":`sidebar-group-content`,"data-sidebar":`group-content`,className:j(`w-full text-sm`,e),...t}));J.displayName=`SidebarGroupContent`;const Y=O(({className:e,...t})=>P(`ul`,{"data-slot":`sidebar-menu`,"data-sidebar":`menu`,className:j(`flex w-full min-w-0 flex-col gap-1`,e),...t}));Y.displayName=`SidebarMenu`;const X=O(({className:e,...t})=>P(`li`,{"data-slot":`sidebar-menu-item`,"data-sidebar":`menu-item`,className:j(`group/menu-item relative`,e),...t}));X.displayName=`SidebarMenuItem`;const ae=M([`peer/menu-button`,`cursor-pointer`,`flex w-full items-center gap-2`,`overflow-hidden rounded-md p-2 outline-hidden`,`truncate text-left font-normal`,`transition-[color,background-color,width,height,padding]`,`active:bg-sidebar-accent active:text-sidebar-accent-foreground`,`disabled:pointer-events-none disabled:opacity-50`,`group-has-data-[sidebar=menu-action]/menu-item:pr-8`,`aria-disabled:pointer-events-none aria-disabled:opacity-50`,`data-[active=true]:bg-sidebar-primary-muted data-[active=true]:text-sidebar-primary`,`data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground`,`group-data-[collapsible=icon]:size-12! group-data-[collapsible=icon]:p-3! group-data-[collapsible=icon]:gap-3!`,`[&>svg]:size-6 [&>svg]:shrink-0`,`[&>span:last-child]:truncate`],{variants:{variant:{default:`hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground`,outline:`bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]`},size:{default:`h-10 text-sm`,sm:`h-7 text-xs`,lg:`h-12 text-sm group-data-[collapsible=icon]:p-0!`}},defaultVariants:{variant:`default`,size:`default`}}),Z=O(({asChild:t=!1,isActive:i=!1,variant:o=`default`,size:s=`default`,tooltip:c,className:l,...u})=>{let d=t?e:`button`,{isMobile:f,state:p}=R(),m=k(e=>{u.onClick?.(),e.preventDefault(),e.stopPropagation()},[u.onClick]),h=P(d,{"data-slot":`sidebar-menu-button`,"data-sidebar":`menu-button`,"data-size":s,"data-active":i,className:j(ae({variant:o,size:s}),l),onClick:m,...u});return c?(typeof c==`string`&&(c={children:c}),F(a,{children:[P(n,{asChild:!0,children:h}),P(r,{side:`right`,align:`center`,hidden:p!==`collapsed`||f,...c})]})):h});Z.displayName=`SidebarMenuButton`;const oe=({i18nText:e,onChangeToEnLocale:n,onChangeToViLocale:r,user:i,onLogout:a,logoutLabel:l=`Log out`})=>{let{toggleSidebar:u}=R(),d=k(e=>{e.preventDefault(),e.stopPropagation(),u()},[u]),f=k(e=>{e.preventDefault(),e.stopPropagation(),n?.()},[n]),p=k(e=>{e.preventDefault(),e.stopPropagation(),r?.()},[r]),m=i?I.hex(i.name):void 0;return F(`header`,{"data-slot":`cms-layout-header`,className:j(`bg-card`,`h-(--header-height)`,`sm:h-[calc(var(--header-height)+0.5rem)] sm:px-4 sm:pr-6`,`absolute inset-x-0 top-0 z-20 gap-2 px-2 pr-4.5`,`flex items-center shadow-nav`,`transition-[height] ease-linear`),children:[F(t,{"data-sidebar":`trigger`,"data-slot":`sidebar-trigger`,variant:`ghost`,color:`muted`,size:`icon`,className:`size-10 rounded-full transition-all hover:text-text-positive`,onClick:d,children:[P(w,{className:`size-6!`}),P(`span`,{className:`sr-only`,children:`Toggle Sidebar`})]}),F(`div`,{className:`flex flex-1 gap-x-2 sm:ml-2.5`,children:[P(`div`,{className:`flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground`,children:P(T,{size:20})}),F(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[P(`span`,{className:`truncate font-medium`,children:`Lunas Enterprise`}),P(`span`,{className:`truncate text-xs`,children:`Established 2025`})]})]}),F(`div`,{className:`flex items-center gap-1`,children:[i&&F(y,{children:[P(g,{asChild:!0,children:F(t,{variant:`ghost`,color:`muted`,className:`h-9 gap-2.5 rounded-full px-2 transition-all`,children:[F(c,{className:`size-7 shrink-0`,children:[P(s,{src:i.avatarUrl,alt:i.name}),P(o,{style:{backgroundColor:m},children:P(E,{size:14,className:`text-white`})})]}),F(`div`,{className:`hidden flex-col items-start sm:flex`,children:[P(`span`,{className:`max-w-36 truncate text-xs font-semibold leading-tight text-text-positive`,children:i.name}),i.email&&P(`span`,{className:`max-w-36 truncate text-xs leading-tight text-text-positive-weak`,children:i.email})]})]})}),F(v,{align:`end`,className:`w-60`,children:[F(`div`,{className:`flex flex-col items-center gap-2 px-4 py-4 text-center`,children:[F(c,{className:`size-12`,children:[P(s,{src:i.avatarUrl,alt:i.name}),P(o,{style:{backgroundColor:m},children:P(E,{size:22,className:`text-white`})})]}),F(`div`,{className:`flex min-w-0 w-full flex-col items-center gap-0.5`,children:[P(`p`,{className:`truncate text-sm font-semibold text-text-positive`,children:i.name}),i.email&&P(`p`,{className:`truncate text-xs text-text-positive-weak`,children:i.email}),i.role&&P(`span`,{className:`mt-1 w-fit rounded-sm border border-border bg-secondary-muted px-2 py-0.5 text-xs font-medium text-text-positive-weak`,children:i.role})]})]}),a&&F(N,{children:[P(b,{}),P(_,{children:F(h,{className:`text-danger focus:text-danger`,onClick:a,children:[P(C,{className:`size-4`}),l]})})]})]})]}),i&&(n||r)&&P(`div`,{className:`mx-1 h-5 w-px bg-border`}),(n||r)&&F(y,{children:[P(g,{asChild:!0,children:F(t,{"data-slot":`locale-trigger`,variant:`ghost`,color:`muted`,className:`gap-x-1 rounded-full transition-all hover:text-text-positive`,children:[P(S,{className:`size-6!`}),e]})}),P(v,{align:`end`,children:F(_,{children:[P(h,{onClick:f,children:`EN - English`}),P(h,{onClick:p,children:`VI - Vietnamese`})]})})]})]})]})},Q=O(({id:e,label:t,icon:n,activeNavItemId:r,onClick:i})=>P(X,{children:F(Z,{isActive:e===r,onClick:i,children:[n,t]})}));Q.displayName=`SidebarContentGroupItem`;const $=O(({id:e,label:t,children:n})=>F(K,{children:[P(q,{children:t}),P(J,{children:P(Y,{children:n})})]}));$.displayName=`SidebarContentGroup`;const se=({i18nText:e,activeNavItemId:t,sidebar:n,children:r,onChangeToEnLocale:i,onChangeToViLocale:a,onLogout:o,logoutLabel:s=`Log out`,copyright:c=`Copyright © ${new Date().getFullYear()}, Lunas.`,user:l})=>{let u=n?.groupcontent??[];return F(ie,{children:[P(oe,{i18nText:e,onChangeToEnLocale:i,onChangeToViLocale:a,user:l,onLogout:o,logoutLabel:s}),F(z,{variant:`inset`,collapsible:`icon`,children:[P(G,{children:u.map(e=>P($,{id:e.id,label:e.label,children:e.items.map(e=>P(Q,{id:e.id,activeNavItemId:t,label:e.label,icon:e.icon,onClick:e.onClick},e.id))},e.id))}),P(U,{children:F(Y,{children:[P(X,{children:F(Z,{className:`border border-border`,onClick:o,children:[P(C,{className:`text-text-positive-weak`}),s]})}),P(X,{className:`mt-2 border-t border-t-border`,children:P(`p`,{className:`pt-2 text-center text-xs text-text-positive-subtle`,children:c})})]})})]}),P(B,{children:r})]})};export{se as t};
2
- //# sourceMappingURL=cms-layout-DkCR1AfG.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cms-layout-DkCR1AfG.mjs","names":["open","CMSLayoutHeader: React.FC<{\n i18nText?: string;\n onChangeToEnLocale?: () => void;\n onChangeToViLocale?: () => void;\n user?: CMSLayoutUser;\n onLogout?: () => void;\n logoutLabel?: string;\n}>","CMSLayout: React.FC<React.PropsWithChildren<CMSLayoutProps>>"],"sources":["../packages/components/layouts/cms-layout/components/sidebar.tsx","../packages/components/layouts/cms-layout/components/header.tsx","../packages/components/layouts/cms-layout/index.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, memo, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { MenuIcon, PanelLeftIcon, ShoppingCartIcon } from 'lucide-react';\n\nimport { useIsMobile } from '@customafk/react-toolkit/hooks/useMobile';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n return context;\n}\n\nfunction CMSLayoutProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = useState(false);\n\n const [_open, _setOpen] = useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n // biome-ignore lint/suspicious/noDocumentCookie: persists sidebar state across page loads\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open]\n );\n\n const toggleSidebar = useCallback(() => {\n return isMobile ? setOpenMobile(open => !open) : setOpen(open => !open);\n }, [isMobile, setOpen]);\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = useMemo<SidebarContextProps>(\n () => ({ state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar }),\n [state, open, setOpen, isMobile, openMobile, toggleSidebar]\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <section\n data-slot=\"layout-wrapper\"\n style={{ '--sidebar-width': SIDEBAR_WIDTH, '--sidebar-width-icon': SIDEBAR_WIDTH_ICON, ...style } as React.CSSProperties}\n className={cn('relative group/sidebar-wrapper flex h-dvh bg-sidebar', className)}\n {...props}\n >\n {children}\n </section>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nconst CMSLayoutSidebar = memo(\n ({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n }: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n }) => {\n const { isMobile, state, openMobile, setOpenMobile, toggleSidebar } = useSidebar();\n\n const handleToggleSidebar = useCallback<React.MouseEventHandler<HTMLButtonElement>>(\n event => {\n toggleSidebar();\n event.preventDefault();\n event.stopPropagation();\n },\n [toggleSidebar]\n );\n\n if (collapsible === 'none') {\n return (\n <aside data-slot=\"sidebar\" className={cn('flex w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground', className)} {...props}>\n {children}\n </aside>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n style={{ '--sidebar-width': SIDEBAR_WIDTH_MOBILE } as React.CSSProperties}\n side={side}\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground sm:max-w-3xs [&>button]:hidden\"\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex size-full flex-col\">\n <div className=\"flex flex-0 items-center gap-x-2 border-b border-border-weak p-2 pr-4\">\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n color=\"muted\"\n size=\"icon\"\n className={cn('size-10 rounded-full', className)}\n onClick={handleToggleSidebar}\n >\n <MenuIcon className=\"size-6!\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n <div className=\"ml-2 flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n <ShoppingCartIcon size={20} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">Lunas Store</span>\n <span className=\"truncate text-xs\">Established 2023</span>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col p-2\">{children}</div>\n </div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <aside\n className=\"group peer hidden bg-card text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'bg-transparent',\n 'transition-[width] duration-200 ease-linear',\n 'h-(--header-height) sm:h-[calc(var(--header-height)+0.5rem)]',\n 'w-(--sidebar-width)',\n 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'hidden md:flex shadow-nav',\n 'fixed left-0 inset-y-0 p-2',\n 'top-[calc(var(--header-height)+0.5rem)] z-10',\n 'w-(--sidebar-width)',\n 'transition-all duration-200 ease-linear',\n 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]',\n className\n )}\n {...props}\n >\n <div data-sidebar=\"sidebar\" data-slot=\"sidebar-inner\" className=\"relative flex size-full flex-col\">\n {children}\n </div>\n </div>\n </aside>\n );\n }\n);\nCMSLayoutSidebar.displayName = 'CMSLayoutSidebar';\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={event => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-0.5 hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'group-data-[collapsible=offcanvas]:translate-x-0 hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className\n )}\n {...props}\n />\n );\n}\n\nconst CMSLayoutMain = memo(({ className, children, ...props }: React.ComponentProps<'main'>) => {\n return (\n <main data-slot=\"sidebar-inset\" className={cn('relative flex w-full flex-1 flex-col', className)} {...props}>\n <div className=\"h-(--header-height) sm:h-[calc(var(--header-height)+0.5rem)]\" />\n <div className=\"relative flex-1 size-full overflow-auto\">{children}</div>\n </main>\n );\n});\nCMSLayoutMain.displayName = 'CMSLayoutMain';\n\nconst SidebarInput = memo(({ className, ...props }: React.ComponentProps<typeof Input>) => {\n return <Input data-slot=\"sidebar-input\" data-sidebar=\"input\" className={cn('h-8 w-full bg-background shadow-none', className)} {...props} />;\n});\nSidebarInput.displayName = 'SidebarInput';\n\nconst SidebarHeader = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"sidebar-header\" data-sidebar=\"header\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n});\nSidebarHeader.displayName = 'SidebarHeader';\n\nconst SidebarFooter = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"sidebar-footer\" data-sidebar=\"footer\" className={cn('flex flex-col gap-2', className)} {...props} />;\n});\nSidebarFooter.displayName = 'SidebarFooter';\n\nconst SidebarSeparator = memo(({ className, ...props }: React.ComponentProps<typeof Separator>) => {\n return <Separator data-slot=\"sidebar-separator\" data-sidebar=\"separator\" className={cn('mx-2 w-auto bg-sidebar-border', className)} {...props} />;\n});\nSidebarSeparator.displayName = 'SidebarSeparator';\n\nconst SidebarContent = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn('flex flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden', className)}\n {...props}\n />\n );\n});\nSidebarContent.displayName = 'SidebarContent';\n\nconst SidebarGroup = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"sidebar-group\" data-sidebar=\"group\" className={cn('relative flex w-full flex-col', className)} {...props} />;\n});\nSidebarGroup.displayName = 'SidebarGroup';\n\nconst SidebarGroupLabel = memo(({ className, asChild = false, ...props }: React.ComponentProps<'div'> & { asChild?: boolean }) => {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity,color] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className\n )}\n {...props}\n />\n );\n});\nSidebarGroupLabel.displayName = 'SidebarGroupLabel';\n\nfunction SidebarGroupAction({ className, asChild = false, ...props }: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-[background-color,color,transform] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2',\n '[&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nconst SidebarGroupContent = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"sidebar-group-content\" data-sidebar=\"group-content\" className={cn('w-full text-sm', className)} {...props} />;\n});\nSidebarGroupContent.displayName = 'SidebarGroupContent';\n\nconst SidebarMenu = memo(({ className, ...props }: React.ComponentProps<'ul'>) => {\n return <ul data-slot=\"sidebar-menu\" data-sidebar=\"menu\" className={cn('flex w-full min-w-0 flex-col gap-1', className)} {...props} />;\n});\nSidebarMenu.displayName = 'SidebarMenu';\n\nconst SidebarMenuItem = memo(({ className, ...props }: React.ComponentProps<'li'>) => {\n return <li data-slot=\"sidebar-menu-item\" data-sidebar=\"menu-item\" className={cn('group/menu-item relative', className)} {...props} />;\n});\nSidebarMenuItem.displayName = 'SidebarMenuItem';\n\nconst sidebarMenuButtonVariants = cva(\n [\n 'peer/menu-button',\n 'cursor-pointer',\n 'flex w-full items-center gap-2',\n 'overflow-hidden rounded-md p-2 outline-hidden',\n 'truncate text-left font-normal',\n 'transition-[color,background-color,width,height,padding]',\n 'active:bg-sidebar-accent active:text-sidebar-accent-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'group-has-data-[sidebar=menu-action]/menu-item:pr-8',\n 'aria-disabled:pointer-events-none aria-disabled:opacity-50',\n 'data-[active=true]:bg-sidebar-primary-muted data-[active=true]:text-sidebar-primary',\n 'data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground',\n 'group-data-[collapsible=icon]:size-12! group-data-[collapsible=icon]:p-3! group-data-[collapsible=icon]:gap-3!',\n '[&>svg]:size-6 [&>svg]:shrink-0',\n '[&>span:last-child]:truncate',\n ],\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-10 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nconst SidebarMenuButton = memo(\n ({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n }: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n onClick?: () => void;\n } & VariantProps<typeof sidebarMenuButtonVariants>) => {\n const Comp = asChild ? Slot : 'button';\n const { isMobile, state } = useSidebar();\n\n const handleClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>(\n event => {\n props.onClick?.();\n event.preventDefault();\n event.stopPropagation();\n },\n [props.onClick]\n );\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n onClick={handleClick}\n {...props}\n />\n );\n\n if (!tooltip) return button;\n\n if (typeof tooltip === 'string') {\n tooltip = { children: tooltip };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltip} />\n </Tooltip>\n );\n }\n);\nSidebarMenuButton.displayName = 'SidebarMenuButton';\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-[background-color,color,opacity] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 font-medium text-sidebar-foreground text-xs tabular-nums transition-colors',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n const width = useMemo(() => `${Math.floor(Math.random() * 40) + 50}%`, []);\n\n return (\n <div data-slot=\"sidebar-menu-skeleton\" data-sidebar=\"menu-skeleton\" className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)} {...props}>\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={{ '--skeleton-width': width } as React.CSSProperties}\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-sub-item\" data-sidebar=\"menu-sub-item\" className={cn('group/menu-sub-item relative', className)} {...props} />;\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-[background-color,color] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n CMSLayoutSidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n CMSLayoutMain,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n CMSLayoutProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n // biome-ignore lint/style/useComponentExportOnlyModules: true\n useSidebar,\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { EarthIcon, LogOutIcon, MenuIcon, ShoppingCartIcon, UserRoundIcon } from 'lucide-react';\n\nimport { colorHashLight } from '@customafk/react-toolkit/color-hash';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\n\nimport { useSidebar } from './sidebar';\n\nexport type CMSLayoutUser = {\n /** Display name shown in the header and user dropdown. */\n name: string;\n /** Email address shown below the name in the dropdown. */\n email?: string;\n /** Role or position shown as a muted label in the dropdown. */\n role?: string;\n /** Optional avatar image URL; falls back to a color-hashed icon. */\n avatarUrl?: string;\n};\n\nexport const CMSLayoutHeader: React.FC<{\n i18nText?: string;\n onChangeToEnLocale?: () => void;\n onChangeToViLocale?: () => void;\n user?: CMSLayoutUser;\n onLogout?: () => void;\n logoutLabel?: string;\n}> = ({ i18nText, onChangeToEnLocale, onChangeToViLocale, user, onLogout, logoutLabel = 'Log out' }) => {\n const { toggleSidebar } = useSidebar();\n\n const handleToggleSidebar = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n toggleSidebar();\n },\n [toggleSidebar]\n );\n\n const handleEnLocale = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onChangeToEnLocale?.();\n },\n [onChangeToEnLocale]\n );\n\n const handleViLocale = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onChangeToViLocale?.();\n },\n [onChangeToViLocale]\n );\n\n const avatarBg = user ? colorHashLight.hex(user.name) : undefined;\n\n return (\n <header\n data-slot=\"cms-layout-header\"\n className={cn(\n 'bg-card',\n 'h-(--header-height)',\n 'sm:h-[calc(var(--header-height)+0.5rem)] sm:px-4 sm:pr-6',\n 'absolute inset-x-0 top-0 z-20 gap-2 px-2 pr-4.5',\n 'flex items-center shadow-nav',\n 'transition-[height] ease-linear'\n )}\n >\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n color=\"muted\"\n size=\"icon\"\n className=\"size-10 rounded-full transition-all hover:text-text-positive\"\n onClick={handleToggleSidebar}\n >\n <MenuIcon className=\"size-6!\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n\n <div className=\"flex flex-1 gap-x-2 sm:ml-2.5\">\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n <ShoppingCartIcon size={20} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">Lunas Enterprise</span>\n <span className=\"truncate text-xs\">Established 2025</span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1\">\n {user && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" color=\"muted\" className=\"h-9 gap-2.5 rounded-full px-2 transition-all\">\n <Avatar className=\"size-7 shrink-0\">\n <AvatarImage src={user.avatarUrl} alt={user.name} />\n <AvatarFallback style={{ backgroundColor: avatarBg }}>\n <UserRoundIcon size={14} className=\"text-white\" />\n </AvatarFallback>\n </Avatar>\n <div className=\"hidden flex-col items-start sm:flex\">\n <span className=\"max-w-36 truncate text-xs font-semibold leading-tight text-text-positive\">{user.name}</span>\n {user.email && <span className=\"max-w-36 truncate text-xs leading-tight text-text-positive-weak\">{user.email}</span>}\n </div>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-60\">\n <div className=\"flex flex-col items-center gap-2 px-4 py-4 text-center\">\n <Avatar className=\"size-12\">\n <AvatarImage src={user.avatarUrl} alt={user.name} />\n <AvatarFallback style={{ backgroundColor: avatarBg }}>\n <UserRoundIcon size={22} className=\"text-white\" />\n </AvatarFallback>\n </Avatar>\n <div className=\"flex min-w-0 w-full flex-col items-center gap-0.5\">\n <p className=\"truncate text-sm font-semibold text-text-positive\">{user.name}</p>\n {user.email && <p className=\"truncate text-xs text-text-positive-weak\">{user.email}</p>}\n {user.role && (\n <span className=\"mt-1 w-fit rounded-sm border border-border bg-secondary-muted px-2 py-0.5 text-xs font-medium text-text-positive-weak\">\n {user.role}\n </span>\n )}\n </div>\n </div>\n {onLogout && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem className=\"text-danger focus:text-danger\" onClick={onLogout}>\n <LogOutIcon className=\"size-4\" />\n {logoutLabel}\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {user && (onChangeToEnLocale || onChangeToViLocale) && <div className=\"mx-1 h-5 w-px bg-border\" />}\n\n {(onChangeToEnLocale || onChangeToViLocale) && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button data-slot=\"locale-trigger\" variant=\"ghost\" color=\"muted\" className=\"gap-x-1 rounded-full transition-all hover:text-text-positive\">\n <EarthIcon className=\"size-6!\" />\n {i18nText}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={handleEnLocale}>EN - English</DropdownMenuItem>\n <DropdownMenuItem onClick={handleViLocale}>VI - Vietnamese</DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </header>\n );\n};\n","'use client';\n\nimport { memo } from 'react';\n\nimport { LogOutIcon } from 'lucide-react';\n\nimport { CMSLayoutHeader, type CMSLayoutUser } from './components/header';\nimport {\n CMSLayoutSidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n CMSLayoutMain,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n CMSLayoutProvider,\n} from './components/sidebar';\n\ntype NavItem = {\n /** Unique identifier for the nav item, used as React key and for active-state comparison. */\n id: string;\n /** Human-readable label rendered inside the sidebar button. */\n label: string;\n /** Optional icon element rendered to the left of the label. */\n icon?: React.ReactNode;\n /** Callback fired when the sidebar button is clicked. */\n onClick?: () => void;\n};\n\ntype NavGroup = {\n /** Unique identifier for the group, used as React key. */\n id: string;\n /** Optional section heading rendered above the group's items. */\n label?: string;\n /** Navigation items that belong to this group. */\n items: NavItem[];\n};\n\nexport type { CMSLayoutUser };\n\nexport type CMSLayoutProps = {\n /** Text label used by the header for language-toggle or i18n display. */\n i18nText?: string;\n /** ID of the currently active navigation item; matched against `NavItem.id` to highlight the active button. */\n activeNavItemId?: string;\n /** Sidebar navigation definition; omitting this prop renders an empty sidebar. */\n sidebar?: { groupcontent: NavGroup[] };\n /** Callback fired when the logout button is clicked. */\n onLogout?: () => void;\n /** Callback fired when the user switches the UI locale to English. */\n onChangeToEnLocale?: () => void;\n /** Callback fired when the user switches the UI locale to Vietnamese. */\n onChangeToViLocale?: () => void;\n /**\n * Label displayed on the logout button.\n * @default 'Log out'\n */\n logoutLabel?: string;\n /**\n * Copyright string shown at the bottom of the sidebar.\n * @default `Copyright © <current year>, Lunas.`\n */\n copyright?: string;\n /** Authenticated user shown in the header avatar dropdown. Omit to hide the user menu. */\n user?: CMSLayoutUser;\n};\n\nconst SidebarContentGroupItem = memo<NavItem & { activeNavItemId?: string }>(({ id, label, icon, activeNavItemId, onClick }) => (\n <SidebarMenuItem>\n <SidebarMenuButton isActive={id === activeNavItemId} onClick={onClick}>\n {icon}\n {label}\n </SidebarMenuButton>\n </SidebarMenuItem>\n));\nSidebarContentGroupItem.displayName = 'SidebarContentGroupItem';\n\nconst SidebarContentGroup = memo<React.PropsWithChildren<Omit<NavGroup, 'items'>>>(({ id, label, children }) => (\n <SidebarGroup>\n <SidebarGroupLabel>{label}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>{children}</SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n));\nSidebarContentGroup.displayName = 'SidebarContentGroup';\n\n/**\n * Full-page CMS application shell with a collapsible inset sidebar, header, and main content area.\n *\n * @example\n * ```tsx\n * import { CMSLayout } from '@customafk/lunas-ui/layouts/cms-layout';\n * import { LayoutDashboardIcon } from 'lucide-react';\n *\n * <CMSLayout\n * activeNavItemId=\"dashboard\"\n * sidebar={{\n * groupcontent: [\n * {\n * id: 'main',\n * label: 'Main',\n * items: [\n * { id: 'dashboard', label: 'Dashboard', icon: <LayoutDashboardIcon />, onClick: () => router.push('/') },\n * ],\n * },\n * ],\n * }}\n * onLogout={() => signOut()}\n * >\n * <DashboardPage />\n * </CMSLayout>\n * ```\n */\nexport const CMSLayout: React.FC<React.PropsWithChildren<CMSLayoutProps>> = ({\n i18nText,\n activeNavItemId,\n sidebar,\n children,\n onChangeToEnLocale,\n onChangeToViLocale,\n onLogout,\n logoutLabel = 'Log out',\n copyright = `Copyright © ${new Date().getFullYear()}, Lunas.`,\n user,\n}) => {\n const groups = sidebar?.groupcontent ?? [];\n\n return (\n <CMSLayoutProvider>\n <CMSLayoutHeader\n i18nText={i18nText}\n onChangeToEnLocale={onChangeToEnLocale}\n onChangeToViLocale={onChangeToViLocale}\n user={user}\n onLogout={onLogout}\n logoutLabel={logoutLabel}\n />\n <CMSLayoutSidebar variant=\"inset\" collapsible=\"icon\">\n <SidebarContent>\n {groups.map(group => (\n <SidebarContentGroup key={group.id} id={group.id} label={group.label}>\n {group.items.map(item => (\n <SidebarContentGroupItem\n key={item.id}\n id={item.id}\n activeNavItemId={activeNavItemId}\n label={item.label}\n icon={item.icon}\n onClick={item.onClick}\n />\n ))}\n </SidebarContentGroup>\n ))}\n </SidebarContent>\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton className=\"border border-border\" onClick={onLogout}>\n <LogOutIcon className=\"text-text-positive-weak\" />\n {logoutLabel}\n </SidebarMenuButton>\n </SidebarMenuItem>\n <SidebarMenuItem className=\"mt-2 border-t border-t-border\">\n <p className=\"pt-2 text-center text-xs text-text-positive-subtle\">{copyright}</p>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n </CMSLayoutSidebar>\n <CMSLayoutMain>{children}</CMSLayoutMain>\n </CMSLayoutProvider>\n );\n};\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{i as e,l as t,o as n,r,t as i}from"./dialog-CLDnvNH_.mjs";import{SearchIcon as a}from"lucide-react";import{cn as o}from"@customafk/react-toolkit/utils";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{Command as l}from"cmdk";function u({className:e,...t}){return s(l,{"data-slot":`command`,className:o(`flex size-full flex-col overflow-hidden rounded-md border-border-weak bg-popover text-text-positive`,e),...t})}function d({title:a=`Command Palette`,description:l=`Search for a command to run...`,children:d,className:f,showCloseButton:p=!0,...m}){return c(i,{...m,children:[c(n,{className:`sr-only`,children:[s(t,{children:a}),s(e,{children:l})]}),s(r,{className:o(`overflow-hidden p-0`,f),showCloseButton:p,children:s(u,{className:o(`**:[[cmdk-group-heading]]:text-text-positive-muted`,`**:data-[slot=command-input-wrapper]:h-12`,`**:[[cmdk-group-heading]]:px-2`,`**:[[cmdk-group-heading]]:font-medium`,`**:[[cmdk-group]]:px-2`,`[&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0`,`[&_[cmdk-input-wrapper]_svg]:size-5`,`**:[[cmdk-input]]:h-12`,`**:[[cmdk-item]]:px-2`,`**:[[cmdk-item]]:py-3`,`[&_[cmdk-item]_svg]:size-5`),children:d})})]})}function f({className:e,...t}){return c(`div`,{"data-slot":`command-input-wrapper`,className:`flex h-9 items-center gap-2 border-border-weak border-b px-3`,children:[s(a,{className:`size-4 shrink-0 opacity-50`}),s(l.Input,{"data-slot":`command-input`,className:o(`flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden`,`placeholder:text-text-positive-muted`,`disabled:cursor-not-allowed`,`disabled:opacity-50`,e),...t})]})}function p({className:e,...t}){return s(l.List,{"data-slot":`command-list`,className:o(`max-h-80 scroll-py-1 overflow-y-auto overflow-x-hidden`,e),...t})}function m({...e}){return s(l.Empty,{"data-slot":`command-empty`,className:`py-6 text-center text-sm`,...e})}function h({className:e,...t}){return s(l.Group,{"data-slot":`command-group`,className:o(`text-text-positive`,`overflow-hidden p-1`,`**:[[cmdk-group-heading]]:text-text-positive-weak`,`**:[[cmdk-group-heading]]:px-2`,`**:[[cmdk-group-heading]]:py-1.5`,`**:[[cmdk-group-heading]]:text-xs`,`**:[[cmdk-group-heading]]:font-medium`,e),...t})}function g({className:e,...t}){return s(l.Separator,{"data-slot":`command-separator`,className:o(`-mx-1 h-px bg-border-weak`,e),...t})}function _({className:e,...t}){return s(l.Item,{"data-slot":`command-item`,className:o(`relative flex cursor-pointer select-none items-center gap-2 rounded-md p-2.5 text-sm outline-hidden transition-all duration-300`,`active:ring-border`,`active:opacity-60`,`active:ring-4`,`data-[selected=true]:bg-muted-muted`,`data-[selected=true]:text-text-positive-strong`,`data-[disabled=true]:opacity-50`,`data-[disabled=true]:pointer-events-none`,`[&_svg]:shrink-0`,`[&_svg]:pointer-events-none`,`[&_svg:not([class*='size-'])]:size-4`,`[&_svg:not([class*='text-'])]:text-text-positive-muted`,e),...t})}function v({className:e,...t}){return s(`span`,{"data-slot":`command-shortcut`,className:o(`ml-auto text-text-positive-muted text-xs tracking-widest`,e),...t})}export{f as a,g as c,h as i,v as l,d as n,_ as o,m as r,p as s,u as t};
2
- //# sourceMappingURL=command-D6_CSbwJ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-D6_CSbwJ.mjs","names":["Command","CommandPrimitive"],"sources":["../packages/components/ui/command.tsx"],"sourcesContent":["'use client';\n\nimport { SearchIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog';\n\nimport { Command as CommandPrimitive } from 'cmdk';\n\n/**\n * A cmdk-powered command palette for searching and executing commands.\n *\n * @example\n * ```tsx\n * import {\n * Command, CommandInput, CommandList, CommandEmpty,\n * CommandGroup, CommandItem,\n * } from '@customafk/lunas-ui/ui/command';\n *\n * <Command>\n * <CommandInput placeholder=\"Type a command…\" />\n * <CommandList>\n * <CommandEmpty>No results found.</CommandEmpty>\n * <CommandGroup heading=\"Suggestions\">\n * <CommandItem>Calendar</CommandItem>\n * <CommandItem>Search</CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * ```\n */\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn('flex size-full flex-col overflow-hidden rounded-md border-border-weak bg-popover text-text-positive', className)}\n {...props}\n />\n );\n}\n\n/**\n * A Command palette rendered inside a Dialog overlay.\n *\n * @param title - Accessible title for the dialog (screen-reader only).\n * @param description - Accessible description for the dialog (screen-reader only).\n * @param showCloseButton - Whether to show the built-in close button on the dialog.\n */\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n className,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n className?: string;\n showCloseButton?: boolean;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className={cn('overflow-hidden p-0', className)} showCloseButton={showCloseButton}>\n <Command\n className={cn(\n '**:[[cmdk-group-heading]]:text-text-positive-muted',\n '**:data-[slot=command-input-wrapper]:h-12',\n '**:[[cmdk-group-heading]]:px-2',\n '**:[[cmdk-group-heading]]:font-medium',\n '**:[[cmdk-group]]:px-2',\n '[&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0',\n '[&_[cmdk-input-wrapper]_svg]:size-5',\n '**:[[cmdk-input]]:h-12',\n '**:[[cmdk-item]]:px-2',\n '**:[[cmdk-item]]:py-3',\n '[&_[cmdk-item]_svg]:size-5'\n )}\n >\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Search input with a leading search icon that filters CommandItems in real time. */\nfunction CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"flex h-9 items-center gap-2 border-border-weak border-b px-3\">\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden',\n 'placeholder:text-text-positive-muted',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n className\n )}\n {...props}\n />\n </div>\n );\n}\n\n/** Scrollable list that renders filtered CommandGroups and CommandItems. */\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return <CommandPrimitive.List data-slot=\"command-list\" className={cn('max-h-80 scroll-py-1 overflow-y-auto overflow-x-hidden', className)} {...props} />;\n}\n\n/** Fallback message displayed when no CommandItems match the current search query. */\nfunction CommandEmpty({ ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return <CommandPrimitive.Empty data-slot=\"command-empty\" className=\"py-6 text-center text-sm\" {...props} />;\n}\n\n/** Groups CommandItems under an optional heading label. */\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'text-text-positive',\n 'overflow-hidden p-1',\n '**:[[cmdk-group-heading]]:text-text-positive-weak',\n '**:[[cmdk-group-heading]]:px-2',\n '**:[[cmdk-group-heading]]:py-1.5',\n '**:[[cmdk-group-heading]]:text-xs',\n '**:[[cmdk-group-heading]]:font-medium',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Horizontal dividing line between groups in a CommandList. */\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return <CommandPrimitive.Separator data-slot=\"command-separator\" className={cn('-mx-1 h-px bg-border-weak', className)} {...props} />;\n}\n\n/** A selectable row inside a CommandGroup that is highlighted when active or hovered. */\nfunction CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n 'relative flex cursor-pointer select-none items-center gap-2 rounded-md p-2.5 text-sm outline-hidden transition-all duration-300',\n 'active:ring-border',\n 'active:opacity-60',\n 'active:ring-4',\n 'data-[selected=true]:bg-muted-muted',\n 'data-[selected=true]:text-text-positive-strong',\n 'data-[disabled=true]:opacity-50',\n 'data-[disabled=true]:pointer-events-none',\n '[&_svg]:shrink-0',\n '[&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n \"[&_svg:not([class*='text-'])]:text-text-positive-muted\",\n className\n )}\n {...props}\n />\n );\n}\n\n/** Displays a keyboard shortcut hint aligned to the right of a CommandItem. */\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return <span data-slot=\"command-shortcut\" className={cn('ml-auto text-text-positive-muted text-xs tracking-widest', className)} {...props} />;\n}\n\nexport { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };\n"],"mappings":"gPAgCA,SAASA,EAAQ,CAAE,YAAW,GAAG,GAAwD,CACvF,OACE,EAACC,EAAAA,CACC,YAAU,UACV,UAAW,EAAG,sGAAuG,EAAU,CAC/H,GAAI,GACJ,CAWN,SAAS,EAAc,CACrB,QAAQ,kBACR,cAAc,iCACd,WACA,YACA,kBAAkB,GAClB,GAAG,GAMF,CACD,OACE,EAAC,EAAA,CAAO,GAAI,YACV,EAAC,EAAA,CAAa,UAAU,oBACtB,EAAC,EAAA,CAAA,SAAa,EAAA,CAAoB,CAClC,EAAC,EAAA,CAAA,SAAmB,EAAA,CAAgC,CAAA,EACvC,CACf,EAAC,EAAA,CAAc,UAAW,EAAG,sBAAuB,EAAU,CAAmB,2BAC/E,EAACD,EAAAA,CACC,UAAW,EACT,qDACA,4CACA,iCACA,wCACA,yBACA,oDACA,sCACA,yBACA,wBACA,wBACA,6BACD,CAEA,YACO,EACI,CAAA,EACT,CAKb,SAAS,EAAa,CAAE,YAAW,GAAG,GAA8D,CAClG,OACE,EAAC,MAAA,CAAI,YAAU,wBAAwB,UAAU,yEAC/C,EAAC,EAAA,CAAW,UAAU,6BAAA,CAA+B,CACrD,EAACC,EAAiB,MAAA,CAChB,YAAU,gBACV,UAAW,EACT,yEACA,uCACA,8BACA,sBACA,EACD,CACD,GAAI,GACJ,CAAA,EACE,CAKV,SAAS,EAAY,CAAE,YAAW,GAAG,GAA6D,CAChG,OAAO,EAACA,EAAiB,KAAA,CAAK,YAAU,eAAe,UAAW,EAAG,yDAA0D,EAAU,CAAE,GAAI,GAAS,CAI1J,SAAS,EAAa,CAAE,GAAG,GAA8D,CACvF,OAAO,EAACA,EAAiB,MAAA,CAAM,YAAU,gBAAgB,UAAU,2BAA2B,GAAI,GAAS,CAI7G,SAAS,EAAa,CAAE,YAAW,GAAG,GAA8D,CAClG,OACE,EAACA,EAAiB,MAAA,CAChB,YAAU,gBACV,UAAW,EACT,qBACA,sBACA,oDACA,iCACA,mCACA,oCACA,wCACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAiB,CAAE,YAAW,GAAG,GAAkE,CAC1G,OAAO,EAACA,EAAiB,UAAA,CAAU,YAAU,oBAAoB,UAAW,EAAG,4BAA6B,EAAU,CAAE,GAAI,GAAS,CAIvI,SAAS,EAAY,CAAE,YAAW,GAAG,GAA6D,CAChG,OACE,EAACA,EAAiB,KAAA,CAChB,YAAU,eACV,UAAW,EACT,kIACA,qBACA,oBACA,gBACA,sCACA,iDACA,kCACA,2CACA,mBACA,8BACA,uCACA,yDACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAuC,CAC9E,OAAO,EAAC,OAAA,CAAK,YAAU,mBAAmB,UAAW,EAAG,2DAA4D,EAAU,CAAE,GAAI,GAAS"}
@@ -1,2 +0,0 @@
1
- "use client";import{t as e}from"../paragraph-DYLaQtTV.mjs";import{t}from"../types-B5nyTWtO.mjs";import{t as n}from"../flex-B6YSJzGe.mjs";import{useMemo as r}from"react";import{jsx as i,jsxs as a}from"react/jsx-runtime";import o from"react-country-flag";const s={[t.VIETNAM]:`VN`,[t.USA]:`US`,[t.JAPAN]:`JP`,[t.CHINA]:`CN`,[t.KOREA]:`KR`,[t.SINGAPORE]:`SG`,[t.MALAYSIA]:`MY`,[t.INDONESIA]:`ID`,[t.TAIWAN]:`TW`,[t.THAILAND]:`TH`},c={[t.VIETNAM]:`Vietnam`,[t.USA]:`America`,[t.JAPAN]:`Japan`,[t.CHINA]:`China`,[t.KOREA]:`Korea`,[t.SINGAPORE]:`Singapore`,[t.MALAYSIA]:`Malaysia`,[t.INDONESIA]:`Indonesia`,[t.TAIWAN]:`Taiwan`,[t.THAILAND]:`Thailand`},l=({country:t})=>{let l=r(()=>t?s[t]:`VN`,[t]);return t?a(n,{"data-slot":`country-display`,padding:`none`,className:`px-1`,children:[i(o,{svg:!0,countryCode:l,className:`emojiFlag border`}),i(e,{variant:`sm`,children:c[t]})]}):i(n,{"data-slot":`country-display`,padding:`none`,className:`px-1`,children:i(e,{variant:`muted`,className:`line-clamp-1 text-xs`,children:`No country`})})};export{l as CountryDisplay};
2
- //# sourceMappingURL=country.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"country.mjs","names":["COUNTRY_CODES: Record<ECountry, string>","COUNTRY_LABELS: Record<ECountry, string>","CountryDisplay: React.FC<CountryDisplayProps>"],"sources":["../../packages/components/data-display/country.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport ReactCountryFlag from 'react-country-flag';\n\nimport { ECountry } from '@/types';\n\nimport { Flex } from '../layouts/flex';\nimport { Paragraph } from '../typography/paragraph';\n\nconst COUNTRY_CODES: Record<ECountry, string> = {\n [ECountry.VIETNAM]: 'VN',\n [ECountry.USA]: 'US',\n [ECountry.JAPAN]: 'JP',\n [ECountry.CHINA]: 'CN',\n [ECountry.KOREA]: 'KR',\n [ECountry.SINGAPORE]: 'SG',\n [ECountry.MALAYSIA]: 'MY',\n [ECountry.INDONESIA]: 'ID',\n [ECountry.TAIWAN]: 'TW',\n [ECountry.THAILAND]: 'TH',\n};\n\nconst COUNTRY_LABELS: Record<ECountry, string> = {\n [ECountry.VIETNAM]: 'Vietnam',\n [ECountry.USA]: 'America',\n [ECountry.JAPAN]: 'Japan',\n [ECountry.CHINA]: 'China',\n [ECountry.KOREA]: 'Korea',\n [ECountry.SINGAPORE]: 'Singapore',\n [ECountry.MALAYSIA]: 'Malaysia',\n [ECountry.INDONESIA]: 'Indonesia',\n [ECountry.TAIWAN]: 'Taiwan',\n [ECountry.THAILAND]: 'Thailand',\n};\n\ntype CountryDisplayProps = {\n /** The country enum value to display; renders \"No country\" when `null` or `undefined`. */\n country?: ECountry | null;\n};\n\n/**\n * Displays a country flag (SVG) alongside the country's English name, or a muted \"No country\" label when the value is absent.\n *\n * @example\n * ```tsx\n * import { CountryDisplay } from '@customafk/lunas-ui/data-display/country';\n * import { ECountry } from '@customafk/lunas-ui/types';\n *\n * <CountryDisplay country={ECountry.VIETNAM} />\n * ```\n */\nexport const CountryDisplay: React.FC<CountryDisplayProps> = ({ country }) => {\n const code = useMemo(() => (country ? COUNTRY_CODES[country] : 'VN'), [country]);\n\n if (!country) {\n return (\n <Flex data-slot=\"country-display\" padding=\"none\" className=\"px-1\">\n <Paragraph variant=\"muted\" className=\"line-clamp-1 text-xs\">\n No country\n </Paragraph>\n </Flex>\n );\n }\n\n return (\n <Flex data-slot=\"country-display\" padding=\"none\" className=\"px-1\">\n <ReactCountryFlag svg countryCode={code} className=\"emojiFlag border\" />\n <Paragraph variant=\"sm\">{COUNTRY_LABELS[country]}</Paragraph>\n </Flex>\n );\n};\n"],"mappings":"6PAUA,MAAMA,EAA0C,EAC7C,EAAS,SAAU,MACnB,EAAS,KAAM,MACf,EAAS,OAAQ,MACjB,EAAS,OAAQ,MACjB,EAAS,OAAQ,MACjB,EAAS,WAAY,MACrB,EAAS,UAAW,MACpB,EAAS,WAAY,MACrB,EAAS,QAAS,MAClB,EAAS,UAAW,KACtB,CAEKC,EAA2C,EAC9C,EAAS,SAAU,WACnB,EAAS,KAAM,WACf,EAAS,OAAQ,SACjB,EAAS,OAAQ,SACjB,EAAS,OAAQ,SACjB,EAAS,WAAY,aACrB,EAAS,UAAW,YACpB,EAAS,WAAY,aACrB,EAAS,QAAS,UAClB,EAAS,UAAW,WACtB,CAkBYC,GAAiD,CAAE,aAAc,CAC5E,IAAM,EAAO,MAAe,EAAU,EAAc,GAAW,KAAO,CAAC,EAAQ,CAAC,CAYhF,OAVK,EAWH,EAAC,EAAA,CAAK,YAAU,kBAAkB,QAAQ,OAAO,UAAU,iBACzD,EAAC,EAAA,CAAiB,IAAA,GAAI,YAAa,EAAM,UAAU,oBAAqB,CACxE,EAAC,EAAA,CAAU,QAAQ,cAAM,EAAe,IAAqB,CAAA,EACxD,CAZL,EAAC,EAAA,CAAK,YAAU,kBAAkB,QAAQ,OAAO,UAAU,gBACzD,EAAC,EAAA,CAAU,QAAQ,QAAQ,UAAU,gCAAuB,cAEhD,EACP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-list.mjs","names":["DataList: React.FC<React.PropsWithChildren<DataListProps>>","DataListItem: React.FC<DataListItemProps>"],"sources":["../../packages/components/data-display/data-list.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ntype DataListProps = {\n /** Additional CSS classes applied to the wrapping container. */\n className?: string;\n};\n\n/**\n * A vertical container that stacks `DataListItem` rows with consistent spacing.\n *\n * @example\n * ```tsx\n * import { DataList, DataListItem } from '@customafk/lunas-ui/data-display/data-list';\n *\n * <DataList>\n * <DataListItem label=\"Status\" value=\"Active\" />\n * <DataListItem label=\"Created\" value=\"2024-01-15\" />\n * </DataList>\n * ```\n */\nexport const DataList: React.FC<React.PropsWithChildren<DataListProps>> = ({ children, className }) => {\n return (\n <div data-slot=\"data-list\" className={cn('flex w-full flex-col gap-4', className)}>\n {children}\n </div>\n );\n};\n\ntype DataListItemProps = {\n /** Descriptive label shown to the left of (or above, on mobile) the value. */\n label: string;\n /** The value to display; accepts strings, numbers, or arbitrary React nodes. */\n value: string | number | React.ReactNode;\n /** Minimum width applied to the label column. Defaults to `'120px'`. */\n minLabelWidth?: string;\n /** Additional CSS classes applied to the row container. */\n className?: string;\n};\n\n/**\n * A single label–value row inside a `DataList`, responsive to mobile (stacks vertically) and desktop (inline) layouts.\n *\n * @example\n * ```tsx\n * import { DataListItem } from '@customafk/lunas-ui/data-display/data-list';\n *\n * <DataListItem label=\"Email\" value=\"user@example.com\" />\n * ```\n */\nexport const DataListItem: React.FC<DataListItemProps> = ({ label, value, minLabelWidth = '120px', className }) => {\n return (\n <div data-slot=\"data-list-item\" className={cn('flex w-full flex-col items-start gap-1 md:flex-row md:items-center md:gap-4', className)}>\n <span data-slot=\"data-list-label\" style={{ minWidth: minLabelWidth }} className=\"text-sm text-text-positive-weak\">\n {label}\n </span>\n <span data-slot=\"data-list-value\" className=\"text-sm text-text-positive\">\n {value}\n </span>\n </div>\n );\n};\n"],"mappings":"mHAsBA,MAAaA,GAA8D,CAAE,WAAU,eAEnF,EAAC,MAAA,CAAI,YAAU,YAAY,UAAW,EAAG,6BAA8B,EAAU,CAC9E,YACG,CAyBGC,GAA6C,CAAE,QAAO,QAAO,gBAAgB,QAAS,eAE/F,EAAC,MAAA,CAAI,YAAU,iBAAiB,UAAW,EAAG,8EAA+E,EAAU,WACrI,EAAC,OAAA,CAAK,YAAU,kBAAkB,MAAO,CAAE,SAAU,EAAe,CAAE,UAAU,2CAC7E,GACI,CACP,EAAC,OAAA,CAAK,YAAU,kBAAkB,UAAU,sCACzC,GACI,CAAA,EACH"}
@@ -1,2 +0,0 @@
1
- "use client";import{t as e}from"../date-fY3sUcLp.mjs";import{t}from"../badge-CDGBGq8X.mjs";import{i as n,n as r,r as i,t as a}from"../tooltip-Dxl5Wa8i.mjs";import{jsx as o,jsxs as s}from"react/jsx-runtime";const c=({date:c})=>o(i,{children:s(a,{children:[o(n,{asChild:!0,children:o(t,{"data-slot":`date-tooltip-trigger`,className:`h-fit`,children:o(e,{date:c,format:`medium`,className:`text-xs font-normal text-text-negative`})})}),o(r,{"data-slot":`date-tooltip-content`,children:o(e,{date:c,format:`full`,showTime:!0,className:`font-[Inter]! font-medium`})})]})});export{c as DateTooltip};
2
- //# sourceMappingURL=date-tooltip.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-tooltip.mjs","names":["DateTooltip: React.FC<DateTooltipProps>"],"sources":["../../packages/components/data-display/date-tooltip.tsx"],"sourcesContent":["'use client';\n\nimport { Badge } from '@/components/ui/badge';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { DateDisplay } from './date';\n\ntype DateTooltipProps = {\n /** The date value to display; accepts a `Date` object, an ISO string, or a Unix timestamp (ms). */\n date: Date | string | number;\n};\n\n/**\n * Displays a date as a badge; hovering reveals a tooltip with the full Vietnamese weekday and time.\n *\n * @example\n * ```tsx\n * import { DateTooltip } from '@customafk/lunas-ui/data-display/date-tooltip';\n *\n * <DateTooltip date=\"2024-03-15T14:30:00Z\" />\n * ```\n */\nexport const DateTooltip: React.FC<DateTooltipProps> = ({ date }) => {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Badge data-slot=\"date-tooltip-trigger\" className=\"h-fit\">\n <DateDisplay date={date} format=\"medium\" className=\"text-xs font-normal text-text-negative\" />\n </Badge>\n </TooltipTrigger>\n <TooltipContent data-slot=\"date-tooltip-content\">\n <DateDisplay date={date} format=\"full\" showTime className=\"font-[Inter]! font-medium\" />\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n"],"mappings":"8MAsBA,MAAaA,GAA2C,CAAE,UAEtD,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,EAAA,CAAM,YAAU,uBAAuB,UAAU,iBAChD,EAAC,EAAA,CAAkB,OAAM,OAAO,SAAS,UAAU,0CAA2C,EACxF,EACO,CACjB,EAAC,EAAA,CAAe,YAAU,gCACxB,EAAC,EAAA,CAAkB,OAAM,OAAO,OAAO,SAAA,GAAS,UAAU,6BAA8B,EACzE,CAAA,CAAA,CACT,CAAA,CACM"}
@@ -1 +0,0 @@
1
- "use client";import{t as e}from"../date-fY3sUcLp.mjs";export{e as DateDisplay};
@@ -1 +0,0 @@
1
- {"version":3,"file":"empty.mjs","names":["EmptyDisplay: React.FC<EmptyDisplayProps>"],"sources":["../../packages/components/data-display/empty.tsx"],"sourcesContent":["'use client';\n\nimport { PackageOpenIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ntype EmptyDisplayProps = {\n /** Message shown below the empty-state icon. Defaults to `'No data to display.'`. */\n label?: string;\n /** Additional CSS classes applied to the wrapping container. */\n className?: string;\n};\n\n/**\n * A full-area empty-state placeholder with a package icon and a configurable message.\n *\n * @example\n * ```tsx\n * import { EmptyDisplay } from '@customafk/lunas-ui/data-display/empty';\n *\n * <EmptyDisplay label=\"No results found.\" />\n * ```\n */\nexport const EmptyDisplay: React.FC<EmptyDisplayProps> = ({ label = 'No data to display.', className }) => {\n return (\n <div data-slot=\"empty-display\" className={cn('flex size-full flex-col items-center justify-center gap-2 text-text-positive-muted', className)}>\n <PackageOpenIcon size={52} strokeWidth={1} />\n <p className=\"text-sm\">{label}</p>\n </div>\n );\n};\n"],"mappings":"kKAuBA,MAAaA,GAA6C,CAAE,QAAQ,sBAAuB,eAEvF,EAAC,MAAA,CAAI,YAAU,gBAAgB,UAAW,EAAG,qFAAsF,EAAU,WAC3I,EAAC,EAAA,CAAgB,KAAM,GAAI,YAAa,GAAK,CAC7C,EAAC,IAAA,CAAE,UAAU,mBAAW,GAAU,CAAA,EAC9B"}
@@ -1,2 +0,0 @@
1
- "use client";import{t as e}from"../paragraph-DYLaQtTV.mjs";import{i as t,n,t as r}from"../tooltip-Dxl5Wa8i.mjs";import{jsx as i,jsxs as a}from"react/jsx-runtime";const o=({name:o})=>a(r,{children:[i(t,{"data-slot":`name-display`,children:i(e,{variant:`sm`,className:`line-clamp-2 w-full truncate text-wrap pb-px text-start`,children:o})}),i(n,{align:`start`,className:`max-w-80 whitespace-pre-line text-wrap break-keep`,children:o})]});export{o as NameDisplay};
2
- //# sourceMappingURL=name.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"name.mjs","names":["NameDisplay: React.FC<NameDisplayProps>"],"sources":["../../packages/components/data-display/name.tsx"],"sourcesContent":["'use client';\n\nimport { Paragraph } from '../typography/paragraph';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\ntype NameDisplayProps = {\n /** The full name string to display; shown truncated inline and in full via tooltip. */\n name: string;\n};\n\n/**\n * Renders a clamped, truncated name with a tooltip that reveals the complete text on hover.\n *\n * @example\n * ```tsx\n * import { NameDisplay } from '@customafk/lunas-ui/data-display/name';\n *\n * <NameDisplay name=\"Nguyễn Văn An\" />\n * ```\n */\nexport const NameDisplay: React.FC<NameDisplayProps> = ({ name }) => {\n return (\n <Tooltip>\n <TooltipTrigger data-slot=\"name-display\">\n <Paragraph variant=\"sm\" className=\"line-clamp-2 w-full truncate text-wrap pb-px text-start\">\n {name}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"max-w-80 whitespace-pre-line text-wrap break-keep\">\n {name}\n </TooltipContent>\n </Tooltip>\n );\n};\n"],"mappings":"kKAoBA,MAAaA,GAA2C,CAAE,UAEtD,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,YAAU,wBACxB,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,mEAC/B,GACS,EACG,CACjB,EAAC,EAAA,CAAe,MAAM,QAAQ,UAAU,6DACrC,GACc,CAAA,CAAA,CACT"}
@@ -1,2 +0,0 @@
1
- "use client";import{i as e,n as t,t as n}from"../tooltip-Dxl5Wa8i.mjs";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({value:a})=>i(n,{children:[r(e,{asChild:!0,children:r(`p`,{"data-slot":`phone-number-display`,className:`cursor-default font-number text-sm text-text-positive tabular-nums transition-colors`,children:a.replace(/(\d{3})(\d{3})(\d{4})/,`($1) $2-$3`)})}),r(t,{align:`start`,children:r(`p`,{children:a.slice(1).replace(/(\d{2})(\d{3})(\d{4})/,`(00) (+84) ($1) $2-$3`)})})]});export{a as PhoneNumberDisplay};
2
- //# sourceMappingURL=phone-number.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phone-number.mjs","names":["PhoneNumberDisplay: React.FC<PhoneNumberDisplayProps>"],"sources":["../../packages/components/data-display/phone-number.tsx"],"sourcesContent":["'use client';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\ntype PhoneNumberDisplayProps = {\n /** The raw phone number string (e.g. `'0901234567'`); automatically formatted as `(090) 123-4567` with a +84 tooltip. */\n value: string;\n};\n\n/**\n * Formats and displays a Vietnamese phone number with a tooltip showing the international dialling format.\n *\n * @example\n * ```tsx\n * import { PhoneNumberDisplay } from '@customafk/lunas-ui/data-display/phone-number';\n *\n * <PhoneNumberDisplay value=\"0901234567\" />\n * ```\n */\nexport const PhoneNumberDisplay: React.FC<PhoneNumberDisplayProps> = ({ value }) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <p data-slot=\"phone-number-display\" className=\"cursor-default font-number text-sm text-text-positive tabular-nums transition-colors\">\n {value.replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3')}\n </p>\n </TooltipTrigger>\n <TooltipContent align=\"start\">\n <p>{value.slice(1).replace(/(\\d{2})(\\d{3})(\\d{4})/, '(00) (+84) ($1) $2-$3')}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n"],"mappings":"yHAmBA,MAAaA,GAAyD,CAAE,WAEpE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,IAAA,CAAE,YAAU,uBAAuB,UAAU,gGAC3C,EAAM,QAAQ,wBAAyB,aAAa,EACnD,EACW,CACjB,EAAC,EAAA,CAAe,MAAM,iBACpB,EAAC,IAAA,CAAA,SAAG,EAAM,MAAM,EAAE,CAAC,QAAQ,wBAAyB,wBAAwB,CAAA,CAAK,EAClE,CAAA,CAAA,CACT"}
@@ -1,2 +0,0 @@
1
- "use client";import{n as e}from"../types-B5nyTWtO.mjs";import{t}from"../badge-CDGBGq8X.mjs";import{jsx as n}from"react/jsx-runtime";const r={[e.ADMIN]:`primary`,[e.SUPER_ADMIN]:`danger`,[e.MODERATOR]:`info`,[e.STAFF]:`accent`,[e.USER]:`muted`},i={[e.SUPER_ADMIN]:`Super Admin`,[e.ADMIN]:`Admin`,[e.MODERATOR]:`Moderator`,[e.STAFF]:`Staff`,[e.USER]:`User`},a=({status:e})=>n(t,{"data-slot":`role-badge`,color:r[e],className:`min-w-24 justify-center`,children:i[e]});export{a as RoleBadge};
2
- //# sourceMappingURL=role-badge.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-badge.mjs","names":["ROLE_COLORS: Record<ERole, React.ComponentProps<typeof Badge>['color']>","ROLE_LABELS: Record<ERole, string>","RoleBadge: React.FC<RoleBadgeProps>"],"sources":["../../packages/components/data-display/role-badge.tsx"],"sourcesContent":["'use client';\n\nimport { ERole } from '@/types';\n\nimport { Badge } from '../ui/badge';\n\nconst ROLE_COLORS: Record<ERole, React.ComponentProps<typeof Badge>['color']> = {\n [ERole.ADMIN]: 'primary',\n [ERole.SUPER_ADMIN]: 'danger',\n [ERole.MODERATOR]: 'info',\n [ERole.STAFF]: 'accent',\n [ERole.USER]: 'muted',\n};\n\nconst ROLE_LABELS: Record<ERole, string> = {\n [ERole.SUPER_ADMIN]: 'Super Admin',\n [ERole.ADMIN]: 'Admin',\n [ERole.MODERATOR]: 'Moderator',\n [ERole.STAFF]: 'Staff',\n [ERole.USER]: 'User',\n};\n\ntype RoleBadgeProps = {\n /** The user role enum value that determines the badge label and colour. */\n status: ERole;\n};\n\n/**\n * Renders a colour-coded badge for a user role (e.g. Admin, Staff, User).\n *\n * @example\n * ```tsx\n * import { RoleBadge } from '@customafk/lunas-ui/data-display/role-badge';\n * import { ERole } from '@customafk/lunas-ui/types';\n *\n * <RoleBadge status={ERole.ADMIN} />\n * ```\n */\nexport const RoleBadge: React.FC<RoleBadgeProps> = ({ status }) => {\n return (\n <Badge data-slot=\"role-badge\" color={ROLE_COLORS[status]} className=\"min-w-24 justify-center\">\n {ROLE_LABELS[status]}\n </Badge>\n );\n};\n"],"mappings":"oIAMA,MAAMA,EAA0E,EAC7E,EAAM,OAAQ,WACd,EAAM,aAAc,UACpB,EAAM,WAAY,QAClB,EAAM,OAAQ,UACd,EAAM,MAAO,QACf,CAEKC,EAAqC,EACxC,EAAM,aAAc,eACpB,EAAM,OAAQ,SACd,EAAM,WAAY,aAClB,EAAM,OAAQ,SACd,EAAM,MAAO,OACf,CAkBYC,GAAuC,CAAE,YAElD,EAAC,EAAA,CAAM,YAAU,aAAa,MAAO,EAAY,GAAS,UAAU,mCACjE,EAAY,IACP"}
@@ -1 +0,0 @@
1
- "use client";import{t as e}from"../statistic-cwLwcukn.mjs";export{e as Statistic};
@@ -1 +0,0 @@
1
- "use client";import"../paragraph-DYLaQtTV.mjs";import"../flex-B6YSJzGe.mjs";import"../avatar-fltdRVsJ.mjs";import{t as e}from"../user-DtZy4P9d.mjs";export{e as UserDataDisplay};
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-fY3sUcLp.mjs","names":["DateDisplay: React.FC<DateDisplayProps>"],"sources":["../packages/constants.tsx","../packages/components/data-display/date.tsx"],"sourcesContent":["// Vietnamese locale configuration\nexport const vietnameseLocale = {\n weekdays: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n weekdaysShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n months: ['Tháng 01', 'Tháng 02', 'Tháng 03', 'Tháng 04', 'Tháng 05', 'Tháng 06', 'Tháng 07', 'Tháng 08', 'Tháng 09', 'Tháng 10', 'Tháng 11', 'Tháng 12'],\n monthsShort: ['T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12'],\n};\n\n// Vietnamese holidays\nexport const vietnameseHolidays = {\n '01-01': 'Tết Dương lịch',\n '03-08': 'Quốc tế Phụ nữ',\n '04-30': 'Ngày Giải phóng miền Nam',\n '05-01': 'Quốc tế Lao động',\n '09-02': 'Quốc khánh',\n '10-20': 'Ngày Phụ nữ Việt Nam',\n '11-20': 'Ngày Nhà giáo Việt Nam',\n};\n\n// Time Constants in milliseconds, seconds, and minutes\nexport const TIME_IN_MS = Object.freeze({\n SECOND: 1000,\n MINUTE: 60 * 1000,\n HOUR: 60 * 60 * 1000,\n DAY: 24 * 60 * 60 * 1000,\n WEEK: 7 * 24 * 60 * 60 * 1000,\n MONTH: 30 * 24 * 60 * 60 * 1000, // Approximation for month length = 30 days\n YEAR: 365 * 24 * 60 * 60 * 1000,\n});\n\nexport const TIME_IN_SECONDS = Object.freeze({\n MINUTE: 60,\n HOUR: 60 * 60,\n DAY: 24 * 60 * 60,\n WEEK: 7 * 24 * 60 * 60,\n MONTH: 30 * 24 * 60 * 60,\n YEAR: 365 * 24 * 60 * 60,\n});\n\nexport const TIME_IN_MINUTES = Object.freeze({\n HOUR: 60,\n DAY: 24 * 60,\n WEEK: 7 * 24 * 60,\n MONTH: 30 * 24 * 60,\n});\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\n\nimport { format, isThisMonth, isThisWeek, isThisYear, isToday, isTomorrow, isValid, isYesterday, parseISO } from '@customafk/react-toolkit/date-fns';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { TIME_IN_SECONDS, vietnameseHolidays, vietnameseLocale } from '@/constants';\n\ninterface DateDisplayProps {\n /** The date value to display; accepts a `Date` object, an ISO string, or a Unix timestamp (ms). */\n date: Date | string | number;\n /**\n * Controls how the date is formatted.\n * - `'short'` — `15/03/24`\n * - `'medium'` — `15/03/2024` (default)\n * - `'long'` — `15 tháng 3, 2024`\n * - `'full'` — `Thứ Sáu, ngày 15 tháng 3 năm 2024`\n * - `'relative'` — `2 giờ trước`\n * - `'datetime'` — `15/03/2024 14:30`\n * - `'time'` — `14:30`\n * - `'smart'` — auto-selects the most human-readable format based on recency\n */\n format?:\n | 'short' // 15/03/24\n | 'medium' // 15/03/2024\n | 'long' // 15 tháng 3, 2024\n | 'full' // Thứ Sáu, ngày 15 tháng 3 năm 2024\n | 'relative' // 2 giờ trước\n | 'datetime' // 15/03/2024 14:30\n | 'time' // 14:30\n | 'smart'; // auto-selects format based on recency\n /** When `true`, appends any recognised Vietnamese public holiday name to the formatted date. Defaults to `false`. */\n showHoliday?: boolean;\n /** When `true`, appends the time component to the formatted output. Defaults to `false`. */\n showTime?: boolean;\n /** Additional CSS classes applied to the `<time>` element. */\n className?: string;\n /** Custom HTML `title` attribute; defaults to the full ISO datetime string. */\n title?: string;\n}\n\n/**\n * Renders a formatted date using Vietnamese locale conventions inside a semantic `<time>` element.\n *\n * @example\n * ```tsx\n * import { DateDisplay } from '@customafk/lunas-ui/data-display/date';\n *\n * <DateDisplay date=\"2024-03-15T14:30:00Z\" format=\"medium\" showTime />\n * ```\n */\nexport const DateDisplay: React.FC<DateDisplayProps> = ({\n date,\n format: formatType = 'medium',\n showHoliday = false,\n showTime = false,\n className = '',\n title,\n}) => {\n const parsedDate = useMemo(() => {\n try {\n if (date instanceof Date) return isValid(date) ? date : null;\n if (typeof date === 'string') {\n const parsed = parseISO(date);\n return isValid(parsed) ? parsed : new Date(date);\n }\n if (typeof date === 'number') {\n const parsed = new Date(date);\n return isValid(parsed) ? parsed : null;\n }\n return null;\n } catch {\n return null;\n }\n }, [date]);\n\n const formatRelativeTime = useCallback((d: Date): string => {\n const diffInSeconds = Math.floor((Date.now() - d.getTime()) / 1000);\n if (diffInSeconds < 60) return 'Vừa xong';\n if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.MINUTE)} phút trước`;\n if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.HOUR)} giờ trước`;\n if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.DAY)} ngày trước`;\n if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.WEEK)} tuần trước`;\n if (diffInSeconds < 31536000) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.MONTH)} tháng trước`;\n return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.YEAR)} năm trước`;\n }, []);\n\n const getVietnameseWeekday = useCallback((d: Date, short = false): string => {\n return short ? vietnameseLocale.weekdaysShort[d.getDay()] : vietnameseLocale.weekdays[d.getDay()];\n }, []);\n\n const getVietnameseMonth = useCallback((d: Date, short = false): string => {\n return short ? vietnameseLocale.monthsShort[d.getMonth()] : vietnameseLocale.months[d.getMonth()];\n }, []);\n\n const getHoliday = useCallback((d: Date): string | null => {\n const monthDay = format(d, 'MM-dd') as keyof typeof vietnameseHolidays;\n return vietnameseHolidays[monthDay] || null;\n }, []);\n\n const getSmartFormat = useCallback(\n (d: Date): string => {\n if (isToday(d)) return showTime ? `Hôm nay ${format(d, 'HH:mm')}` : 'Hôm nay';\n if (isYesterday(d)) return showTime ? `Hôm qua ${format(d, 'HH:mm')}` : 'Hôm qua';\n if (isTomorrow(d)) return showTime ? `Ngày mai ${format(d, 'HH:mm')}` : 'Ngày mai';\n if (isThisWeek(d)) {\n const weekday = getVietnameseWeekday(d);\n return showTime ? `${weekday} ${format(d, 'HH:mm')}` : weekday;\n }\n if (isThisMonth(d)) {\n const day = format(d, 'd');\n return showTime ? `${day}/${format(d, 'M')} ${format(d, 'HH:mm')}` : `${day}/${format(d, 'M')}`;\n }\n if (isThisYear(d)) return showTime ? format(d, 'd/M HH:mm') : format(d, 'd/M');\n return showTime ? format(d, 'd/M/yyyy HH:mm') : format(d, 'd/M/yyyy');\n },\n [getVietnameseWeekday, showTime]\n );\n\n const formatDate = useCallback(\n (d: Date, type: string): string => {\n const timeStr = showTime ? format(d, ', HH:mm:ss') : '';\n switch (type) {\n case 'short':\n return format(d, 'd/M/yy') + timeStr;\n case 'medium':\n return format(d, 'dd/MM/yyyy') + timeStr;\n case 'long':\n return `${format(d, 'd')} ${getVietnameseMonth(d)} ${format(d, 'yyyy')}` + timeStr;\n case 'full':\n return `${getVietnameseWeekday(d)}, ngày ${format(d, 'd')} ${getVietnameseMonth(d)} năm ${format(d, 'yyyy')}` + timeStr;\n case 'relative':\n return formatRelativeTime(d);\n case 'datetime':\n return format(d, 'd/M/yyyy HH:mm');\n case 'time':\n return format(d, 'HH:mm');\n case 'smart':\n return getSmartFormat(d);\n default:\n return format(d, 'd/M/yyyy') + timeStr;\n }\n },\n [getSmartFormat, getVietnameseMonth, getVietnameseWeekday, formatRelativeTime, showTime]\n );\n\n if (!parsedDate) {\n return <span className={cn('text-sm text-text-positive-subtle', className)}>--/--/----</span>;\n }\n\n const formattedDate = formatDate(parsedDate, formatType);\n const holiday = showHoliday ? getHoliday(parsedDate) : null;\n const displayText = holiday ? `${formattedDate} (${holiday})` : formattedDate;\n const tooltipTitle = title || format(parsedDate, 'EEEE, d MMMM yyyy HH:mm:ss');\n\n return (\n <time\n data-slot=\"date-display\"\n dateTime={parsedDate.toISOString()}\n className={cn('tabular-nums text-xs text-text-positive-weak transition-colors', className)}\n title={tooltipTitle}\n >\n {displayText}\n </time>\n );\n};\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./heading-De4Pn3mZ.mjs";import{n as t}from"./paragraph-DYLaQtTV.mjs";import{t as n}from"./close-_UHFeiLS.mjs";import{cn as r}from"@customafk/react-toolkit/utils";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{Dialog as o}from"radix-ui";function s({...e}){return i(o.Root,{"data-slot":`dialog`,...e})}function c({...e}){return i(o.Trigger,{"data-slot":`dialog-trigger`,...e})}function l({...e}){return i(o.Portal,{"data-slot":`dialog-portal`,...e})}function u({...e}){return i(o.Close,{"data-slot":`dialog-close`,...e})}function d({className:e,...t}){return i(o.Overlay,{"data-slot":`dialog-overlay`,className:r(`fixed inset-0 z-50 bg-black/50`,`data-[state=open]:fade-in-0 data-[state=open]:animate-in`,`data-[state=closed]:fade-out-0 data-[state=closed]:animate-out`,e),...t})}function f({className:e,children:t,showCloseButton:s=!0,...c}){return a(l,{children:[i(d,{}),a(o.Content,{"data-slot":`dialog-content`,className:r(`fixed top-1/2 left-1/2 z-50 -translate-x-1/2 -translate-y-1/2`,`grid w-full max-w-[calc(100%-2rem)] bg-background`,`max-h-[85dvh] gap-4 rounded-2xl p-6 shadow-dialog outline-none duration-400`,`sm:max-w-lg`,`data-[state=open]:fade-in-0 data-[state=open]:zoom-in-80 data-[state=open]:animate-in`,`data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-80 data-[state=closed]:animate-out`,e),onOpenAutoFocus:e=>{e.preventDefault()},...c,children:[t,s&&i(o.Close,{"data-slot":`dialog-close`,tabIndex:-1,asChild:!0,className:`absolute top-3 right-3`,children:i(n,{})})]})]})}function p({className:e,...t}){return i(`div`,{"data-slot":`dialog-header`,className:r(`flex flex-col gap-2 text-center sm:text-left`,e),...t})}function m({className:e,...t}){return i(`div`,{"data-slot":`dialog-footer`,className:r(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,e),...t})}function h({className:t,...n}){return i(o.Title,{"data-slot":`dialog-title`,className:r(e({level:`h3`}),t),...n})}function g({className:e,...n}){return i(o.Description,{"data-slot":`dialog-description`,className:r(t({variant:`muted`}),e),...n})}export{m as a,l as c,g as i,h as l,u as n,p as o,f as r,d as s,s as t,c as u};
2
- //# sourceMappingURL=dialog-CLDnvNH_.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog-CLDnvNH_.mjs","names":["Dialog","DialogPrimitive"],"sources":["../packages/components/ui/dialog.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { headingVariants } from '../typography/heading';\nimport { paragraphVariants } from '../typography/paragraph';\nimport { CloseButton } from './buttons/close';\n\n/**\n * Accessible modal dialog built on Radix UI's Dialog primitives with animated overlay, close button, and responsive sizing.\n *\n * @example\n * ```tsx\n * import {\n * Dialog, DialogTrigger, DialogContent,\n * DialogHeader, DialogTitle, DialogDescription, DialogFooter,\n * } from '@customafk/lunas-ui/ui/dialog';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n *\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button>Open dialog</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Confirm action</DialogTitle>\n * <DialogDescription>This cannot be undone.</DialogDescription>\n * </DialogHeader>\n * <DialogFooter>\n * <Button variant=\"outline\">Cancel</Button>\n * <Button>Confirm</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n */\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\n/** Element that opens the dialog when clicked; typically wrapped with `asChild` around a `Button`. */\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\n/** Renders dialog overlay and content into a portal outside the normal React tree. */\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\n/** Button that closes the dialog; can be composed with `asChild` to use a custom element. */\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\n/** Semi-transparent backdrop rendered behind the dialog panel with fade-in/out animation. */\nfunction DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/50',\n 'data-[state=open]:fade-in-0 data-[state=open]:animate-in',\n 'data-[state=closed]:fade-out-0 data-[state=closed]:animate-out',\n className\n )}\n {...props}\n />\n );\n}\n\n/**\n * Animated dialog panel centred on screen; includes `DialogOverlay` and an optional close button.\n *\n * @param showCloseButton - When `true` (default), renders a `CloseButton` in the top-right corner.\n */\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n /** When `true` (default), renders an `×` close button fixed to the top-right corner of the panel. */\n showCloseButton?: boolean;\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed top-1/2 left-1/2 z-50 -translate-x-1/2 -translate-y-1/2',\n 'grid w-full max-w-[calc(100%-2rem)] bg-background',\n 'max-h-[85dvh] gap-4 rounded-2xl p-6 shadow-dialog outline-none duration-400',\n 'sm:max-w-lg',\n 'data-[state=open]:fade-in-0 data-[state=open]:zoom-in-80 data-[state=open]:animate-in',\n 'data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-80 data-[state=closed]:animate-out',\n className\n )}\n onOpenAutoFocus={event => {\n // Prevents focus from shifting to the content when the dialog opens, which can cause layout shift if the content includes autofocusable elements.\n event.preventDefault();\n }}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" tabIndex={-1} asChild className=\"absolute top-3 right-3\">\n <CloseButton />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\n/** Layout wrapper for the dialog title and description, stacked vertically with left alignment on wider screens. */\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"dialog-header\" className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />;\n}\n\n/** Layout wrapper for dialog action buttons, stacked on mobile and right-aligned in a row on wider screens. */\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"dialog-footer\" className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)} {...props} />;\n}\n\n/** Accessible heading for the dialog panel, styled with the h3 heading variant and announced by screen readers. */\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return <DialogPrimitive.Title data-slot=\"dialog-title\" className={cn(headingVariants({ level: 'h3' }), className)} {...props} />;\n}\n\n/** Muted supporting text that describes the dialog's purpose; read by screen readers alongside the title. */\nfunction DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return <DialogPrimitive.Description data-slot=\"dialog-description\" className={cn(paragraphVariants({ variant: 'muted' }), className)} {...props} />;\n}\n\nexport { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };\n"],"mappings":"yQAqCA,SAASA,EAAO,CAAE,GAAG,GAA4D,CAC/E,OAAO,EAACC,EAAgB,KAAA,CAAK,YAAU,SAAS,GAAI,GAAS,CAI/D,SAAS,EAAc,CAAE,GAAG,GAA+D,CACzF,OAAO,EAACA,EAAgB,QAAA,CAAQ,YAAU,iBAAiB,GAAI,GAAS,CAI1E,SAAS,EAAa,CAAE,GAAG,GAA8D,CACvF,OAAO,EAACA,EAAgB,OAAA,CAAO,YAAU,gBAAgB,GAAI,GAAS,CAIxE,SAAS,EAAY,CAAE,GAAG,GAA6D,CACrF,OAAO,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,GAAI,GAAS,CAItE,SAAS,EAAc,CAAE,YAAW,GAAG,GAA+D,CACpG,OACE,EAACA,EAAgB,QAAA,CACf,YAAU,iBACV,UAAW,EACT,iCACA,2DACA,iEACA,EACD,CACD,GAAI,GACJ,CASN,SAAS,EAAc,CACrB,YACA,WACA,kBAAkB,GAClB,GAAG,GAIF,CACD,OACE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,EAAA,CAAgB,CACjB,EAACA,EAAgB,QAAA,CACf,YAAU,iBACV,UAAW,EACT,gEACA,oDACA,8EACA,cACA,wFACA,iGACA,EACD,CACD,gBAAiB,GAAS,CAExB,EAAM,gBAAgB,EAExB,GAAI,YAEH,EACA,GACC,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,SAAU,GAAI,QAAA,GAAQ,UAAU,kCAC9E,EAAC,EAAA,EAAA,CAAc,EACO,CAAA,EAEF,CAAA,CAAA,CACb,CAKnB,SAAS,EAAa,CAAE,YAAW,GAAG,GAAsC,CAC1E,OAAO,EAAC,MAAA,CAAI,YAAU,gBAAgB,UAAW,EAAG,+CAAgD,EAAU,CAAE,GAAI,GAAS,CAI/H,SAAS,EAAa,CAAE,YAAW,GAAG,GAAsC,CAC1E,OAAO,EAAC,MAAA,CAAI,YAAU,gBAAgB,UAAW,EAAG,yDAA0D,EAAU,CAAE,GAAI,GAAS,CAIzI,SAAS,EAAY,CAAE,YAAW,GAAG,GAA6D,CAChG,OAAO,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,UAAW,EAAG,EAAgB,CAAE,MAAO,KAAM,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS,CAIlI,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAmE,CAC5G,OAAO,EAACA,EAAgB,YAAA,CAAY,YAAU,qBAAqB,UAAW,EAAG,EAAkB,CAAE,QAAS,QAAS,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS"}
@@ -1,2 +0,0 @@
1
- "use client";import"../button.variants-DkMqWB8G.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import{AlertDialog as e,AlertDialogAction as t,AlertDialogCancel as n,AlertDialogContent as r,AlertDialogDescription as i,AlertDialogFooter as a,AlertDialogHeader as o,AlertDialogTitle as s}from"../ui/alert-dialog.mjs";import{TriangleAlert as c}from"lucide-react";import{useCallback as l}from"react";import{jsx as u,jsxs as d}from"react/jsx-runtime";const f=({open:f,isLoading:p=!1,title:m,description:h,cancelText:g=`Cancel`,submitText:_=`Confirm`,descriptionClassName:v,onOpenChange:y,onConfirm:b})=>{let x=l(e=>{e.preventDefault(),e.stopPropagation(),b?.()},[b]);return u(e,{open:f,onOpenChange:y,children:d(r,{className:`p-4 pb-5`,children:[d(o,{className:`gap-2`,children:[d(s,{className:`inline-flex items-center gap-x-1`,children:[u(c,{size:20}),u(`p`,{children:m})]}),u(i,{className:v,children:h})]}),d(a,{children:[u(n,{children:g}),u(t,{type:`button`,className:`min-h-9 w-full md:w-24`,onClick:x,children:p?u(`div`,{className:`absolute inset-0 flex items-center justify-center`,children:u(`div`,{className:`loader-spinner text-text-positive-weak`})}):_})]})]})})};export{f as ConfirmDialog};
2
- //# sourceMappingURL=confirm-dialog.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"confirm-dialog.mjs","names":["ConfirmDialog: React.FC<ConfirmDialogProps>"],"sources":["../../packages/components/dialogs/confirm-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\n\nimport { TriangleAlert } from 'lucide-react';\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../ui/alert-dialog';\n\n/**\n * Props for the {@link ConfirmDialog} component.\n */\nexport type ConfirmDialogProps = {\n /**\n * Controls whether the dialog is currently open.\n * This is a **controlled** prop — pair it with `onOpenChange` to manage state.\n */\n open?: boolean;\n\n /**\n * When `true`, shows an animated spinner inside the confirm button and\n * prevents double-submission. Typically bound to a mutation's pending state.\n *\n * @default false\n */\n isLoading?: boolean;\n\n /**\n * The dialog heading text. Keep it short and action-oriented,\n * e.g. `\"Delete user?\"` or `\"Unsaved changes\"`.\n */\n title: string;\n\n /**\n * Body copy explaining what will happen if the user confirms.\n * For irreversible actions, state explicitly that the action cannot be undone.\n */\n description: string;\n\n /**\n * Label for the cancel / dismiss button.\n *\n * @default \"Cancel\"\n */\n cancelText?: string;\n\n /**\n * Label for the confirm / submit button.\n *\n * @default \"Confirm\"\n */\n submitText?: string;\n\n /**\n * Additional class names applied to the `AlertDialogDescription` element.\n * Useful for overriding text color or font size for specific contexts.\n */\n descriptionClassName?: string;\n\n /**\n * Callback fired when the dialog open state changes.\n * Required to implement controlled open / close behavior.\n *\n * @param open - `true` when opening, `false` when closing.\n */\n onOpenChange?: (open: boolean) => void;\n\n /**\n * Async-safe callback fired when the user clicks the confirm button.\n * Supports both synchronous and `Promise`-returning functions.\n *\n * The dialog does **not** auto-close after `onConfirm` resolves — the caller\n * is responsible for setting `open` to `false` once the operation completes.\n *\n * @example\n * ```tsx\n * onConfirm={async () => {\n * await deleteUser(userId);\n * setOpen(false);\n * }}\n * ```\n */\n onConfirm?: () => Promise<void> | void;\n};\n\n/**\n * A controlled confirmation dialog for destructive or irreversible actions.\n *\n * Built on Radix UI's `AlertDialog` primitive. Renders a warning icon, title,\n * description, and Cancel / Confirm buttons. The confirm button supports an\n * async loading state to prevent double-submission.\n *\n * **Import:** `import { ConfirmDialog } from '@customafk/lunas-ui/dialogs/confirm-dialog'`\n *\n * @example Delete confirmation with React state\n * ```tsx\n * import { useState } from 'react';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n * import { ConfirmDialog } from '@customafk/lunas-ui/dialogs/confirm-dialog';\n *\n * export function DeleteUserButton({ userId }: { userId: string }) {\n * const [open, setOpen] = useState(false);\n * const [isPending, setIsPending] = useState(false);\n *\n * const handleDelete = async () => {\n * setIsPending(true);\n * try {\n * await deleteUser(userId);\n * setOpen(false);\n * } finally {\n * setIsPending(false);\n * }\n * };\n *\n * return (\n * <>\n * <Button variant=\"outline\" color=\"danger\" onClick={() => setOpen(true)}>\n * Delete user\n * </Button>\n * <ConfirmDialog\n * open={open}\n * title=\"Delete user?\"\n * description=\"This action is permanent and cannot be undone.\"\n * submitText=\"Yes, delete\"\n * isLoading={isPending}\n * onOpenChange={setOpen}\n * onConfirm={handleDelete}\n * />\n * </>\n * );\n * }\n * ```\n *\n * @example With TanStack Query mutation\n * ```tsx\n * import { ConfirmDialog } from '@customafk/lunas-ui/dialogs/confirm-dialog';\n * import { useMutation } from '@tanstack/react-query';\n *\n * export function ArchiveDialog({ open, onOpenChange, id }: Props) {\n * const { mutateAsync, isPending } = useMutation({ mutationFn: archiveItem });\n *\n * return (\n * <ConfirmDialog\n * open={open}\n * title=\"Archive item?\"\n * description=\"The item will be hidden but can be restored later.\"\n * submitText=\"Archive\"\n * isLoading={isPending}\n * onOpenChange={onOpenChange}\n * onConfirm={() => mutateAsync(id).then(() => onOpenChange(false))}\n * />\n * );\n * }\n * ```\n */\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n open,\n isLoading = false,\n title,\n description,\n cancelText = 'Cancel',\n submitText = 'Confirm',\n descriptionClassName,\n onOpenChange,\n onConfirm,\n}) => {\n const handleConfirm = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onConfirm?.();\n },\n [onConfirm]\n );\n\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"p-4 pb-5\">\n <AlertDialogHeader className=\"gap-2\">\n <AlertDialogTitle className=\"inline-flex items-center gap-x-1\">\n <TriangleAlert size={20} />\n <p>{title}</p>\n </AlertDialogTitle>\n <AlertDialogDescription className={descriptionClassName}>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{cancelText}</AlertDialogCancel>\n <AlertDialogAction type=\"button\" className=\"min-h-9 w-full md:w-24\" onClick={handleConfirm}>\n {isLoading ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"loader-spinner text-text-positive-weak\" />\n </div>\n ) : (\n submitText\n )}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n"],"mappings":"qdAmKA,MAAaA,GAA+C,CAC1D,OACA,YAAY,GACZ,QACA,cACA,aAAa,SACb,aAAa,UACb,uBACA,eACA,eACI,CACJ,IAAM,EAAgB,EACnB,GAAwB,CACvB,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,CACnB,KAAa,EAEf,CAAC,EAAU,CACZ,CAED,OACE,EAAC,EAAA,CAAkB,OAAoB,wBACrC,EAAC,EAAA,CAAmB,UAAU,qBAC5B,EAAC,EAAA,CAAkB,UAAU,kBAC3B,EAAC,EAAA,CAAiB,UAAU,6CAC1B,EAAC,EAAA,CAAc,KAAM,GAAA,CAAM,CAC3B,EAAC,IAAA,CAAA,SAAG,EAAA,CAAU,CAAA,EACG,CACnB,EAAC,EAAA,CAAuB,UAAW,WAAuB,GAAqC,CAAA,EAC7E,CACpB,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SAAmB,EAAA,CAA+B,CACnD,EAAC,EAAA,CAAkB,KAAK,SAAS,UAAU,yBAAyB,QAAS,WAC1E,EACC,EAAC,MAAA,CAAI,UAAU,6DACb,EAAC,MAAA,CAAI,UAAU,yCAAA,CAA2C,EACtD,CAEN,GAEgB,CAAA,CAAA,CACF,CAAA,EACD,EACT"}
@@ -1 +0,0 @@
1
- "use client";import"../../../button.variants-DkMqWB8G.mjs";import"../../../button-CCVJTHBI.mjs";import"../../../skeleton-C51IdOfK.mjs";import"../../../tooltip-Dxl5Wa8i.mjs";import"../../../separator-D3Gmkxzq.mjs";import"../../../sheet-BFlIfNaA.mjs";import{C as e,S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y,v as b,x,y as S}from"../../../sidebar-ChtCyu-n.mjs";export{v as DetailDialogSidebarContent,p as DetailDialogSidebarFooter,g as DetailDialogSidebarGroup,u as DetailDialogSidebarGroupAction,r as DetailDialogSidebarGroupContent,m as DetailDialogSidebarGroupLabel,_ as DetailDialogSidebarHeader,a as DetailDialogSidebarMenu,d as DetailDialogSidebarMenuAction,y as DetailDialogSidebarMenuBadge,o as DetailDialogSidebarMenuButton,s as DetailDialogSidebarMenuItem,h as DetailDialogSidebarMenuSkeleton,f as DetailDialogSidebarMenuSub,l as DetailDialogSidebarMenuSubButton,c as DetailDialogSidebarMenuSubItem,n as DetailDialogSidebarRail,b as DetailDialogSidebarSeparator,S as DetailDialogSidebarTrigger,i as Sidebar,x as SidebarInset,t as SidebarProvider,e as useSidebar};
@@ -1,2 +0,0 @@
1
- "use client";import"../../button.variants-DkMqWB8G.mjs";import"../../button-CCVJTHBI.mjs";import"../../skeleton-C51IdOfK.mjs";import{t as e}from"../../flex-B6YSJzGe.mjs";import{t}from"../../date-fY3sUcLp.mjs";import"../../tooltip-Dxl5Wa8i.mjs";import{Title as n}from"../../typography/title.mjs";import"../../separator-D3Gmkxzq.mjs";import"../../sheet-BFlIfNaA.mjs";import{S as r,b as i,c as a,d as o,f as s,n as c,s as l,t as u,y as d}from"../../sidebar-ChtCyu-n.mjs";import{CalendarIcon as f,CatIcon as p,XIcon as m}from"lucide-react";import{useCallback as h}from"react";import{cn as g}from"@customafk/react-toolkit/utils";import{jsx as _,jsxs as v}from"react/jsx-runtime";import{Dialog as y}from"radix-ui";const b=({open:b,isLoading:x,title:S,createdAt:C,onOpenChange:w,sidebar:T,children:E})=>{let{content:D,footer:O}=T||{},k=h(e=>{e.preventDefault(),e.stopPropagation()},[]);return _(y.Root,{"data-slot":`detail-dialog`,open:b,onOpenChange:w,children:v(y.Portal,{"data-slot":`detail-dialog-portal`,children:[_(y.Overlay,{"data-slot":`detail-dialog-overlay`,className:`fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`}),_(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center`,children:v(y.Content,{"data-slot":`dialog-content`,className:g(`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-80 data-[state=open]:zoom-in-80`,`relative z-50 grid`,`gap-4 overflow-hidden rounded-none border-none bg-background p-0 shadow-dialog outline-none duration-200`,`h-full max-h-dvh w-full max-w-svw`,`sm:rounded-lg`,`sm:max-w-lg`,`md:max-h-[calc(100dvh-2rem)]`,`md:max-w-[calc(100svw-2rem)]`),onInteractOutside:k,children:[v(r,{children:[v(i,{collapsible:`icon`,children:[_(l,{children:_(a,{children:_(s,{children:v(o,{size:`lg`,tabIndex:-1,children:[_(`div`,{className:`flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground`,children:_(p,{size:16})}),v(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[_(`span`,{className:`truncate font-medium`,children:T?.title||`Detail Dialog`}),_(`span`,{className:`truncate text-xs`,children:`Lunas Enterprise`})]})]})})})}),_(u,{children:D}),_(c,{children:O})]}),_(`main`,{"data-slot":`detail-dialog-main`,className:`relative h-full flex-1`,children:v(e,{padding:`none`,gap:`none`,vertical:!0,align:`stretch`,className:`absolute inset-0 size-full`,children:[v(`header`,{className:`flex w-full flex-0 items-start gap-x-2.5 border-b border-border-weak bg-card py-2.5 pr-12 pl-2`,children:[_(d,{}),v(e,{vertical:!0,align:`start`,padding:`none`,width:`null`,wrap:!1,className:`flex-1 gap-0`,children:[_(n,{level:5,className:`line-clamp-1 truncate text-wrap`,children:S||`Detail Dialog`}),!!C&&v(e,{padding:`none`,className:`relative items-center text-text-positive-weak`,children:[_(f,{size:12}),_(t,{showTime:!0,showHoliday:!0,date:C,format:`full`})]})]})]}),x?_(e,{justify:`center`,className:`inset-shadow-sm w-full flex-1 bg-muted-muted`,children:_(`div`,{className:`loader`})}):_(`section`,{"data-slot":`detail-dialog-body`,className:`relative inset-shadow-sm flex flex-1 snap-y flex-col gap-0 overflow-y-auto bg-white`,children:E})]})})]}),_(y.Close,{"data-slot":`dialog-close`,tabIndex:-1,asChild:!0,className:`absolute top-3 right-3`,children:_(`button`,{className:`flex cursor-pointer items-center justify-center rounded-full p-2 text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive active:bg-muted-weak active:text-text-positive-strong disabled:pointer-events-none disabled:opacity-60`,children:_(m,{size:24})})})]})})]})})};export{b as DetailDialog};
2
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["DetailDialog: React.FC<React.PropsWithChildren<DetailDialogProps>>","DialogPrimitive"],"sources":["../../../packages/components/dialogs/detail-dialog/index.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\n\nimport { CalendarIcon, CatIcon, XIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\n\nimport { DateDisplay } from '@/components/data-display/date';\nimport { Flex } from '@/components/layouts/flex';\nimport { Title } from '@/components/typography/title';\n\nimport {\n DetailDialogSidebarContent,\n DetailDialogSidebarFooter,\n DetailDialogSidebarHeader,\n DetailDialogSidebarMenu,\n DetailDialogSidebarMenuButton,\n DetailDialogSidebarMenuItem,\n DetailDialogSidebarTrigger,\n Sidebar,\n SidebarProvider,\n} from './components/sidebar';\n\ntype DetailDialogSidebar = {\n /** Title shown in the collapsible sidebar header. Defaults to `'Detail Dialog'`. */\n title?: string;\n /** Arbitrary content rendered inside the sidebar scrollable area. */\n content?: React.ReactNode;\n /** Arbitrary content rendered at the bottom of the sidebar footer. */\n footer?: React.ReactNode;\n};\n\nexport type DetailDialogProps = {\n /** Controls whether the dialog is open. */\n open?: boolean;\n /** When `true`, replaces the main content area with a centered loading spinner. */\n isLoading?: boolean;\n /** Primary title displayed in the dialog header. */\n title: string;\n /** ISO string, `Date` object, or Unix timestamp shown as a formatted creation date below the title. */\n createdAt?: string | Date | number | null;\n /** Optional sidebar configuration — title, body content, and footer content. */\n sidebar?: DetailDialogSidebar;\n /** Callback invoked when the dialog open state changes. */\n onOpenChange?: (open: boolean) => void;\n};\n\n/**\n * Full-screen detail dialog with a collapsible sidebar, a header with creation date, and a scrollable content area.\n *\n * @example\n * ```tsx\n * import { DetailDialog } from '@customafk/lunas-ui/dialogs/detail-dialog';\n *\n * <DetailDialog\n * open={open}\n * title=\"Order #1234\"\n * createdAt=\"2024-01-15T09:00:00Z\"\n * sidebar={{ title: 'Navigation', content: <nav>...</nav> }}\n * onOpenChange={setOpen}\n * >\n * <p>Detail content goes here.</p>\n * </DetailDialog>\n * ```\n */\nexport const DetailDialog: React.FC<React.PropsWithChildren<DetailDialogProps>> = ({ open, isLoading, title, createdAt, onOpenChange, sidebar, children }) => {\n const { content: SidebarContent, footer: SidebarFooter } = sidebar || {};\n\n const handleInteractOutside = useCallback<NonNullable<React.ComponentProps<typeof DialogPrimitive.Content>['onInteractOutside']>>(event => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n return (\n <DialogPrimitive.Root data-slot=\"detail-dialog\" open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal data-slot=\"detail-dialog-portal\">\n <DialogPrimitive.Overlay\n data-slot=\"detail-dialog-overlay\"\n className=\"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\"\n />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-80 data-[state=open]:zoom-in-80',\n 'relative z-50 grid',\n 'gap-4 overflow-hidden rounded-none border-none bg-background p-0 shadow-dialog outline-none duration-200',\n 'h-full max-h-dvh w-full max-w-svw',\n 'sm:rounded-lg',\n 'sm:max-w-lg',\n 'md:max-h-[calc(100dvh-2rem)]',\n 'md:max-w-[calc(100svw-2rem)]'\n )}\n onInteractOutside={handleInteractOutside}\n >\n <SidebarProvider>\n <Sidebar collapsible=\"icon\">\n <DetailDialogSidebarHeader>\n <DetailDialogSidebarMenu>\n <DetailDialogSidebarMenuItem>\n <DetailDialogSidebarMenuButton size=\"lg\" tabIndex={-1}>\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n <CatIcon size={16} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{sidebar?.title || 'Detail Dialog'}</span>\n <span className=\"truncate text-xs\">Lunas Enterprise</span>\n </div>\n </DetailDialogSidebarMenuButton>\n </DetailDialogSidebarMenuItem>\n </DetailDialogSidebarMenu>\n </DetailDialogSidebarHeader>\n <DetailDialogSidebarContent>{SidebarContent}</DetailDialogSidebarContent>\n <DetailDialogSidebarFooter>{SidebarFooter}</DetailDialogSidebarFooter>\n </Sidebar>\n\n <main data-slot=\"detail-dialog-main\" className=\"relative h-full flex-1\">\n <Flex padding=\"none\" gap=\"none\" vertical align=\"stretch\" className=\"absolute inset-0 size-full\">\n <header className=\"flex w-full flex-0 items-start gap-x-2.5 border-b border-border-weak bg-card py-2.5 pr-12 pl-2\">\n <DetailDialogSidebarTrigger />\n <Flex vertical align=\"start\" padding=\"none\" width=\"null\" wrap={false} className=\"flex-1 gap-0\">\n <Title level={5} className=\"line-clamp-1 truncate text-wrap\">\n {title || 'Detail Dialog'}\n </Title>\n {!!createdAt && (\n <Flex padding=\"none\" className=\"relative items-center text-text-positive-weak\">\n <CalendarIcon size={12} />\n <DateDisplay showTime showHoliday date={createdAt} format=\"full\" />\n </Flex>\n )}\n </Flex>\n </header>\n {isLoading ? (\n <Flex justify=\"center\" className=\"inset-shadow-sm w-full flex-1 bg-muted-muted\">\n <div className=\"loader\" />\n </Flex>\n ) : (\n <section data-slot=\"detail-dialog-body\" className=\"relative inset-shadow-sm flex flex-1 snap-y flex-col gap-0 overflow-y-auto bg-white\">\n {children}\n </section>\n )}\n </Flex>\n </main>\n </SidebarProvider>\n\n <DialogPrimitive.Close data-slot=\"dialog-close\" tabIndex={-1} asChild className=\"absolute top-3 right-3\">\n <button className=\"flex cursor-pointer items-center justify-center rounded-full p-2 text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive active:bg-muted-weak active:text-text-positive-strong disabled:pointer-events-none disabled:opacity-60\">\n <XIcon size={24} />\n </button>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </div>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n"],"mappings":"osBAmEA,MAAaA,GAAsE,CAAE,OAAM,YAAW,QAAO,YAAW,eAAc,UAAS,cAAe,CAC5J,GAAM,CAAE,QAAS,EAAgB,OAAQ,GAAkB,GAAW,EAAE,CAElE,EAAwB,EAAoG,GAAS,CACzI,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,EACtB,EAAE,CAAC,CAEN,OACE,EAACC,EAAgB,KAAA,CAAK,YAAU,gBAAsB,OAAoB,wBACxE,EAACA,EAAgB,OAAA,CAAO,YAAU,iCAChC,EAACA,EAAgB,QAAA,CACf,YAAU,wBACV,UAAU,0JACV,CACF,EAAC,MAAA,CAAI,UAAU,+DACb,EAACA,EAAgB,QAAA,CACf,YAAU,iBACV,UAAW,EACT,+DACA,6DACA,+DACA,qBACA,2GACA,oCACA,gBACA,cACA,+BACA,+BACD,CACD,kBAAmB,YAEnB,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAQ,YAAY,iBACnB,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAA8B,KAAK,KAAK,SAAU,aACjD,EAAC,MAAA,CAAI,UAAU,+HACb,EAAC,EAAA,CAAQ,KAAM,GAAA,CAAM,EACjB,CACN,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,OAAA,CAAK,UAAU,gCAAwB,GAAS,OAAS,iBAAuB,CACjF,EAAC,OAAA,CAAK,UAAU,4BAAmB,oBAAuB,CAAA,EACtD,CAAA,EACwB,CAAA,CACJ,CAAA,CACN,CAAA,CACA,CAC5B,EAAC,EAAA,CAAA,SAA4B,EAAA,CAA4C,CACzE,EAAC,EAAA,CAAA,SAA2B,EAAA,CAA0C,GAC9D,CAEV,EAAC,OAAA,CAAK,YAAU,qBAAqB,UAAU,kCAC7C,EAAC,EAAA,CAAK,QAAQ,OAAO,IAAI,OAAO,SAAA,GAAS,MAAM,UAAU,UAAU,uCACjE,EAAC,SAAA,CAAO,UAAU,2GAChB,EAAC,EAAA,EAAA,CAA6B,CAC9B,EAAC,EAAA,CAAK,SAAA,GAAS,MAAM,QAAQ,QAAQ,OAAO,MAAM,OAAO,KAAM,GAAO,UAAU,yBAC9E,EAAC,EAAA,CAAM,MAAO,EAAG,UAAU,2CACxB,GAAS,iBACJ,CACP,CAAC,CAAC,GACD,EAAC,EAAA,CAAK,QAAQ,OAAO,UAAU,0DAC7B,EAAC,EAAA,CAAa,KAAM,GAAA,CAAM,CAC1B,EAAC,EAAA,CAAY,SAAA,GAAS,YAAA,GAAY,KAAM,EAAW,OAAO,QAAS,CAAA,EAC9D,CAAA,EAEJ,CAAA,EACA,CACR,EACC,EAAC,EAAA,CAAK,QAAQ,SAAS,UAAU,wDAC/B,EAAC,MAAA,CAAI,UAAU,SAAA,CAAW,EACrB,CAEP,EAAC,UAAA,CAAQ,YAAU,qBAAqB,UAAU,sFAC/C,YACO,CAAA,EAEP,EACF,CAAA,CAAA,CACS,CAElB,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,SAAU,GAAI,QAAA,GAAQ,UAAU,kCAC9E,EAAC,SAAA,CAAO,UAAU,2QAChB,EAAC,EAAA,CAAM,KAAM,GAAA,CAAM,EACZ,EACa,CAAA,EACA,EACtB,CAAA,EACiB,EACJ"}
@@ -1,2 +0,0 @@
1
- "use client";import"../button.variants-DkMqWB8G.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import{AlertDialog as e,AlertDialogAction as t,AlertDialogContent as n,AlertDialogFooter as r,AlertDialogHeader as i,AlertDialogTitle as a}from"../ui/alert-dialog.mjs";import{AlertTriangleIcon as o}from"lucide-react";import{useCallback as s}from"react";import{jsx as c,jsxs as l}from"react/jsx-runtime";const u=({open:u,title:d,children:f,onOpenChange:p})=>{let m=s(()=>{p?.(!1)},[p]);return c(e,{open:u,onOpenChange:p,children:l(n,{className:`gap-8 p-4 sm:max-w-md`,children:[c(i,{children:l(`div`,{className:`flex flex-col items-center text-danger`,children:[c(o,{size:42}),c(a,{className:`text-xl font-medium`,children:d||`An error occurred`})]})}),f,c(r,{children:c(t,{className:`w-full sm:w-28`,onClick:m,children:`Close`})})]})})};export{u as ErrorDialog};
2
- //# sourceMappingURL=error-dialog.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-dialog.mjs","names":["ErrorDialog: React.FC<React.PropsWithChildren<ErrorDialogProps>>"],"sources":["../../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\n\nimport { AlertTriangleIcon } from 'lucide-react';\n\nimport { AlertDialog, AlertDialogAction, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '../ui/alert-dialog';\n\nexport type ErrorDialogProps = {\n /** Controls whether the dialog is open. */\n open?: boolean;\n /** Title text displayed inside the dialog header. Defaults to `'An error occurred'`. */\n title?: string;\n /** Callback invoked when the dialog open state changes. */\n onOpenChange?: (open: boolean) => void;\n};\n\n/**\n * Displays a modal alert dialog for communicating error states to the user.\n *\n * @example\n * ```tsx\n * import { ErrorDialog } from '@customafk/lunas-ui/dialogs/error-dialog';\n *\n * <ErrorDialog open={hasError} title=\"Something went wrong\" onOpenChange={setHasError}>\n * <p>Please try again later.</p>\n * </ErrorDialog>\n * ```\n */\nexport const ErrorDialog: React.FC<React.PropsWithChildren<ErrorDialogProps>> = ({ open, title, children, onOpenChange }) => {\n const handleClose = useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"flex flex-col items-center text-danger\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">{title || 'An error occurred'}</AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-full sm:w-28\" onClick={handleClose}>\n Close\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n"],"mappings":"saA6BA,MAAaA,GAAoE,CAAE,OAAM,QAAO,WAAU,kBAAmB,CAC3H,IAAM,EAAc,MAAkB,CACpC,IAAe,GAAM,EACpB,CAAC,EAAa,CAAC,CAElB,OACE,EAAC,EAAA,CAAkB,OAAoB,wBACrC,EAAC,EAAA,CAAmB,UAAU,kCAC5B,EAAC,EAAA,CAAA,SACC,EAAC,MAAA,CAAI,UAAU,mDACb,EAAC,EAAA,CAAkB,KAAM,GAAA,CAAM,CAC/B,EAAC,EAAA,CAAiB,UAAU,+BAAuB,GAAS,qBAAuC,CAAA,EAC/F,CAAA,CACY,CACnB,EACD,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAkB,UAAU,iBAAiB,QAAS,WAAa,SAEhD,CAAA,CACF,GACD,EACT"}
@@ -1,2 +0,0 @@
1
- "use client";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import"../close-_UHFeiLS.mjs";import{l as e,r as t,t as n}from"../dialog-CLDnvNH_.mjs";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({open:a,onOpenChange:o})=>r(n,{open:a,onOpenChange:o,children:i(t,{showCloseButton:!1,className:`pointer-events-none border-none bg-transparent shadow-none outline-none [&>div]:bg-transparent`,children:[r(e,{}),r(`div`,{className:`flex items-center justify-center`,children:r(`div`,{className:`loader opacity-60`})})]})});export{a as LoadingDialog};
2
- //# sourceMappingURL=loading-dialog.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loading-dialog.mjs","names":["LoadingDialog: React.FC<LoadingDialogProps>"],"sources":["../../packages/components/dialogs/loading-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { Dialog, DialogContent, DialogTitle } from '../ui/dialog';\n\nexport type LoadingDialogProps = {\n /** Controls whether the dialog is open. */\n open?: boolean;\n /** Callback invoked when the dialog open state changes. */\n onOpenChange?: (open: boolean) => void;\n};\n\n/**\n * Displays a transparent, pointer-events-disabled modal overlay with a centered loading spinner.\n *\n * @example\n * ```tsx\n * import { LoadingDialog } from '@customafk/lunas-ui/dialogs/loading-dialog';\n *\n * <LoadingDialog open={isLoading} onOpenChange={setIsLoading} />\n * ```\n */\nexport const LoadingDialog: React.FC<LoadingDialogProps> = ({ open, onOpenChange }) => {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent showCloseButton={false} className=\"pointer-events-none border-none bg-transparent shadow-none outline-none [&>div]:bg-transparent\">\n <DialogTitle />\n <div className=\"flex items-center justify-center\">\n <div className=\"loader opacity-60\" />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"wNAqBA,MAAaA,GAA+C,CAAE,OAAM,kBAEhE,EAAC,EAAA,CAAa,OAAoB,wBAChC,EAAC,EAAA,CAAc,gBAAiB,GAAO,UAAU,2GAC/C,EAAC,EAAA,EAAA,CAAc,CACf,EAAC,MAAA,CAAI,UAAU,4CACb,EAAC,MAAA,CAAI,UAAU,oBAAA,CAAsB,EACjC,CAAA,EACQ,EACT"}