@customafk/lunas-ui 0.2.44 → 0.2.47

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 (620) 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-B02cVKWp.d.cts → alert-CNFuxKp7.d.cts} +6 -6
  4. package/dist/{alert-DHSm8bMn.d.mts → alert-EH6BsbAj.d.ts} +8 -8
  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-BxSbkHQL.d.mts → badge-Cca0AHjT.d.ts} +7 -7
  10. package/dist/{badge-zrAIDd-9.d.cts → badge-D0JnPurs.d.cts} +7 -7
  11. package/dist/{button-D3d7M90P.d.mts → button-Cr817M3U.d.cts} +6 -6
  12. package/dist/{button-D3QvCdr6.d.cts → button-DuZy_wDo.d.ts} +7 -7
  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 +1 -1
  60. package/dist/data-display/{statistic.d.mts → statistic.d.ts} +7 -7
  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-Bd5cOZia.d.mts → dialog-C48T3MZN.d.cts} +12 -12
  67. package/dist/{dialog-DEmYNufN.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 +27 -27
  74. package/dist/dialogs/detail-dialog/components/{sidebar.d.mts → sidebar.d.ts} +30 -30
  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 +4 -4
  92. package/dist/features/descriptions/{index.d.mts → index.d.ts} +8 -8
  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.cjs +1 -1
  102. package/dist/features/tanstack-form/index.d.cts +2 -2
  103. package/dist/features/tanstack-form/index.d.ts +2 -0
  104. package/dist/features/tanstack-form/index.js +1 -0
  105. package/dist/features/text-editor/index.d.cts +1 -1
  106. package/dist/features/text-editor/{index.d.mts → index.d.ts} +1 -1
  107. package/dist/features/text-editor/index.js +1 -0
  108. package/dist/field-DpoKF1nY.js +2 -0
  109. package/dist/field-DpoKF1nY.js.map +1 -0
  110. package/dist/{flex-B6YSJzGe.mjs → flex-CinRrgEy.js} +1 -1
  111. package/dist/flex-CinRrgEy.js.map +1 -0
  112. package/dist/{heading-De4Pn3mZ.mjs → heading-Bz-hSatD.js} +1 -1
  113. package/dist/heading-Bz-hSatD.js.map +1 -0
  114. package/dist/image-BpTuF_1w.js +2 -0
  115. package/dist/image-BpTuF_1w.js.map +1 -0
  116. package/dist/{index-CiG1i12w.d.cts → index-Bc9X8pLk.d.cts} +7 -7
  117. package/dist/{index-Cm62M0Ft.d.mts → index-BlQGXGqt.d.ts} +1 -1
  118. package/dist/{index-DNozPoRR.d.mts → index-C1O2C-cg.d.ts} +7 -7
  119. package/dist/{index-BhiLHeUb.d.cts → index-CgH0tiiC.d.cts} +30 -30
  120. package/dist/{index-DSciiDhn.d.cts → index-D5u9CKyd.d.cts} +309 -950
  121. package/dist/{index-DriviV-i.d.mts → index-DFUF27Yy.d.ts} +31 -31
  122. package/dist/{index-Cl_7tlH_.d.mts → index-Ilj04YNO.d.ts} +309 -950
  123. package/dist/index.cjs +1 -1
  124. package/dist/index.d.cts +9 -9
  125. package/dist/index.d.ts +93 -0
  126. package/dist/index.js +1 -0
  127. package/dist/{input-BtuZm0BQ.d.mts → input-B_gst0eJ.d.cts} +7 -7
  128. package/dist/{input-CD4zf7t1.d.cts → input-BkHdaXGY.d.ts} +7 -7
  129. package/dist/{input-NJP2wQOm.mjs → input-DAfP6LZ7.js} +1 -1
  130. package/dist/input-DAfP6LZ7.js.map +1 -0
  131. package/dist/{label-CUCpwS5D.mjs → label-B8cAG2kc.js} +1 -1
  132. package/dist/label-B8cAG2kc.js.map +1 -0
  133. package/dist/layouts/cms-layout/index.d.ts +2 -0
  134. package/dist/layouts/cms-layout/index.js +1 -0
  135. package/dist/layouts/flex.d.cts +4 -4
  136. package/dist/layouts/{flex.d.mts → flex.d.ts} +5 -5
  137. package/dist/layouts/flex.js +1 -0
  138. package/dist/layouts/{grid.d.mts → grid.d.ts} +1 -1
  139. package/dist/layouts/{grid.mjs → grid.js} +1 -1
  140. package/dist/layouts/grid.js.map +1 -0
  141. package/dist/layouts/payment-layout/{index.d.mts → index.d.ts} +1 -1
  142. package/dist/layouts/payment-layout/index.js +1 -0
  143. package/dist/pages/FeatureDeveloping.d.cts +2 -2
  144. package/dist/pages/{FeatureDeveloping.d.mts → FeatureDeveloping.d.ts} +3 -3
  145. package/dist/pages/FeatureDeveloping.js +2 -0
  146. package/dist/pages/FeatureDeveloping.js.map +1 -0
  147. package/dist/pages/FeatureFixing.d.cts +2 -2
  148. package/dist/pages/{FeatureFixing.d.mts → FeatureFixing.d.ts} +3 -3
  149. package/dist/pages/FeatureFixing.js +2 -0
  150. package/dist/pages/FeatureFixing.js.map +1 -0
  151. package/dist/pages/LoginPage.d.cts +2 -2
  152. package/dist/pages/{LoginPage.d.mts → LoginPage.d.ts} +3 -3
  153. package/dist/pages/LoginPage.js +2 -0
  154. package/dist/pages/LoginPage.js.map +1 -0
  155. package/dist/pages/NotAuthorized.d.cts +2 -2
  156. package/dist/pages/{NotAuthorized.d.mts → NotAuthorized.d.ts} +3 -3
  157. package/dist/pages/NotAuthorized.js +2 -0
  158. package/dist/pages/NotAuthorized.js.map +1 -0
  159. package/dist/pages/NotFound.d.cts +2 -2
  160. package/dist/pages/{NotFound.d.mts → NotFound.d.ts} +3 -3
  161. package/dist/pages/NotFound.js +2 -0
  162. package/dist/pages/NotFound.js.map +1 -0
  163. package/dist/pages/RegisterPage.d.cts +2 -2
  164. package/dist/pages/{RegisterPage.d.mts → RegisterPage.d.ts} +3 -3
  165. package/dist/pages/RegisterPage.js +2 -0
  166. package/dist/pages/RegisterPage.js.map +1 -0
  167. package/dist/pages/VerifyEmailPage.d.cts +2 -2
  168. package/dist/pages/{VerifyEmailPage.d.mts → VerifyEmailPage.d.ts} +3 -3
  169. package/dist/pages/VerifyEmailPage.js +2 -0
  170. package/dist/pages/VerifyEmailPage.js.map +1 -0
  171. package/dist/{paragraph-DYLaQtTV.mjs → paragraph-Cc13ZI4d.js} +1 -1
  172. package/dist/paragraph-Cc13ZI4d.js.map +1 -0
  173. package/dist/payment-layout-giaGvs8T.js +2 -0
  174. package/dist/payment-layout-giaGvs8T.js.map +1 -0
  175. package/dist/popover-6233wU1s.js +2 -0
  176. package/dist/popover-6233wU1s.js.map +1 -0
  177. package/dist/{progress-CLeM0e7Z.mjs → progress-AYknlEgK.js} +1 -1
  178. package/dist/progress-AYknlEgK.js.map +1 -0
  179. package/dist/{radio-group-Y9bhdr55.mjs → radio-group-ImoBjpqZ.js} +1 -1
  180. package/dist/radio-group-ImoBjpqZ.js.map +1 -0
  181. package/dist/{resizable-CpCaSCFB.mjs → resizable-C-M-mu6b.js} +1 -1
  182. package/dist/resizable-C-M-mu6b.js.map +1 -0
  183. package/dist/search-modal-b2AE5WEW.js +2 -0
  184. package/dist/search-modal-b2AE5WEW.js.map +1 -0
  185. package/dist/{select-LlPCZFSF.mjs → select-CryLzZA0.js} +1 -1
  186. package/dist/select-CryLzZA0.js.map +1 -0
  187. package/dist/{separator-D3Gmkxzq.mjs → separator-BM8hA4DP.js} +1 -1
  188. package/dist/separator-BM8hA4DP.js.map +1 -0
  189. package/dist/{sheet-BFlIfNaA.mjs → sheet-DGXXYgWB.js} +1 -1
  190. package/dist/sheet-DGXXYgWB.js.map +1 -0
  191. package/dist/sidebar-BDrsbzo5.js +2 -0
  192. package/dist/sidebar-BDrsbzo5.js.map +1 -0
  193. package/dist/{skeleton-C51IdOfK.mjs → skeleton-DlRDNM97.js} +1 -1
  194. package/dist/skeleton-DlRDNM97.js.map +1 -0
  195. package/dist/{spinner-eClTgHjk.mjs → spinner-C1eamx3w.js} +1 -1
  196. package/dist/spinner-C1eamx3w.js.map +1 -0
  197. package/dist/{statistic-cwLwcukn.mjs → statistic-CYMqAYNc.js} +1 -1
  198. package/dist/statistic-CYMqAYNc.js.map +1 -0
  199. package/dist/{switch-BP7EPatj.mjs → switch-BLHmdRq2.js} +1 -1
  200. package/dist/switch-BLHmdRq2.js.map +1 -0
  201. package/dist/systems/{google.d.mts → google.d.ts} +1 -1
  202. package/dist/systems/{google.mjs → google.js} +1 -1
  203. package/dist/systems/google.js.map +1 -0
  204. package/dist/tables-DWQytYNm.js +4 -0
  205. package/dist/tables-DWQytYNm.js.map +1 -0
  206. package/dist/tanstack-form-CCDV-3Ml.js +12 -0
  207. package/dist/tanstack-form-CCDV-3Ml.js.map +1 -0
  208. package/dist/{tanstack-form-DatI41wz.cjs → tanstack-form-DoI86Ezs.cjs} +2 -2
  209. package/dist/{tanstack-form-DatI41wz.cjs.map → tanstack-form-DoI86Ezs.cjs.map} +1 -1
  210. package/dist/text-editor-WbS7pJJs.js +2 -0
  211. package/dist/text-editor-WbS7pJJs.js.map +1 -0
  212. package/dist/{textarea-7HDXcaK9.mjs → textarea-Bp6VvhiA.js} +1 -1
  213. package/dist/textarea-Bp6VvhiA.js.map +1 -0
  214. package/dist/{tooltip-Dxl5Wa8i.mjs → tooltip-CVIl6Hln.js} +1 -1
  215. package/dist/tooltip-CVIl6Hln.js.map +1 -0
  216. package/dist/{types-YLu40dXY.d.mts → types-BVSfF-1o.d.ts} +1 -1
  217. package/dist/{types-B5nyTWtO.mjs → types-BZqffRVJ.js} +1 -1
  218. package/dist/types-BZqffRVJ.js.map +1 -0
  219. package/dist/typography/paragraph.d.cts +5 -5
  220. package/dist/typography/{paragraph.d.mts → paragraph.d.ts} +6 -6
  221. package/dist/typography/paragraph.js +1 -0
  222. package/dist/typography/{title.d.mts → title.d.ts} +1 -1
  223. package/dist/typography/{title.mjs → title.js} +1 -1
  224. package/dist/typography/title.js.map +1 -0
  225. package/dist/ui/alert-dialog.d.cts +12 -12
  226. package/dist/ui/{alert-dialog.d.mts → alert-dialog.d.ts} +13 -13
  227. package/dist/ui/alert-dialog.js +2 -0
  228. package/dist/ui/alert-dialog.js.map +1 -0
  229. package/dist/ui/alert.d.cts +1 -1
  230. package/dist/ui/{alert.d.mts → alert.d.ts} +1 -1
  231. package/dist/ui/alert.js +1 -0
  232. package/dist/ui/aspect-ratio.d.cts +2 -2
  233. package/dist/ui/{aspect-ratio.d.mts → aspect-ratio.d.ts} +3 -3
  234. package/dist/ui/{aspect-ratio.mjs → aspect-ratio.js} +1 -1
  235. package/dist/ui/aspect-ratio.js.map +1 -0
  236. package/dist/ui/avatar.d.cts +4 -4
  237. package/dist/ui/{avatar.d.mts → avatar.d.ts} +5 -5
  238. package/dist/ui/avatar.js +1 -0
  239. package/dist/ui/badge.d.cts +1 -1
  240. package/dist/ui/badge.d.ts +2 -0
  241. package/dist/ui/badge.js +1 -0
  242. package/dist/ui/breadcrumb.d.cts +8 -8
  243. package/dist/ui/{breadcrumb.d.mts → breadcrumb.d.ts} +9 -9
  244. package/dist/ui/breadcrumb.js +2 -0
  245. package/dist/ui/breadcrumb.js.map +1 -0
  246. package/dist/ui/button-group.d.cts +6 -6
  247. package/dist/ui/{button-group.d.mts → button-group.d.ts} +8 -8
  248. package/dist/ui/button-group.js +2 -0
  249. package/dist/ui/button-group.js.map +1 -0
  250. package/dist/ui/button.d.cts +1 -1
  251. package/dist/ui/button.d.ts +2 -0
  252. package/dist/ui/button.js +1 -0
  253. package/dist/ui/buttons/{add-new.d.mts → add-new.d.ts} +1 -1
  254. package/dist/ui/buttons/add-new.js +2 -0
  255. package/dist/ui/buttons/add-new.js.map +1 -0
  256. package/dist/ui/buttons/{edit.d.mts → edit.d.ts} +1 -1
  257. package/dist/ui/buttons/edit.js +2 -0
  258. package/dist/ui/buttons/edit.js.map +1 -0
  259. package/dist/ui/buttons/{refresh.d.mts → refresh.d.ts} +1 -1
  260. package/dist/ui/buttons/refresh.js +2 -0
  261. package/dist/ui/buttons/refresh.js.map +1 -0
  262. package/dist/ui/buttons/{trash.d.mts → trash.d.ts} +1 -1
  263. package/dist/ui/buttons/trash.js +2 -0
  264. package/dist/ui/buttons/trash.js.map +1 -0
  265. package/dist/ui/buttons/{upload-image.d.mts → upload-image.d.ts} +1 -1
  266. package/dist/ui/buttons/upload-image.js +2 -0
  267. package/dist/ui/buttons/upload-image.js.map +1 -0
  268. package/dist/ui/calendar.d.cts +4 -4
  269. package/dist/ui/{calendar.d.mts → calendar.d.ts} +5 -5
  270. package/dist/ui/calendar.js +1 -0
  271. package/dist/ui/card.d.cts +8 -8
  272. package/dist/ui/{card.d.mts → card.d.ts} +9 -9
  273. package/dist/ui/card.js +2 -0
  274. package/dist/ui/card.js.map +1 -0
  275. package/dist/ui/carousel.d.cts +7 -7
  276. package/dist/ui/{carousel.d.mts → carousel.d.ts} +8 -8
  277. package/dist/ui/carousel.js +2 -0
  278. package/dist/ui/carousel.js.map +1 -0
  279. package/dist/ui/checkbox.d.cts +2 -2
  280. package/dist/ui/{checkbox.d.mts → checkbox.d.ts} +3 -3
  281. package/dist/ui/checkbox.js +1 -0
  282. package/dist/ui/collapsible.d.cts +4 -4
  283. package/dist/ui/{collapsible.d.mts → collapsible.d.ts} +5 -5
  284. package/dist/ui/{collapsible.mjs → collapsible.js} +1 -1
  285. package/dist/ui/collapsible.js.map +1 -0
  286. package/dist/ui/command.d.cts +11 -11
  287. package/dist/ui/{command.d.mts → command.d.ts} +12 -12
  288. package/dist/ui/command.js +1 -0
  289. package/dist/ui/context-menu.d.cts +16 -16
  290. package/dist/ui/{context-menu.d.mts → context-menu.d.ts} +17 -17
  291. package/dist/ui/{context-menu.mjs → context-menu.js} +1 -1
  292. package/dist/ui/context-menu.js.map +1 -0
  293. package/dist/ui/dialog.d.cts +1 -1
  294. package/dist/ui/{dialog.d.mts → dialog.d.ts} +1 -1
  295. package/dist/ui/dialog.js +1 -0
  296. package/dist/ui/drawer.d.cts +11 -11
  297. package/dist/ui/{drawer.d.mts → drawer.d.ts} +12 -12
  298. package/dist/ui/drawer.js +1 -0
  299. package/dist/ui/dropdown-menu.d.cts +16 -16
  300. package/dist/ui/{dropdown-menu.d.mts → dropdown-menu.d.ts} +17 -17
  301. package/dist/ui/dropdown-menu.js +1 -0
  302. package/dist/ui/empty.d.cts +9 -9
  303. package/dist/ui/{empty.d.mts → empty.d.ts} +10 -10
  304. package/dist/ui/{empty.mjs → empty.js} +1 -1
  305. package/dist/ui/empty.js.map +1 -0
  306. package/dist/ui/field.d.cts +23 -23
  307. package/dist/ui/field.d.ts +65 -0
  308. package/dist/ui/field.js +1 -0
  309. package/dist/ui/file-uploader.d.cts +2 -2
  310. package/dist/ui/{file-uploader.d.mts → file-uploader.d.ts} +3 -3
  311. package/dist/ui/file-uploader.js +3 -0
  312. package/dist/ui/file-uploader.js.map +1 -0
  313. package/dist/ui/form.d.cts +10 -10
  314. package/dist/ui/{form.d.mts → form.d.ts} +11 -11
  315. package/dist/ui/form.js +2 -0
  316. package/dist/ui/form.js.map +1 -0
  317. package/dist/ui/hover-card.d.cts +4 -4
  318. package/dist/ui/{hover-card.d.mts → hover-card.d.ts} +5 -5
  319. package/dist/ui/{hover-card.mjs → hover-card.js} +1 -1
  320. package/dist/ui/hover-card.js.map +1 -0
  321. package/dist/ui/{image.d.mts → image.d.ts} +1 -1
  322. package/dist/ui/image.js +1 -0
  323. package/dist/ui/input-otp.d.cts +5 -5
  324. package/dist/ui/{input-otp.d.mts → input-otp.d.ts} +6 -6
  325. package/dist/ui/{input-otp.mjs → input-otp.js} +1 -1
  326. package/dist/ui/input-otp.js.map +1 -0
  327. package/dist/ui/input.d.cts +1 -1
  328. package/dist/ui/input.d.ts +2 -0
  329. package/dist/ui/input.js +1 -0
  330. package/dist/ui/inputs/search-input.d.cts +3 -3
  331. package/dist/ui/inputs/{search-input.d.mts → search-input.d.ts} +4 -4
  332. package/dist/ui/inputs/search-input.js +2 -0
  333. package/dist/ui/inputs/search-input.js.map +1 -0
  334. package/dist/ui/item.d.cts +16 -16
  335. package/dist/ui/{item.d.mts → item.d.ts} +18 -18
  336. package/dist/ui/item.js +2 -0
  337. package/dist/ui/item.js.map +1 -0
  338. package/dist/ui/label.d.cts +2 -2
  339. package/dist/ui/{label.d.mts → label.d.ts} +3 -3
  340. package/dist/ui/label.js +1 -0
  341. package/dist/ui/menubar.d.cts +17 -17
  342. package/dist/ui/{menubar.d.mts → menubar.d.ts} +18 -18
  343. package/dist/ui/{menubar.mjs → menubar.js} +1 -1
  344. package/dist/ui/menubar.js.map +1 -0
  345. package/dist/ui/multi-select.d.cts +2 -2
  346. package/dist/ui/{multi-select.d.mts → multi-select.d.ts} +5 -5
  347. package/dist/ui/multi-select.js +2 -0
  348. package/dist/ui/multi-select.js.map +1 -0
  349. package/dist/ui/navigation-menu.d.cts +11 -11
  350. package/dist/ui/{navigation-menu.d.mts → navigation-menu.d.ts} +12 -12
  351. package/dist/ui/{navigation-menu.mjs → navigation-menu.js} +1 -1
  352. package/dist/ui/navigation-menu.js.map +1 -0
  353. package/dist/ui/pagination.d.cts +9 -9
  354. package/dist/ui/{pagination.d.mts → pagination.d.ts} +10 -10
  355. package/dist/ui/pagination.js +2 -0
  356. package/dist/ui/pagination.js.map +1 -0
  357. package/dist/ui/popover.d.cts +6 -6
  358. package/dist/ui/{popover.d.mts → popover.d.ts} +7 -7
  359. package/dist/ui/popover.js +1 -0
  360. package/dist/ui/progress.d.cts +2 -2
  361. package/dist/ui/{progress.d.mts → progress.d.ts} +3 -3
  362. package/dist/ui/progress.js +1 -0
  363. package/dist/ui/radio-group.d.cts +3 -3
  364. package/dist/ui/{radio-group.d.mts → radio-group.d.ts} +4 -4
  365. package/dist/ui/radio-group.js +1 -0
  366. package/dist/ui/resizable.d.cts +9 -9
  367. package/dist/ui/{resizable.d.mts → resizable.d.ts} +10 -10
  368. package/dist/ui/resizable.js +1 -0
  369. package/dist/ui/scroll-area.d.cts +5 -5
  370. package/dist/ui/{scroll-area.d.mts → scroll-area.d.ts} +6 -6
  371. package/dist/ui/{scroll-area.mjs → scroll-area.js} +1 -1
  372. package/dist/ui/scroll-area.js.map +1 -0
  373. package/dist/ui/select.d.cts +9 -9
  374. package/dist/ui/{select.d.mts → select.d.ts} +10 -10
  375. package/dist/ui/select.js +1 -0
  376. package/dist/ui/separator.d.cts +2 -2
  377. package/dist/ui/{separator.d.mts → separator.d.ts} +3 -3
  378. package/dist/ui/separator.js +1 -0
  379. package/dist/ui/sheet.d.cts +9 -9
  380. package/dist/ui/{sheet.d.mts → sheet.d.ts} +10 -10
  381. package/dist/ui/sheet.js +1 -0
  382. package/dist/ui/skeleton.d.cts +2 -2
  383. package/dist/ui/{skeleton.d.mts → skeleton.d.ts} +3 -3
  384. package/dist/ui/skeleton.js +1 -0
  385. package/dist/ui/slider.d.cts +2 -2
  386. package/dist/ui/{slider.d.mts → slider.d.ts} +3 -3
  387. package/dist/ui/{slider.mjs → slider.js} +1 -1
  388. package/dist/ui/slider.js.map +1 -0
  389. package/dist/ui/sonner.d.cts +2 -2
  390. package/dist/ui/{sonner.d.mts → sonner.d.ts} +3 -3
  391. package/dist/ui/{sonner.mjs → sonner.js} +1 -1
  392. package/dist/ui/sonner.js.map +1 -0
  393. package/dist/ui/spinner.d.cts +2 -2
  394. package/dist/ui/{spinner.d.mts → spinner.d.ts} +3 -3
  395. package/dist/ui/spinner.js +1 -0
  396. package/dist/ui/switch.d.cts +2 -2
  397. package/dist/ui/{switch.d.mts → switch.d.ts} +3 -3
  398. package/dist/ui/switch.js +1 -0
  399. package/dist/ui/table.d.cts +17 -17
  400. package/dist/ui/{table.d.mts → table.d.ts} +18 -18
  401. package/dist/ui/{table.mjs → table.js} +1 -1
  402. package/dist/ui/table.js.map +1 -0
  403. package/dist/ui/tabs.d.cts +5 -5
  404. package/dist/ui/{tabs.d.mts → tabs.d.ts} +6 -6
  405. package/dist/ui/{tabs.mjs → tabs.js} +1 -1
  406. package/dist/ui/tabs.js.map +1 -0
  407. package/dist/ui/textarea.d.cts +2 -2
  408. package/dist/ui/{textarea.d.mts → textarea.d.ts} +3 -3
  409. package/dist/ui/textarea.js +1 -0
  410. package/dist/ui/toggle-group.d.cts +3 -3
  411. package/dist/ui/{toggle-group.d.mts → toggle-group.d.ts} +5 -5
  412. package/dist/ui/toggle-group.js +2 -0
  413. package/dist/ui/toggle-group.js.map +1 -0
  414. package/dist/ui/toggle.d.cts +5 -5
  415. package/dist/ui/{toggle.d.mts → toggle.d.ts} +4 -4
  416. package/dist/ui/{toggle.mjs → toggle.js} +1 -1
  417. package/dist/ui/toggle.js.map +1 -0
  418. package/dist/ui/tooltip.d.cts +5 -5
  419. package/dist/ui/{tooltip.d.mts → tooltip.d.ts} +6 -6
  420. package/dist/ui/tooltip.js +1 -0
  421. package/dist/user-BSpgswEC.js +2 -0
  422. package/dist/user-BSpgswEC.js.map +1 -0
  423. package/package.json +97 -97
  424. package/dist/alert-BbvPwf2x.mjs.map +0 -1
  425. package/dist/avatar-fltdRVsJ.mjs.map +0 -1
  426. package/dist/badge-CDGBGq8X.mjs.map +0 -1
  427. package/dist/button-CCVJTHBI.mjs +0 -2
  428. package/dist/button-CCVJTHBI.mjs.map +0 -1
  429. package/dist/button.variants-DkMqWB8G.mjs.map +0 -1
  430. package/dist/calendar-R866yyd1.mjs +0 -2
  431. package/dist/calendar-R866yyd1.mjs.map +0 -1
  432. package/dist/cards/grid-product-card.mjs +0 -2
  433. package/dist/cards/grid-product-card.mjs.map +0 -1
  434. package/dist/cards/product-card.mjs +0 -2
  435. package/dist/cards/product-card.mjs.map +0 -1
  436. package/dist/cards/simple-card.mjs +0 -2
  437. package/dist/cards/simple-card.mjs.map +0 -1
  438. package/dist/checkbox-Cat3i08X.mjs.map +0 -1
  439. package/dist/close-_UHFeiLS.mjs.map +0 -1
  440. package/dist/cms-layout-DkCR1AfG.mjs +0 -2
  441. package/dist/cms-layout-DkCR1AfG.mjs.map +0 -1
  442. package/dist/command-D6_CSbwJ.mjs +0 -2
  443. package/dist/command-D6_CSbwJ.mjs.map +0 -1
  444. package/dist/data-display/country.mjs +0 -2
  445. package/dist/data-display/country.mjs.map +0 -1
  446. package/dist/data-display/data-list.mjs.map +0 -1
  447. package/dist/data-display/date-tooltip.mjs +0 -2
  448. package/dist/data-display/date-tooltip.mjs.map +0 -1
  449. package/dist/data-display/date.mjs +0 -1
  450. package/dist/data-display/empty.mjs.map +0 -1
  451. package/dist/data-display/name.mjs +0 -2
  452. package/dist/data-display/name.mjs.map +0 -1
  453. package/dist/data-display/phone-number.mjs +0 -2
  454. package/dist/data-display/phone-number.mjs.map +0 -1
  455. package/dist/data-display/role-badge.mjs +0 -2
  456. package/dist/data-display/role-badge.mjs.map +0 -1
  457. package/dist/data-display/statistic.mjs +0 -1
  458. package/dist/data-display/user.mjs +0 -1
  459. package/dist/date-fY3sUcLp.mjs.map +0 -1
  460. package/dist/dialog-CLDnvNH_.mjs +0 -2
  461. package/dist/dialog-CLDnvNH_.mjs.map +0 -1
  462. package/dist/dialogs/confirm-dialog.mjs +0 -2
  463. package/dist/dialogs/confirm-dialog.mjs.map +0 -1
  464. package/dist/dialogs/detail-dialog/components/sidebar.mjs +0 -1
  465. package/dist/dialogs/detail-dialog/index.mjs +0 -2
  466. package/dist/dialogs/detail-dialog/index.mjs.map +0 -1
  467. package/dist/dialogs/error-dialog.mjs +0 -2
  468. package/dist/dialogs/error-dialog.mjs.map +0 -1
  469. package/dist/dialogs/loading-dialog.mjs +0 -2
  470. package/dist/dialogs/loading-dialog.mjs.map +0 -1
  471. package/dist/dist-DVrfqn8H.mjs.map +0 -1
  472. package/dist/drawer-CMD7JWH8.mjs.map +0 -1
  473. package/dist/dropdown-menu-BWhiVsEf.mjs.map +0 -1
  474. package/dist/features/descriptions/index.mjs +0 -2
  475. package/dist/features/descriptions/index.mjs.map +0 -1
  476. package/dist/features/search-modal/index.mjs +0 -1
  477. package/dist/features/tables/index.mjs +0 -1
  478. package/dist/features/tanstack-form/index.d.mts +0 -2
  479. package/dist/features/tanstack-form/index.mjs +0 -1
  480. package/dist/features/text-editor/index.mjs +0 -1
  481. package/dist/field-dYemS0hQ.mjs +0 -2
  482. package/dist/field-dYemS0hQ.mjs.map +0 -1
  483. package/dist/flex-B6YSJzGe.mjs.map +0 -1
  484. package/dist/heading-De4Pn3mZ.mjs.map +0 -1
  485. package/dist/image-D7OZ13Ib.mjs +0 -2
  486. package/dist/image-D7OZ13Ib.mjs.map +0 -1
  487. package/dist/index.d.mts +0 -93
  488. package/dist/index.mjs +0 -1
  489. package/dist/input-NJP2wQOm.mjs.map +0 -1
  490. package/dist/label-CUCpwS5D.mjs.map +0 -1
  491. package/dist/layouts/cms-layout/index.d.mts +0 -2
  492. package/dist/layouts/cms-layout/index.mjs +0 -1
  493. package/dist/layouts/flex.mjs +0 -1
  494. package/dist/layouts/grid.mjs.map +0 -1
  495. package/dist/layouts/payment-layout/index.mjs +0 -1
  496. package/dist/pages/FeatureDeveloping.mjs +0 -2
  497. package/dist/pages/FeatureDeveloping.mjs.map +0 -1
  498. package/dist/pages/FeatureFixing.mjs +0 -2
  499. package/dist/pages/FeatureFixing.mjs.map +0 -1
  500. package/dist/pages/LoginPage.mjs +0 -2
  501. package/dist/pages/LoginPage.mjs.map +0 -1
  502. package/dist/pages/NotAuthorized.mjs +0 -2
  503. package/dist/pages/NotAuthorized.mjs.map +0 -1
  504. package/dist/pages/NotFound.mjs +0 -2
  505. package/dist/pages/NotFound.mjs.map +0 -1
  506. package/dist/pages/RegisterPage.mjs +0 -2
  507. package/dist/pages/RegisterPage.mjs.map +0 -1
  508. package/dist/pages/VerifyEmailPage.mjs +0 -2
  509. package/dist/pages/VerifyEmailPage.mjs.map +0 -1
  510. package/dist/paragraph-DYLaQtTV.mjs.map +0 -1
  511. package/dist/payment-layout-DrQ0kZPX.mjs +0 -2
  512. package/dist/payment-layout-DrQ0kZPX.mjs.map +0 -1
  513. package/dist/popover-C8rcemA3.mjs +0 -2
  514. package/dist/popover-C8rcemA3.mjs.map +0 -1
  515. package/dist/progress-CLeM0e7Z.mjs.map +0 -1
  516. package/dist/radio-group-Y9bhdr55.mjs.map +0 -1
  517. package/dist/resizable-CpCaSCFB.mjs.map +0 -1
  518. package/dist/search-modal-Bn-GOOCy.mjs +0 -2
  519. package/dist/search-modal-Bn-GOOCy.mjs.map +0 -1
  520. package/dist/select-LlPCZFSF.mjs.map +0 -1
  521. package/dist/separator-D3Gmkxzq.mjs.map +0 -1
  522. package/dist/sheet-BFlIfNaA.mjs.map +0 -1
  523. package/dist/sidebar-ChtCyu-n.mjs +0 -2
  524. package/dist/sidebar-ChtCyu-n.mjs.map +0 -1
  525. package/dist/skeleton-C51IdOfK.mjs.map +0 -1
  526. package/dist/spinner-eClTgHjk.mjs.map +0 -1
  527. package/dist/statistic-cwLwcukn.mjs.map +0 -1
  528. package/dist/switch-BP7EPatj.mjs.map +0 -1
  529. package/dist/systems/google.mjs.map +0 -1
  530. package/dist/tables-CFrsk2lM.mjs +0 -4
  531. package/dist/tables-CFrsk2lM.mjs.map +0 -1
  532. package/dist/tanstack-form-DT1TqIDl.mjs +0 -12
  533. package/dist/tanstack-form-DT1TqIDl.mjs.map +0 -1
  534. package/dist/text-editor-5mA7XyaI.mjs +0 -2
  535. package/dist/text-editor-5mA7XyaI.mjs.map +0 -1
  536. package/dist/textarea-7HDXcaK9.mjs.map +0 -1
  537. package/dist/tooltip-Dxl5Wa8i.mjs.map +0 -1
  538. package/dist/types-B5nyTWtO.mjs.map +0 -1
  539. package/dist/typography/paragraph.mjs +0 -1
  540. package/dist/typography/title.mjs.map +0 -1
  541. package/dist/ui/alert-dialog.mjs +0 -2
  542. package/dist/ui/alert-dialog.mjs.map +0 -1
  543. package/dist/ui/alert.mjs +0 -1
  544. package/dist/ui/aspect-ratio.mjs.map +0 -1
  545. package/dist/ui/avatar.mjs +0 -1
  546. package/dist/ui/badge.d.mts +0 -2
  547. package/dist/ui/badge.mjs +0 -1
  548. package/dist/ui/breadcrumb.mjs +0 -2
  549. package/dist/ui/breadcrumb.mjs.map +0 -1
  550. package/dist/ui/button-group.mjs +0 -2
  551. package/dist/ui/button-group.mjs.map +0 -1
  552. package/dist/ui/button.d.mts +0 -2
  553. package/dist/ui/button.mjs +0 -1
  554. package/dist/ui/buttons/add-new.mjs +0 -2
  555. package/dist/ui/buttons/add-new.mjs.map +0 -1
  556. package/dist/ui/buttons/edit.mjs +0 -2
  557. package/dist/ui/buttons/edit.mjs.map +0 -1
  558. package/dist/ui/buttons/refresh.mjs +0 -2
  559. package/dist/ui/buttons/refresh.mjs.map +0 -1
  560. package/dist/ui/buttons/trash.mjs +0 -2
  561. package/dist/ui/buttons/trash.mjs.map +0 -1
  562. package/dist/ui/buttons/upload-image.mjs +0 -2
  563. package/dist/ui/buttons/upload-image.mjs.map +0 -1
  564. package/dist/ui/calendar.mjs +0 -1
  565. package/dist/ui/card.mjs +0 -2
  566. package/dist/ui/card.mjs.map +0 -1
  567. package/dist/ui/carousel.mjs +0 -2
  568. package/dist/ui/carousel.mjs.map +0 -1
  569. package/dist/ui/checkbox.mjs +0 -1
  570. package/dist/ui/collapsible.mjs.map +0 -1
  571. package/dist/ui/command.mjs +0 -1
  572. package/dist/ui/context-menu.mjs.map +0 -1
  573. package/dist/ui/dialog.mjs +0 -1
  574. package/dist/ui/drawer.mjs +0 -1
  575. package/dist/ui/dropdown-menu.mjs +0 -1
  576. package/dist/ui/empty.mjs.map +0 -1
  577. package/dist/ui/field.d.mts +0 -65
  578. package/dist/ui/field.mjs +0 -1
  579. package/dist/ui/file-uploader.mjs +0 -3
  580. package/dist/ui/file-uploader.mjs.map +0 -1
  581. package/dist/ui/form.mjs +0 -2
  582. package/dist/ui/form.mjs.map +0 -1
  583. package/dist/ui/hover-card.mjs.map +0 -1
  584. package/dist/ui/image.mjs +0 -1
  585. package/dist/ui/input-otp.mjs.map +0 -1
  586. package/dist/ui/input.d.mts +0 -2
  587. package/dist/ui/input.mjs +0 -1
  588. package/dist/ui/inputs/search-input.mjs +0 -2
  589. package/dist/ui/inputs/search-input.mjs.map +0 -1
  590. package/dist/ui/item.mjs +0 -2
  591. package/dist/ui/item.mjs.map +0 -1
  592. package/dist/ui/label.mjs +0 -1
  593. package/dist/ui/menubar.mjs.map +0 -1
  594. package/dist/ui/multi-select.mjs +0 -2
  595. package/dist/ui/multi-select.mjs.map +0 -1
  596. package/dist/ui/navigation-menu.mjs.map +0 -1
  597. package/dist/ui/pagination.mjs +0 -2
  598. package/dist/ui/pagination.mjs.map +0 -1
  599. package/dist/ui/popover.mjs +0 -1
  600. package/dist/ui/progress.mjs +0 -1
  601. package/dist/ui/radio-group.mjs +0 -1
  602. package/dist/ui/resizable.mjs +0 -1
  603. package/dist/ui/scroll-area.mjs.map +0 -1
  604. package/dist/ui/select.mjs +0 -1
  605. package/dist/ui/separator.mjs +0 -1
  606. package/dist/ui/sheet.mjs +0 -1
  607. package/dist/ui/skeleton.mjs +0 -1
  608. package/dist/ui/slider.mjs.map +0 -1
  609. package/dist/ui/sonner.mjs.map +0 -1
  610. package/dist/ui/spinner.mjs +0 -1
  611. package/dist/ui/switch.mjs +0 -1
  612. package/dist/ui/table.mjs.map +0 -1
  613. package/dist/ui/tabs.mjs.map +0 -1
  614. package/dist/ui/textarea.mjs +0 -1
  615. package/dist/ui/toggle-group.mjs +0 -2
  616. package/dist/ui/toggle-group.mjs.map +0 -1
  617. package/dist/ui/toggle.mjs.map +0 -1
  618. package/dist/ui/tooltip.mjs +0 -1
  619. package/dist/user-DtZy4P9d.mjs +0 -2
  620. package/dist/user-DtZy4P9d.mjs.map +0 -1
@@ -1,2 +0,0 @@
1
- import{a as e,h as t,r as n,t as r}from"./dropdown-menu-BWhiVsEf.mjs";import{a as i,i as a,t as o}from"./popover-C8rcemA3.mjs";import{AlignCenter as s,AlignJustify as c,AlignLeft as l,AlignRight as u,Bold as d,ChevronDown as f,Code as p,Code2 as m,Highlighter as h,Italic as ee,Link2 as g,Link2Off as _,List as v,ListChecks as y,ListOrdered as b,Minus as x,Palette as S,Quote as C,Redo as te,Strikethrough as w,Underline as ne,Undo as re}from"lucide-react";import{useCallback as T,useEffect as E,useMemo as D,useState as O}from"react";import{cn as k}from"@customafk/react-toolkit/utils";import{cva as A}from"class-variance-authority";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{EditorContent as P,useEditor as F,useEditorState as I}from"@tiptap/react";import{CharacterCount as L}from"@tiptap/extension-character-count";import{Highlight as R}from"@tiptap/extension-highlight";import{Link as z}from"@tiptap/extension-link";import{ListKeymap as B}from"@tiptap/extension-list-keymap";import V from"@tiptap/extension-placeholder";import{TaskItem as H}from"@tiptap/extension-task-item";import{TaskList as U}from"@tiptap/extension-task-list";import W from"@tiptap/extension-text-align";import{Color as G,TextStyle as K}from"@tiptap/extension-text-style";import q from"@tiptap/extension-underline";import{BubbleMenu as J}from"@tiptap/react/menus";import Y from"@tiptap/starter-kit";function X({isActive:e,className:t,children:n,...r}){return M(`button`,{type:`button`,"data-slot":`toolbar-button`,"data-active":e||void 0,className:k(`inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,e&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`,t),...r,children:n})}function Z(){return M(`div`,{"data-slot":`toolbar-divider`,className:`mx-0.5 h-5 w-px shrink-0 bg-border`})}function Q({editor:e}){let[t,n]=O(!1),[r,s]=O(``),c=I({editor:e,selector:e=>e.editor.isActive(`link`)}),l=T(t=>{t&&s(e.getAttributes(`link`).href??``),n(t)},[e]),u=T(()=>{let t=r.trim();t&&(e.chain().focus().setLink({href:t,target:`_blank`}).run(),n(!1))},[e,r]),d=T(()=>{e.chain().focus().unsetLink().run(),n(!1)},[e]),f=e=>{e.key===`Enter`&&(e.preventDefault(),u()),e.key===`Escape`&&n(!1)};return N(o,{open:t,onOpenChange:l,children:[M(i,{asChild:!0,children:M(X,{isActive:c,title:`Link (Ctrl+K)`,"data-slot":`toolbar-link-button`,children:M(g,{className:`h-3.5 w-3.5`})})}),N(a,{"data-slot":`link-dialog`,sideOffset:6,align:`start`,className:`w-72 p-3`,children:[M(`p`,{className:`mb-2 font-medium text-text-positive-strong text-xs`,children:c?`Edit Link`:`Insert Link`}),N(`div`,{className:`flex gap-1.5`,children:[M(`input`,{type:`url`,placeholder:`https://example.com`,value:r,onChange:e=>s(e.target.value),onKeyDown:f,autoFocus:!0,className:k(`flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive`,`outline-none placeholder:text-text-positive-muted`,`focus:border-primary focus:ring-1 focus:ring-primary/30`)}),M(`button`,{type:`button`,onClick:u,disabled:!r.trim(),className:k(`rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs`,`transition-colors hover:bg-primary-strong`,`disabled:pointer-events-none disabled:opacity-50`),children:`Apply`})]}),c&&N(`button`,{type:`button`,onClick:d,className:`mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline`,children:[M(_,{className:`h-3 w-3`}),`Remove link`]})]})]})}const ie=A([`flex flex-col overflow-hidden rounded-md`],{variants:{variant:{outline:`border border-border bg-background shadow-xs`,ghost:`border-0`},size:{sm:`text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5`,md:``,lg:`text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3`}},defaultVariants:{variant:`outline`,size:`md`}}),ae=[{label:`Yellow`,value:`#fde047`},{label:`Green`,value:`#86efac`},{label:`Blue`,value:`#93c5fd`},{label:`Pink`,value:`#f9a8d4`},{label:`Orange`,value:`#fdba74`},{label:`Purple`,value:`#c4b5fd`},{label:`Red`,value:`#fca5a5`},{label:`Cyan`,value:`#67e8f9`},{label:`Lime`,value:`#bef264`},{label:`Gray`,value:`#d1d5db`}],oe=[{label:`Default`,value:``},{label:`Red`,value:`#ef4444`},{label:`Orange`,value:`#f97316`},{label:`Yellow`,value:`#eab308`},{label:`Green`,value:`#22c55e`},{label:`Blue`,value:`#3b82f6`},{label:`Purple`,value:`#a855f7`},{label:`Pink`,value:`#ec4899`},{label:`Gray`,value:`#6b7280`},{label:`Black`,value:`#000000`}];function $({editor:g,className:_,enableLink:T,enableTaskList:E,enableHighlight:D,enableColor:O}){let A=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:1})}),P=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:2})}),F=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:3})}),L=I({editor:g,selector:e=>e.editor.isActive(`bold`)}),R=I({editor:g,selector:e=>e.editor.isActive(`italic`)}),z=I({editor:g,selector:e=>e.editor.isActive(`underline`)}),B=I({editor:g,selector:e=>e.editor.isActive(`strike`)}),V=I({editor:g,selector:e=>e.editor.isActive(`code`)}),H=I({editor:g,selector:e=>e.editor.isActive(`bulletList`)}),U=I({editor:g,selector:e=>e.editor.isActive(`orderedList`)}),W=I({editor:g,selector:e=>e.editor.isActive(`taskList`)}),G=I({editor:g,selector:e=>e.editor.isActive(`blockquote`)}),K=I({editor:g,selector:e=>e.editor.isActive(`codeBlock`)}),q=I({editor:g,selector:e=>e.editor.isActive({textAlign:`left`})}),J=I({editor:g,selector:e=>e.editor.isActive({textAlign:`center`})}),Y=I({editor:g,selector:e=>e.editor.isActive({textAlign:`right`})}),ie=I({editor:g,selector:e=>e.editor.isActive({textAlign:`justify`})}),$=A?`H1`:P?`H2`:F?`H3`:`P`;return N(`div`,{"data-slot":`text-editor-toolbar`,className:k(`flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5`,_),children:[M(X,{onClick:()=>g.chain().focus().undo().run(),disabled:!g.can().undo(),title:`Undo (Ctrl+Z)`,children:M(re,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().redo().run(),disabled:!g.can().redo(),title:`Redo (Ctrl+Y)`,children:M(te,{className:`h-3.5 w-3.5`})}),M(Z,{}),N(r,{children:[M(t,{asChild:!0,children:N(`button`,{type:`button`,"data-slot":`toolbar-heading-trigger`,className:k(`inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,(A||P||F)&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`),children:[M(`span`,{className:`w-5 text-center`,children:$}),M(f,{className:`h-3 w-3 opacity-60`})]})}),N(n,{align:`start`,className:`min-w-32`,children:[M(e,{onClick:()=>g.chain().focus().setParagraph().run(),children:M(`span`,{className:`text-sm`,children:`Paragraph`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:1}).run(),children:M(`span`,{className:`font-bold text-lg`,children:`Heading 1`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:2}).run(),children:M(`span`,{className:`font-semibold text-base`,children:`Heading 2`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:3}).run(),children:M(`span`,{className:`font-semibold text-sm`,children:`Heading 3`})})]})]}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBold().run(),isActive:L,title:`Bold (Ctrl+B)`,children:M(d,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleItalic().run(),isActive:R,title:`Italic (Ctrl+I)`,children:M(ee,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleUnderline().run(),isActive:z,title:`Underline (Ctrl+U)`,children:M(ne,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleStrike().run(),isActive:B,title:`Strikethrough`,children:M(w,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleCode().run(),isActive:V,title:`Inline Code`,children:M(p,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBulletList().run(),isActive:H,title:`Bullet List`,children:M(v,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleOrderedList().run(),isActive:U,title:`Ordered List`,children:M(b,{className:`h-3.5 w-3.5`})}),E&&M(X,{onClick:()=>g.chain().focus().toggleTaskList().run(),isActive:W,title:`Task List`,children:M(y,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBlockquote().run(),isActive:G,title:`Blockquote`,children:M(C,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleCodeBlock().run(),isActive:K,title:`Code Block`,children:M(m,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setHorizontalRule().run(),title:`Horizontal Rule`,children:M(x,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`left`).run(),isActive:q,title:`Align Left`,children:M(l,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`center`).run(),isActive:J,title:`Align Center`,children:M(s,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`right`).run(),isActive:Y,title:`Align Right`,children:M(u,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`justify`).run(),isActive:ie,title:`Align Justify`,children:M(c,{className:`h-3.5 w-3.5`})}),T&&N(j,{children:[M(Z,{}),M(Q,{editor:g})]}),(O||D)&&N(j,{children:[M(Z,{}),O&&N(o,{children:[M(i,{asChild:!0,children:M(X,{title:`Text Color`,children:M(S,{className:`h-3.5 w-3.5`})})}),N(a,{align:`start`,className:`w-44 p-2`,children:[M(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Text Color`}),M(`div`,{className:`grid grid-cols-5 gap-1`,children:oe.map(e=>M(`button`,{type:`button`,title:e.label,onClick:()=>{e.value?g.chain().focus().setColor(e.value).run():g.chain().focus().unsetColor().run()},className:k(`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,!e.value&&`bg-background text-[10px] text-text-positive leading-none`),style:e.value?{backgroundColor:e.value}:void 0,children:!e.value&&`∅`},e.label))})]})]}),D&&N(o,{children:[M(i,{asChild:!0,children:M(X,{title:`Highlight`,children:M(h,{className:`h-3.5 w-3.5`})})}),N(a,{align:`start`,className:`w-44 p-2`,children:[M(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Highlight`}),M(`div`,{className:`grid grid-cols-5 gap-1`,children:ae.map(e=>M(`button`,{type:`button`,title:e.label,onClick:()=>g.chain().focus().toggleHighlight({color:e.value}).run(),className:`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,style:{backgroundColor:e.value}},e.label))}),M(`button`,{type:`button`,onClick:()=>g.chain().focus().unsetHighlight().run(),className:`mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted`,children:`Clear highlight`})]})]})]})]})}function se({value:e,defaultValue:t,onChange:n,placeholder:r=`Start writing...`,readOnly:i=!1,showToolbar:a=!0,variant:o,size:s,className:c,toolbarClassName:l,editorClassName:u,maxLength:f,showCharacterCount:p,onCharacterCount:m,enableLink:h,enableBubbleMenu:g,enableTaskList:_,enableHighlight:v,enableColor:y}){let b=f!==void 0||p||m!==void 0,x=y||v,S=F({extensions:D(()=>{let e=[Y,q,V.configure({placeholder:r}),W.configure({types:[`heading`,`paragraph`]}),B];return x&&e.push(K),h&&e.push(z.configure({openOnClick:!1,linkOnPaste:!0,defaultProtocol:`https`})),_&&e.push(U,H.configure({nested:!0})),v&&e.push(R.configure({multicolor:!0})),y&&e.push(G),b&&e.push(L.configure({limit:f})),e},[b,r,f,v,x,_,h,y]),content:e??t,editable:!i,onUpdate:({editor:e})=>{if(n?.(e.getHTML()),m){let t=e.storage.characterCount;m({characters:t.characters(),words:t.words()})}}});E(()=>{!S||e===void 0||S.getHTML()!==e&&S.commands.setContent(e)},[S,e]),E(()=>{S&&S.setEditable(!i)},[S,i]);let C=I({editor:S,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.characters():0}}),te=I({editor:S,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.words():0}}),re=p||f!==void 0,T=f!==void 0&&C>f*.9;return N(`div`,{"data-slot":`text-editor`,className:k(`lunas-text-editor`,ie({variant:o,size:s}),c),children:[a&&!i&&S&&M($,{editor:S,className:l,enableLink:h,enableTaskList:_,enableHighlight:v,enableColor:y}),g&&!i&&S&&N(J,{editor:S,options:{placement:`top`},className:k(`flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown`),children:[M(X,{onClick:()=>S.chain().focus().toggleBold().run(),isActive:S.isActive(`bold`),title:`Bold (Ctrl+B)`,children:M(d,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleItalic().run(),isActive:S.isActive(`italic`),title:`Italic (Ctrl+I)`,children:M(ee,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleUnderline().run(),isActive:S.isActive(`underline`),title:`Underline (Ctrl+U)`,children:M(ne,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleStrike().run(),isActive:S.isActive(`strike`),title:`Strikethrough`,children:M(w,{className:`h-3.5 w-3.5`})}),h&&N(j,{children:[M(Z,{}),M(Q,{editor:S})]})]}),M(P,{editor:S,"data-slot":`text-editor-content`,className:k(`flex-1 bg-white text-sm text-text-positive`,u)}),re&&b&&N(`div`,{"data-slot":`text-editor-footer`,className:`flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs`,children:[N(`span`,{children:[te,` words`]}),N(`span`,{"data-warning":T||void 0,className:`data-warning:text-warning-strong`,children:[C,f?` / ${f}`:``,` characters`]})]})]})}export{$ as n,Q as r,se as t};
2
- //# sourceMappingURL=text-editor-5mA7XyaI.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-editor-5mA7XyaI.mjs","names":["base: AnyExtension[]","Underline","UnderlineIcon"],"sources":["../packages/components/features/text-editor/toolbar-primitives.tsx","../packages/components/features/text-editor/link-dialog.tsx","../packages/components/features/text-editor/text-editor.variants.ts","../packages/components/features/text-editor/toolbar.tsx","../packages/components/features/text-editor/text-editor.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ninterface ToolbarButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isActive?: boolean;\n}\n\nfunction ToolbarButton({ isActive, className, children, ...props }: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"toolbar-button\"\n data-active={isActive || undefined}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n isActive && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nfunction ToolbarDivider() {\n return <div data-slot=\"toolbar-divider\" className=\"mx-0.5 h-5 w-px shrink-0 bg-border\" />;\n}\n\nexport { ToolbarButton, ToolbarDivider };\n// biome-ignore lint/style/useComponentExportOnlyModules: type export needed by sibling feature files\nexport type { ToolbarButtonProps };\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport { Link2, Link2Off } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { ToolbarButton } from './toolbar-primitives';\n\nexport interface LinkDialogProps {\n editor: Editor;\n}\n\nfunction LinkDialog({ editor }: LinkDialogProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [url, setUrl] = useState('');\n\n const isLinkActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('link'),\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n const existingHref = editor.getAttributes('link').href ?? '';\n setUrl(existingHref);\n }\n setIsOpen(open);\n },\n [editor]\n );\n\n const handleApply = useCallback(() => {\n const trimmed = url.trim();\n if (!trimmed) return;\n editor.chain().focus().setLink({ href: trimmed, target: '_blank' }).run();\n setIsOpen(false);\n }, [editor, url]);\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n setIsOpen(false);\n }, [editor]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <ToolbarButton isActive={isLinkActive} title=\"Link (Ctrl+K)\" data-slot=\"toolbar-link-button\">\n <Link2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent data-slot=\"link-dialog\" sideOffset={6} align=\"start\" className=\"w-72 p-3\">\n <p className=\"mb-2 font-medium text-text-positive-strong text-xs\">{isLinkActive ? 'Edit Link' : 'Insert Link'}</p>\n <div className=\"flex gap-1.5\">\n <input\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n className={cn(\n 'flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive',\n 'outline-none placeholder:text-text-positive-muted',\n 'focus:border-primary focus:ring-1 focus:ring-primary/30'\n )}\n />\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!url.trim()}\n className={cn(\n 'rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs',\n 'transition-colors hover:bg-primary-strong',\n 'disabled:pointer-events-none disabled:opacity-50'\n )}\n >\n Apply\n </button>\n </div>\n {isLinkActive && (\n <button type=\"button\" onClick={handleRemove} className=\"mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline\">\n <Link2Off className=\"h-3 w-3\" />\n Remove link\n </button>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { LinkDialog };\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const textEditorVariants = cva(['flex flex-col overflow-hidden rounded-md'], {\n variants: {\n variant: {\n outline: 'border border-border bg-background shadow-xs',\n ghost: 'border-0',\n },\n size: {\n sm: 'text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5',\n md: '',\n lg: 'text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3',\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n },\n});\n\nexport type TextEditorVariantProps = VariantProps<typeof textEditorVariants>;\n","'use client';\n\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Bold,\n ChevronDown,\n Code,\n Code2,\n Highlighter,\n Italic,\n List,\n ListChecks,\n ListOrdered,\n Minus,\n Palette,\n Quote,\n Redo,\n Strikethrough,\n Underline,\n Undo,\n} from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { LinkDialog } from './link-dialog';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nconst HIGHLIGHT_COLORS = [\n { label: 'Yellow', value: '#fde047' },\n { label: 'Green', value: '#86efac' },\n { label: 'Blue', value: '#93c5fd' },\n { label: 'Pink', value: '#f9a8d4' },\n { label: 'Orange', value: '#fdba74' },\n { label: 'Purple', value: '#c4b5fd' },\n { label: 'Red', value: '#fca5a5' },\n { label: 'Cyan', value: '#67e8f9' },\n { label: 'Lime', value: '#bef264' },\n { label: 'Gray', value: '#d1d5db' },\n];\n\nconst TEXT_COLORS = [\n { label: 'Default', value: '' },\n { label: 'Red', value: '#ef4444' },\n { label: 'Orange', value: '#f97316' },\n { label: 'Yellow', value: '#eab308' },\n { label: 'Green', value: '#22c55e' },\n { label: 'Blue', value: '#3b82f6' },\n { label: 'Purple', value: '#a855f7' },\n { label: 'Pink', value: '#ec4899' },\n { label: 'Gray', value: '#6b7280' },\n { label: 'Black', value: '#000000' },\n];\n\nexport interface TextEditorToolbarProps {\n editor: Editor;\n className?: string;\n enableLink?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditorToolbar({ editor, className, enableLink, enableTaskList, enableHighlight, enableColor }: TextEditorToolbarProps) {\n const isHeading1Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 1 }),\n });\n const isHeading2Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 2 }),\n });\n const isHeading3Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 3 }),\n });\n const isBoldActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bold'),\n });\n const isItalicActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('italic'),\n });\n const isUnderlineActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('underline'),\n });\n const isStrikeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('strike'),\n });\n const isCodeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('code'),\n });\n const isBulletListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bulletList'),\n });\n const isOrderedListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('orderedList'),\n });\n const isTaskListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('taskList'),\n });\n const isBlockquoteActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('blockquote'),\n });\n const isCodeBlockActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('codeBlock'),\n });\n const isAlignLeftActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'left' }),\n });\n const isAlignCenterActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'center' }),\n });\n const isAlignRightActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'right' }),\n });\n const isAlignJustifyActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'justify' }),\n });\n\n const headingLabel = isHeading1Active ? 'H1' : isHeading2Active ? 'H2' : isHeading3Active ? 'H3' : 'P';\n\n return (\n <div data-slot=\"text-editor-toolbar\" className={cn('flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5', className)}>\n {/* History */}\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Undo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Y)\">\n <Redo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Heading dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"toolbar-heading-trigger\"\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n (isHeading1Active || isHeading2Active || isHeading3Active) && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary'\n )}\n >\n <span className=\"w-5 text-center\">{headingLabel}</span>\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-32\">\n <DropdownMenuItem onClick={() => editor.chain().focus().setParagraph().run()}>\n <span className=\"text-sm\">Paragraph</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}>\n <span className=\"font-bold text-lg\">Heading 1</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}>\n <span className=\"font-semibold text-base\">Heading 2</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}>\n <span className=\"font-semibold text-sm\">Heading 3</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <ToolbarDivider />\n\n {/* Text formatting */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={isBoldActive} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={isItalicActive} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={isUnderlineActive} title=\"Underline (Ctrl+U)\">\n <Underline className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={isStrikeActive} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} isActive={isCodeActive} title=\"Inline Code\">\n <Code className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Lists */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} isActive={isBulletListActive} title=\"Bullet List\">\n <List className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} isActive={isOrderedListActive} title=\"Ordered List\">\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableTaskList && (\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} isActive={isTaskListActive} title=\"Task List\">\n <ListChecks className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n )}\n\n <ToolbarDivider />\n\n {/* Blocks */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} isActive={isBlockquoteActive} title=\"Blockquote\">\n <Quote className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} isActive={isCodeBlockActive} title=\"Code Block\">\n <Code2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal Rule\">\n <Minus className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Text alignment */}\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('left').run()} isActive={isAlignLeftActive} title=\"Align Left\">\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('center').run()} isActive={isAlignCenterActive} title=\"Align Center\">\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('right').run()} isActive={isAlignRightActive} title=\"Align Right\">\n <AlignRight className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('justify').run()} isActive={isAlignJustifyActive} title=\"Align Justify\">\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n {/* Link */}\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n\n {/* Color & Highlight */}\n {(enableColor || enableHighlight) && (\n <>\n <ToolbarDivider />\n {enableColor && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Text Color\">\n <Palette className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Text Color</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {TEXT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => {\n if (!color.value) {\n editor.chain().focus().unsetColor().run();\n } else {\n editor.chain().focus().setColor(color.value).run();\n }\n }}\n className={cn(\n 'h-6 w-6 rounded border border-border transition-transform hover:scale-110',\n !color.value && 'bg-background text-[10px] text-text-positive leading-none'\n )}\n style={color.value ? { backgroundColor: color.value } : undefined}\n >\n {!color.value && '∅'}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n {enableHighlight && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Highlight\">\n <Highlighter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Highlight</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {HIGHLIGHT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => editor.chain().focus().toggleHighlight({ color: color.value }).run()}\n className=\"h-6 w-6 rounded border border-border transition-transform hover:scale-110\"\n style={{ backgroundColor: color.value }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().unsetHighlight().run()}\n className=\"mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted\"\n >\n Clear highlight\n </button>\n </PopoverContent>\n </Popover>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { TextEditorToolbar };\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Bold, Italic, Strikethrough, Underline as UnderlineIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport { Highlight } from '@tiptap/extension-highlight';\nimport { Link } from '@tiptap/extension-link';\nimport { ListKeymap } from '@tiptap/extension-list-keymap';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { TaskItem } from '@tiptap/extension-task-item';\nimport { TaskList } from '@tiptap/extension-task-list';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Color, TextStyle } from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { type AnyExtension, EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport StarterKit from '@tiptap/starter-kit';\nimport { LinkDialog } from './link-dialog';\nimport { type TextEditorVariantProps, textEditorVariants } from './text-editor.variants';\nimport { TextEditorToolbar } from './toolbar';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nexport interface TextEditorProps extends TextEditorVariantProps {\n value?: string;\n defaultValue?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n showToolbar?: boolean;\n className?: string;\n toolbarClassName?: string;\n editorClassName?: string;\n // Character count\n maxLength?: number;\n showCharacterCount?: boolean;\n onCharacterCount?: (stats: { characters: number; words: number }) => void;\n // Feature flags\n enableLink?: boolean;\n enableBubbleMenu?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditor({\n value,\n defaultValue,\n onChange,\n placeholder = 'Start writing...',\n readOnly = false,\n showToolbar = true,\n variant,\n size,\n className,\n toolbarClassName,\n editorClassName,\n maxLength,\n showCharacterCount,\n onCharacterCount,\n enableLink,\n enableBubbleMenu,\n enableTaskList,\n enableHighlight,\n enableColor,\n}: TextEditorProps) {\n const needsCharCount = maxLength !== undefined || showCharacterCount || onCharacterCount !== undefined;\n const needsTextStyle = enableColor || enableHighlight;\n\n const extensions = useMemo(() => {\n const base: AnyExtension[] = [\n StarterKit,\n Underline,\n Placeholder.configure({ placeholder }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n ListKeymap,\n ];\n\n if (needsTextStyle) base.push(TextStyle);\n if (enableLink) {\n base.push(Link.configure({ openOnClick: false, linkOnPaste: true, defaultProtocol: 'https' }));\n }\n if (enableTaskList) {\n base.push(TaskList, TaskItem.configure({ nested: true }));\n }\n if (enableHighlight) {\n base.push(Highlight.configure({ multicolor: true }));\n }\n if (enableColor) {\n base.push(Color);\n }\n if (needsCharCount) {\n base.push(CharacterCount.configure({ limit: maxLength }));\n }\n\n return base;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needsCharCount, placeholder, maxLength, enableHighlight, needsTextStyle, enableTaskList, enableLink, enableColor]);\n\n const editor = useEditor({\n extensions,\n content: value ?? defaultValue,\n editable: !readOnly,\n onUpdate: ({ editor: e }) => {\n onChange?.(e.getHTML());\n if (onCharacterCount) {\n const storage = e.storage.characterCount;\n onCharacterCount({ characters: storage.characters(), words: storage.words() });\n }\n },\n });\n\n useEffect(() => {\n if (!editor || value === undefined) return;\n if (editor.getHTML() === value) return;\n editor.commands.setContent(value);\n }, [editor, value]);\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n\n const charCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.characters() as number) : 0;\n },\n });\n\n const wordCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.words() as number) : 0;\n },\n });\n\n const showCharCount = showCharacterCount || maxLength !== undefined;\n const isNearLimit = maxLength !== undefined && charCount > maxLength * 0.9;\n\n return (\n <div data-slot=\"text-editor\" className={cn('lunas-text-editor', textEditorVariants({ variant, size }), className)}>\n {showToolbar && !readOnly && editor && (\n <TextEditorToolbar\n editor={editor}\n className={toolbarClassName}\n enableLink={enableLink}\n enableTaskList={enableTaskList}\n enableHighlight={enableHighlight}\n enableColor={enableColor}\n />\n )}\n\n {enableBubbleMenu && !readOnly && editor && (\n <BubbleMenu\n editor={editor}\n options={{ placement: 'top' }}\n className={cn('flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown')}\n >\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={editor.isActive('bold')} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={editor.isActive('italic')} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={editor.isActive('underline')} title=\"Underline (Ctrl+U)\">\n <UnderlineIcon className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={editor.isActive('strike')} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n </BubbleMenu>\n )}\n\n <EditorContent editor={editor} data-slot=\"text-editor-content\" className={cn('flex-1 bg-white text-sm text-text-positive', editorClassName)} />\n\n {showCharCount && needsCharCount && (\n <div\n data-slot=\"text-editor-footer\"\n className=\"flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs\"\n >\n <span>{wordCount} words</span>\n <span data-warning={isNearLimit || undefined} className=\"data-warning:text-warning-strong\">\n {charCount}\n {maxLength ? ` / ${maxLength}` : ''} characters\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport { TextEditor };\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"textarea-7HDXcaK9.mjs","names":[],"sources":["../packages/components/ui/textarea.tsx"],"sourcesContent":["'use client';\nimport { useCallback } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\n/**\n * Styled multi-line text area built on the native `<textarea>` element with resize, focus, and validation state styles.\n *\n * @example\n * ```tsx\n * import { Textarea } from '@customafk/lunas-ui/ui/textarea';\n *\n * <Textarea\n * placeholder=\"Write a description…\"\n * rows={4}\n * onValueChange={(value) => console.log(value)}\n * />\n * ```\n */\nfunction Textarea({\n className,\n onChange,\n onValueChange,\n ...props\n}: React.ComponentProps<'textarea'> & {\n /** Convenience callback that receives the raw string value on every change, bypassing the synthetic event. */\n onValueChange?: (value: string) => void;\n}) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n },\n [onChange, onValueChange]\n );\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n // Base styles\n 'flex min-h-24 w-full bg-transparent px-3 py-2',\n 'rounded shadow-input transition-[color,box-shadow] duration-200',\n 'resize-y text-sm text-text-positive-weak tabular-nums caret-primary',\n\n // Border and shadow styles\n '-outline-offset-1 outline-1 outline-border',\n\n // Placeholder styling\n 'placeholder:text-text-positive-muted',\n\n // State styles\n 'focus:text-text-positive focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n\n // Read-only state\n 'read-only:pointer-events-none read-only:bg-muted-muted read-only:placeholder:text-text-positive-weak',\n\n // Invalid state\n 'aria-invalid:bg-danger-bg-subtle',\n 'aria-invalid:outline-danger',\n 'aria-invalid:ring-danger-weak',\n 'aria-invalid:focus:outline-danger-strong',\n 'aria-invalid:focus:ring-4',\n 'aria-invalid:placeholder:text-text-positive-weak',\n\n // Disabled state\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'disabled:pointer-events-none',\n 'disabled:border-border-weak/50 disabled:bg-secondary-muted/10',\n\n // Additional custom styling\n className\n )}\n {...props}\n onChange={handleChange}\n />\n );\n}\n\nexport { Textarea };\n"],"mappings":"gIAmBA,SAAS,EAAS,CAChB,YACA,WACA,gBACA,GAAG,GAIF,CACD,IAAM,EAAe,EAClB,GAA8C,CAC7C,IAAW,EAAE,CACb,IAAgB,EAAE,OAAO,MAAM,EAEjC,CAAC,EAAU,EAAc,CAC1B,CACD,OACE,EAAC,WAAA,CACC,YAAU,WACV,UAAW,EAET,gDACA,kEACA,sEAGA,6CAGA,uCAGA,6FAGA,uGAGA,mCACA,8BACA,gCACA,2CACA,4BACA,mDAGA,kDACA,+BACA,gEAGA,EACD,CACD,GAAI,EACJ,SAAU,GACV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tooltip-Dxl5Wa8i.mjs","names":["TooltipPrimitive","Tooltip"],"sources":["../packages/components/ui/tooltip.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Tooltip as TooltipPrimitive } from 'radix-ui';\n\n/**\n * Context provider that controls the open delay for all child `Tooltip` components; defaults to `0` ms for instant display.\n *\n * @example\n * ```tsx\n * import { TooltipProvider } from '@customafk/lunas-ui/ui/tooltip';\n *\n * // Wrap at the app root to apply a shared delay:\n * <TooltipProvider delayDuration={300}>\n * <App />\n * </TooltipProvider>\n * ```\n */\nfunction TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />;\n}\n\n/**\n * Floating label that reveals supplementary text when the user hovers or focuses its trigger element.\n *\n * @example\n * ```tsx\n * import { Tooltip, TooltipTrigger, TooltipContent } from '@customafk/lunas-ui/ui/tooltip';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n *\n * <Tooltip>\n * <TooltipTrigger asChild>\n * <Button variant=\"ghost\" size=\"icon\" aria-label=\"Settings\">⚙</Button>\n * </TooltipTrigger>\n * <TooltipContent>Open settings</TooltipContent>\n * </Tooltip>\n * ```\n */\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\n/** Element that opens the tooltip on hover/focus; use `asChild` to forward props to a custom child element. */\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\n/** Floating panel rendered in a portal that displays the tooltip text with a directional arrow. */\nfunction TooltipContent({ className, sideOffset = 0, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-secondary-strong text-text-negative-weak shadow-dropdown outline-none',\n 'fade-in-0 zoom-in-95 animate-in',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n 'z-50 w-fit',\n 'origin-(--radix-tooltip-content-transform-origin)',\n 'text-balance rounded-sm px-3 py-1.5 text-xs',\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-secondary-strong fill-secondary-strong\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n"],"mappings":"yIAmBA,SAAS,EAAgB,CAAE,gBAAgB,EAAG,GAAG,GAAiE,CAChH,OAAO,EAACA,EAAiB,SAAA,CAAS,YAAU,mBAAkC,gBAAe,GAAI,GAAS,CAmB5G,SAASC,EAAQ,CAAE,GAAG,GAA6D,CACjF,OACE,EAAC,EAAA,CAAA,SACC,EAACD,EAAiB,KAAA,CAAK,YAAU,UAAU,GAAI,GAAS,CAAA,CACxC,CAKtB,SAAS,EAAe,CAAE,GAAG,GAAgE,CAC3F,OAAO,EAACA,EAAiB,QAAA,CAAQ,YAAU,kBAAkB,GAAI,GAAS,CAI5E,SAAS,EAAe,CAAE,YAAW,aAAa,EAAG,WAAU,GAAG,GAAgE,CAChI,OACE,EAACA,EAAiB,OAAA,CAAA,SAChB,EAACA,EAAiB,QAAA,CAChB,YAAU,kBACE,aACZ,UAAW,EACT,2EACA,kCACA,kCACA,iCACA,kCACA,yCACA,yCACA,yCACA,yCACA,aACA,oDACA,8CACA,EACD,CACD,GAAI,YAEH,EACD,EAACA,EAAiB,MAAA,CAAM,UAAU,+GAAA,CAAiH,CAAA,EAC1H,CAAA,CACH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-B5nyTWtO.mjs","names":[],"sources":["../packages/types.ts"],"sourcesContent":["export enum ERole {\n SUPER_ADMIN = 'SUPER_ADMIN',\n ADMIN = 'ADMIN',\n MODERATOR = 'MODERATOR',\n STAFF = 'STAFF',\n USER = 'USER',\n}\n\nexport enum ECountry {\n VIETNAM = 'Vietnam',\n USA = 'USA',\n JAPAN = 'Japan',\n KOREA = 'Korea',\n CHINA = 'China',\n TAIWAN = 'Taiwan',\n THAILAND = 'Thailand',\n MALAYSIA = 'Malaysia',\n SINGAPORE = 'Singapore',\n INDONESIA = 'Indonesia',\n}\n\nexport enum EWeightUnit {\n KG = 'kg',\n G = 'g',\n LB = 'lb',\n OZ = 'oz',\n}\n\nexport enum EDimensionUnit {\n CM = 'cm',\n M = 'm',\n INCH = 'inch',\n FT = 'ft',\n}\n\nexport enum EProductStatus {\n DRAFT = 'draft',\n REVIEW = 'review',\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n}\n\nexport enum EProductInventoryStatus {\n IN_STOCK = 'in_stock',\n OUT_OF_STOCK = 'out_of_stock',\n PREORDER = 'preorder',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyEntity = any;\n"],"mappings":"AAAA,IAAY,EAAA,SAAA,EAAL,OACL,GAAA,YAAA,cACA,EAAA,MAAA,QACA,EAAA,UAAA,YACA,EAAA,MAAA,QACA,EAAA,KAAA,cAGU,EAAA,SAAA,EAAL,OACL,GAAA,QAAA,UACA,EAAA,IAAA,MACA,EAAA,MAAA,QACA,EAAA,MAAA,QACA,EAAA,MAAA,QACA,EAAA,OAAA,SACA,EAAA,SAAA,WACA,EAAA,SAAA,WACA,EAAA,UAAA,YACA,EAAA,UAAA"}
@@ -1 +0,0 @@
1
- "use client";import{n as e,t}from"../paragraph-DYLaQtTV.mjs";export{t as Paragraph,e as paragraphVariants};
@@ -1 +0,0 @@
1
- {"version":3,"file":"title.mjs","names":[],"sources":["../../packages/components/typography/title.tsx"],"sourcesContent":["'use client';\n\nimport type { JSX, ReactNode } from 'react';\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { cva } from 'class-variance-authority';\n\nconst titleVariants = cva('scroll-m-20 text-start text-balance text-text-positive-strong tracking-tight transition-colors', {\n variants: {\n level: {\n 1: 'text-3xl leading-tight font-bold md:text-4xl',\n 2: 'text-2xl leading-tight font-semibold md:text-3xl',\n 3: 'text-xl leading-snug font-semibold md:text-2xl',\n 4: 'text-lg leading-snug font-semibold md:text-xl',\n 5: 'text-base leading-normal font-semibold md:text-lg',\n 6: 'text-sm leading-normal font-semibold md:text-base',\n },\n },\n defaultVariants: {\n level: 1,\n },\n});\n\nexport type TitleProps = {\n /**\n * Heading level that maps to the rendered HTML tag (`h1`–`h6`) and the corresponding\n * typographic scale variant.\n * - `1` — `text-3xl / md:text-4xl`, bold (default)\n * - `2` — `text-2xl / md:text-3xl`, semibold\n * - `3` — `text-xl / md:text-2xl`, semibold\n * - `4` — `text-lg / md:text-xl`, semibold\n * - `5` — `text-base / md:text-lg`, semibold\n * - `6` — `text-sm / md:text-base`, semibold\n * @default 1\n */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** Additional Tailwind classes merged with the variant classes. */\n className?: string;\n /** Content rendered inside the heading element. */\n children?: ReactNode;\n};\n\n/**\n * A semantic heading component that renders the correct `h1`–`h6` element and applies a matched typographic scale.\n *\n * @example\n * ```tsx\n * import { Title } from '@customafk/lunas-ui/typography/title';\n *\n * // Page-level heading (renders <h1>)\n * <Title level={1}>Welcome to Lunas</Title>\n *\n * // Section sub-heading (renders <h3>)\n * <Title level={3}>Account Settings</Title>\n * ```\n */\nexport const Title = ({ level = 1, className, children }: TitleProps) => {\n const Comp = ('h' + level) as keyof JSX.IntrinsicElements;\n return (\n <Comp data-slot=\"title\" className={cn(titleVariants({ level }), className)}>\n {children}\n </Comp>\n );\n};\n"],"mappings":"wJAMA,MAAM,EAAgB,EAAI,iGAAkG,CAC1H,SAAU,CACR,MAAO,CACL,EAAG,+CACH,EAAG,mDACH,EAAG,iDACH,EAAG,gDACH,EAAG,oDACH,EAAG,oDACJ,CACF,CACD,gBAAiB,CACf,MAAO,EACR,CACF,CAAC,CAmCW,GAAS,CAAE,QAAQ,EAAG,YAAW,cAG1C,EAFY,IAAM,EAAA,CAEZ,YAAU,QAAQ,UAAW,EAAG,EAAc,CAAE,QAAO,CAAC,CAAE,EAAU,CACvE,YACI"}
@@ -1,2 +0,0 @@
1
- "use client";import{n as e}from"../button.variants-DkMqWB8G.mjs";import{t}from"../heading-De4Pn3mZ.mjs";import{n}from"../paragraph-DYLaQtTV.mjs";import{cn as r}from"@customafk/react-toolkit/utils";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{AlertDialog as o}from"radix-ui";function s({...e}){return i(o.Root,{"data-slot":`alert-dialog`,...e})}function c({...e}){return i(o.Trigger,{"data-slot":`alert-dialog-trigger`,...e})}function l({...e}){return i(o.Portal,{"data-slot":`alert-dialog-portal`,...e})}function u({className:e,...t}){return i(o.Overlay,{"data-slot":`alert-dialog-overlay`,style:{pointerEvents:`none`},className:r(`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`,e),...t})}function d({className:e,...t}){return a(l,{children:[i(u,{}),i(o.Content,{"data-slot":`alert-dialog-content`,className:r(`bg-background`,`fixed z-50`,`-translate-1/2 top-1/2 left-1/2`,`grid w-full max-w-[calc(100%-2rem)] sm:max-w-lg`,`gap-4 rounded-lg p-6 shadow-lg duration-200`,`data-[state=open]:animate-in`,`data-[state=open]:fade-in-0`,`data-[state=open]:zoom-in-95`,`data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0`,`data-[state=closed]:zoom-out-95`,e),...t})]})}function f({className:e,...t}){return i(`div`,{"data-slot":`alert-dialog-header`,className:r(`flex flex-col gap-2 text-center sm:text-left`,e),...t})}function p({className:e,...t}){return i(`div`,{"data-slot":`alert-dialog-footer`,className:r(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,e),...t})}function m({className:e,...n}){return i(o.Title,{"data-slot":`alert-dialog-title`,className:r(t({level:`h3`}),e),...n})}function h({className:e,...t}){return i(o.Description,{"data-slot":`alert-dialog-description`,className:r(n({variant:`muted`}),`not-first:mt-0`,e),...t})}function g({className:t,...n}){return i(o.Action,{className:r(e(),`min-w-24`,t),...n,autoFocus:!0,tabIndex:1})}function _({className:t,...n}){return i(o.Cancel,{className:r(e({variant:`outline`,color:`muted`}),`min-w-24`,t),...n})}export{s as AlertDialog,g as AlertDialogAction,_ as AlertDialogCancel,d as AlertDialogContent,h as AlertDialogDescription,p as AlertDialogFooter,f as AlertDialogHeader,u as AlertDialogOverlay,l as AlertDialogPortal,m as AlertDialogTitle,c as AlertDialogTrigger};
2
- //# sourceMappingURL=alert-dialog.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"alert-dialog.mjs","names":["AlertDialogPrimitive"],"sources":["../../packages/components/ui/alert-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { AlertDialog as AlertDialogPrimitive } from 'radix-ui';\nimport { headingVariants } from '../typography/heading';\nimport { paragraphVariants } from '../typography/paragraph';\nimport { buttonVariants } from './button.variants';\n\n/**\n * Accessible alert dialog built on Radix UI's AlertDialog primitives, requiring explicit user confirmation before a destructive action can proceed.\n *\n * @example\n * ```tsx\n * import {\n * AlertDialog, AlertDialogTrigger, AlertDialogContent,\n * AlertDialogHeader, AlertDialogTitle, AlertDialogDescription,\n * AlertDialogFooter, AlertDialogAction, AlertDialogCancel,\n * } from '@customafk/lunas-ui/ui/alert-dialog';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n *\n * <AlertDialog>\n * <AlertDialogTrigger asChild>\n * <Button variant=\"solid\" color=\"danger\">Delete account</Button>\n * </AlertDialogTrigger>\n * <AlertDialogContent>\n * <AlertDialogHeader>\n * <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>\n * <AlertDialogDescription>\n * This action cannot be undone. Your account will be permanently deleted.\n * </AlertDialogDescription>\n * </AlertDialogHeader>\n * <AlertDialogFooter>\n * <AlertDialogCancel>Cancel</AlertDialogCancel>\n * <AlertDialogAction>Continue</AlertDialogAction>\n * </AlertDialogFooter>\n * </AlertDialogContent>\n * </AlertDialog>\n * ```\n */\nfunction AlertDialog({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\n/** Element that opens the alert dialog when clicked; typically wrapped with `asChild` around a `Button`. */\nfunction AlertDialogTrigger({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />;\n}\n\n/** Renders alert dialog overlay and content into a portal outside the normal React tree. */\nfunction AlertDialogPortal({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />;\n}\n\n/** Semi-transparent backdrop rendered behind the alert dialog panel; pointer events are disabled to prevent accidental dismissal. */\nfunction AlertDialogOverlay({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n style={{ pointerEvents: 'none' }}\n className={cn(\n 'fixed inset-0 z-50 bg-black/50',\n 'data-[state=open]:animate-in',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Animated panel that contains the alert dialog body; renders via `AlertDialogPortal` over `AlertDialogOverlay`. */\nfunction AlertDialogContent({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n 'bg-background',\n 'fixed z-50',\n '-translate-1/2 top-1/2 left-1/2',\n 'grid w-full max-w-[calc(100%-2rem)] sm:max-w-lg',\n 'gap-4 rounded-lg p-6 shadow-lg duration-200',\n 'data-[state=open]:animate-in',\n 'data-[state=open]:fade-in-0',\n 'data-[state=open]:zoom-in-95',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=closed]:zoom-out-95',\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\n/** Layout wrapper for the alert dialog title and description. */\nfunction AlertDialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"alert-dialog-header\" className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />;\n}\n\n/** Layout wrapper for the cancel and action buttons at the bottom of the alert dialog. */\nfunction AlertDialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"alert-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 alert dialog, styled with the h3 heading variant. */\nfunction AlertDialogTitle({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return <AlertDialogPrimitive.Title data-slot=\"alert-dialog-title\" className={cn(headingVariants({ level: 'h3' }), className)} {...props} />;\n}\n\n/** Muted supporting text that explains the consequences of the destructive action. */\nfunction AlertDialogDescription({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(paragraphVariants({ variant: 'muted' }), 'not-first:mt-0', className)}\n {...props}\n />\n );\n}\n\n/** Confirm button that closes the dialog and proceeds with the action; auto-focused and styled as the primary action. */\nfunction AlertDialogAction({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return <AlertDialogPrimitive.Action className={cn(buttonVariants(), 'min-w-24', className)} {...props} autoFocus tabIndex={1} />;\n}\n\n/** Cancel button that closes the alert dialog without performing the destructive action. */\nfunction AlertDialogCancel({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return <AlertDialogPrimitive.Cancel className={cn(buttonVariants({ variant: 'outline', color: 'muted' }), 'min-w-24', className)} {...props} />;\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n};\n"],"mappings":"8RAwCA,SAAS,EAAY,CAAE,GAAG,GAAiE,CACzF,OAAO,EAACA,EAAqB,KAAA,CAAK,YAAU,eAAe,GAAI,GAAS,CAI1E,SAAS,EAAmB,CAAE,GAAG,GAAoE,CACnG,OAAO,EAACA,EAAqB,QAAA,CAAQ,YAAU,uBAAuB,GAAI,GAAS,CAIrF,SAAS,EAAkB,CAAE,GAAG,GAAmE,CACjG,OAAO,EAACA,EAAqB,OAAA,CAAO,YAAU,sBAAsB,GAAI,GAAS,CAInF,SAAS,EAAmB,CAAE,YAAW,GAAG,GAAoE,CAC9G,OACE,EAACA,EAAqB,QAAA,CACpB,YAAU,uBACV,MAAO,CAAE,cAAe,OAAQ,CAChC,UAAW,EACT,iCACA,+BACA,kCACA,iCACA,8BACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAmB,CAAE,YAAW,GAAG,GAAoE,CAC9G,OACE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,EAAA,CAAqB,CACtB,EAACA,EAAqB,QAAA,CACpB,YAAU,uBACV,UAAW,EACT,gBACA,aACA,kCACA,kDACA,8CACA,+BACA,8BACA,+BACA,kCACA,iCACA,kCACA,EACD,CACD,GAAI,GACJ,CAAA,CAAA,CACgB,CAKxB,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAsC,CAC/E,OAAO,EAAC,MAAA,CAAI,YAAU,sBAAsB,UAAW,EAAG,+CAAgD,EAAU,CAAE,GAAI,GAAS,CAIrI,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAsC,CAC/E,OAAO,EAAC,MAAA,CAAI,YAAU,sBAAsB,UAAW,EAAG,yDAA0D,EAAU,CAAE,GAAI,GAAS,CAI/I,SAAS,EAAiB,CAAE,YAAW,GAAG,GAAkE,CAC1G,OAAO,EAACA,EAAqB,MAAA,CAAM,YAAU,qBAAqB,UAAW,EAAG,EAAgB,CAAE,MAAO,KAAM,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS,CAI7I,SAAS,EAAuB,CAAE,YAAW,GAAG,GAAwE,CACtH,OACE,EAACA,EAAqB,YAAA,CACpB,YAAU,2BACV,UAAW,EAAG,EAAkB,CAAE,QAAS,QAAS,CAAC,CAAE,iBAAkB,EAAU,CACnF,GAAI,GACJ,CAKN,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAmE,CAC5G,OAAO,EAACA,EAAqB,OAAA,CAAO,UAAW,EAAG,GAAgB,CAAE,WAAY,EAAU,CAAE,GAAI,EAAO,UAAA,GAAU,SAAU,GAAK,CAIlI,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAmE,CAC5G,OAAO,EAACA,EAAqB,OAAA,CAAO,UAAW,EAAG,EAAe,CAAE,QAAS,UAAW,MAAO,QAAS,CAAC,CAAE,WAAY,EAAU,CAAE,GAAI,GAAS"}
package/dist/ui/alert.mjs DELETED
@@ -1 +0,0 @@
1
- "use client";import{n as e,r as t,t as n}from"../alert-BbvPwf2x.mjs";export{n as Alert,e as AlertDescription,t as AlertTitle};
@@ -1 +0,0 @@
1
- {"version":3,"file":"aspect-ratio.mjs","names":["AspectRatioPrimitive"],"sources":["../../packages/components/ui/aspect-ratio.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { AspectRatio as AspectRatioPrimitive } from 'radix-ui';\n\n/**\n * Constrains its child to a given aspect ratio using the Radix UI AspectRatio primitive.\n *\n * @example\n * ```tsx\n * import { AspectRatio } from '@customafk/lunas-ui/ui/aspect-ratio';\n *\n * <AspectRatio ratio={16 / 9}>\n * <img src=\"/banner.jpg\" alt=\"Banner\" className=\"size-full object-cover\" />\n * </AspectRatio>\n * ```\n */\nfunction AspectRatio({ className, ...props }: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {\n return <AspectRatioPrimitive.Root data-slot=\"aspect-ratio\" className={cn('bg-secondary-muted rounded-md', className)} {...props} />;\n}\n\nexport { AspectRatio };\n"],"mappings":"gJAiBA,SAAS,EAAY,CAAE,YAAW,GAAG,GAAiE,CACpG,OAAO,EAACA,EAAqB,KAAA,CAAK,YAAU,eAAe,UAAW,EAAG,gCAAiC,EAAU,CAAE,GAAI,GAAS"}
@@ -1 +0,0 @@
1
- "use client";import{n as e,r as t,t as n}from"../avatar-fltdRVsJ.mjs";export{n as Avatar,e as AvatarFallback,t as AvatarImage};
@@ -1,2 +0,0 @@
1
- import { n as BadgeProps, r as badgeVariants, t as Badge } from "../badge-BxSbkHQL.mjs";
2
- export { Badge, BadgeProps, badgeVariants };
package/dist/ui/badge.mjs DELETED
@@ -1 +0,0 @@
1
- "use client";import{n as e,t}from"../badge-CDGBGq8X.mjs";export{t as Badge,e as badgeVariants};
@@ -1,2 +0,0 @@
1
- "use client";import{t as e}from"../dist-DVrfqn8H.mjs";import{ChevronRight as t,MoreHorizontal as n}from"lucide-react";import{cn as r}from"@customafk/react-toolkit/utils";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o({className:e,...t}){return i(`nav`,{"aria-label":`breadcrumb`,"data-slot":`breadcrumb`,className:r(``,e),...t})}function s({className:e,...t}){return i(`ol`,{"data-slot":`breadcrumb-list`,className:r(`flex flex-wrap items-center gap-1.5 sm:gap-2.5`,`text-sm break-words`,`text-text-positive-weak`,e),...t})}function c({className:e,...t}){return i(`li`,{"data-slot":`breadcrumb-item`,className:r(`inline-flex items-center gap-1.5`,e),...t})}function l({asChild:t,className:n,...a}){return i(t?e:`a`,{"data-slot":`breadcrumb-link`,className:r(`text-text-positive-weak`,`transition-colors duration-150`,`hover:text-text-positive focus-visible:text-text-positive`,`focus-visible:ring-ring focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1`,`rounded-sm`,n),...a})}function u({className:e,...t}){return i(`span`,{"data-slot":`breadcrumb-page`,"aria-current":`page`,className:r(`text-text-positive-strong font-medium`,e),...t})}function d({children:e,className:n,...a}){return i(`li`,{"data-slot":`breadcrumb-separator`,role:`presentation`,"aria-hidden":`true`,className:r(`text-text-positive-muted`,`[&>svg]:size-3.5`,n),...a,children:e??i(t,{})})}function f({className:e,...t}){return a(`button`,{"data-slot":`breadcrumb-ellipsis`,type:`button`,className:r(`flex items-center justify-center`,`size-8 rounded-sm`,`text-text-positive-weak`,`hover:bg-secondary-muted hover:text-text-positive`,`focus-visible:ring-ring focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1`,`transition-colors duration-150`,e),...t,children:[i(n,{className:`size-4`}),i(`span`,{className:`sr-only`,children:`Show more breadcrumbs`})]})}export{o as Breadcrumb,f as BreadcrumbEllipsis,c as BreadcrumbItem,l as BreadcrumbLink,s as BreadcrumbList,u as BreadcrumbPage,d as BreadcrumbSeparator};
2
- //# sourceMappingURL=breadcrumb.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"breadcrumb.mjs","names":[],"sources":["../../packages/components/ui/breadcrumb.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { ChevronRight, MoreHorizontal } from 'lucide-react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\n/**\n * Root breadcrumb navigation `<nav>` element with accessible aria-label.\n *\n * @example\n * ```tsx\n * import {\n * Breadcrumb, BreadcrumbList, BreadcrumbItem,\n * BreadcrumbLink, BreadcrumbSeparator, BreadcrumbPage,\n * } from '@customafk/lunas-ui/ui/breadcrumb';\n *\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/\">Home</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Settings</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n * ```\n */\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<'nav'>) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" className={cn('', className)} {...props} />;\n}\n\n/** Ordered list `<ol>` container that lays out breadcrumb items horizontally with wrapping. */\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn('flex flex-wrap items-center gap-1.5 sm:gap-2.5', 'text-sm break-words', 'text-text-positive-weak', className)}\n {...props}\n />\n );\n}\n\n/** Individual `<li>` item wrapper inside a BreadcrumbList. */\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"breadcrumb-item\" className={cn('inline-flex items-center gap-1.5', className)} {...props} />;\n}\n\n/**\n * Interactive anchor link for non-current breadcrumb segments; supports `asChild` for custom routing.\n *\n * @param asChild - When true, renders as the child element via Radix Slot instead of `<a>`.\n */\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\n 'text-text-positive-weak',\n 'transition-colors duration-150',\n 'hover:text-text-positive focus-visible:text-text-positive',\n 'focus-visible:ring-ring focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n 'rounded-sm',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Non-interactive span representing the current page; sets `aria-current=\"page\"`. */\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {\n return <span data-slot=\"breadcrumb-page\" aria-current=\"page\" className={cn('text-text-positive-strong font-medium', className)} {...props} />;\n}\n\n/** Visual separator `<li>` rendered between breadcrumb items; defaults to a right chevron icon. */\nfunction BreadcrumbSeparator({ children, className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('text-text-positive-muted', '[&>svg]:size-3.5', className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\n/** Button that represents collapsed breadcrumb segments with an ellipsis icon. */\nfunction BreadcrumbEllipsis({ className, ...props }: React.ComponentProps<'button'>) {\n return (\n <button\n data-slot=\"breadcrumb-ellipsis\"\n type=\"button\"\n className={cn(\n 'flex items-center justify-center',\n 'size-8 rounded-sm',\n 'text-text-positive-weak',\n 'hover:bg-secondary-muted hover:text-text-positive',\n 'focus-visible:ring-ring focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n 'transition-colors duration-150',\n className\n )}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">Show more breadcrumbs</span>\n </button>\n );\n}\n\nexport { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator };\n"],"mappings":"4NA+BA,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OAAO,EAAC,MAAA,CAAI,aAAW,aAAa,YAAU,aAAa,UAAW,EAAG,GAAI,EAAU,CAAE,GAAI,GAAS,CAIxG,SAAS,EAAe,CAAE,YAAW,GAAG,GAAqC,CAC3E,OACE,EAAC,KAAA,CACC,YAAU,kBACV,UAAW,EAAG,iDAAkD,sBAAuB,0BAA2B,EAAU,CAC5H,GAAI,GACJ,CAKN,SAAS,EAAe,CAAE,YAAW,GAAG,GAAqC,CAC3E,OAAO,EAAC,KAAA,CAAG,YAAU,kBAAkB,UAAW,EAAG,mCAAoC,EAAU,CAAE,GAAI,GAAS,CAQpH,SAAS,EAAe,CACtB,UACA,YACA,GAAG,GAGF,CAGD,OACE,EAHW,EAAU,EAAO,IAAA,CAI1B,YAAU,kBACV,UAAW,EACT,0BACA,iCACA,4DACA,8FACA,aACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAe,CAAE,YAAW,GAAG,GAAuC,CAC7E,OAAO,EAAC,OAAA,CAAK,YAAU,kBAAkB,eAAa,OAAO,UAAW,EAAG,wCAAyC,EAAU,CAAE,GAAI,GAAS,CAI/I,SAAS,EAAoB,CAAE,WAAU,YAAW,GAAG,GAAqC,CAC1F,OACE,EAAC,KAAA,CACC,YAAU,uBACV,KAAK,eACL,cAAY,OACZ,UAAW,EAAG,2BAA4B,mBAAoB,EAAU,CACxE,GAAI,WAEH,GAAY,EAAC,EAAA,EAAA,CAAe,EAC1B,CAKT,SAAS,EAAmB,CAAE,YAAW,GAAG,GAAyC,CACnF,OACE,EAAC,SAAA,CACC,YAAU,sBACV,KAAK,SACL,UAAW,EACT,mCACA,oBACA,0BACA,oDACA,8FACA,iCACA,EACD,CACD,GAAI,YAEJ,EAAC,EAAA,CAAe,UAAU,SAAA,CAAW,CACrC,EAAC,OAAA,CAAK,UAAU,mBAAU,yBAA4B,CAAA,EAC/C"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"../dist-DVrfqn8H.mjs";import{t}from"../separator-D3Gmkxzq.mjs";import{cn as n}from"@customafk/react-toolkit/utils";import{cva as r}from"class-variance-authority";import{jsx as i}from"react/jsx-runtime";const a=r(`flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1`,{variants:{orientation:{horizontal:`[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none`,vertical:`flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none`}},defaultVariants:{orientation:`horizontal`}});function o({className:e,orientation:t,...r}){return i(`div`,{role:`group`,"data-slot":`button-group`,"data-orientation":t,className:n(a({orientation:t}),e),...r})}function s({className:t,asChild:r=!1,...a}){return i(r?e:`div`,{className:n(`flex items-center gap-2 rounded-md border border-border bg-muted px-4 font-medium text-sm shadow-xs [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none`,t),...a})}function c({className:e,orientation:r=`vertical`,...a}){return i(t,{"data-slot":`button-group-separator`,orientation:r,className:n(`relative m-0! self-stretch bg-muted-muted data-[orientation=vertical]:h-auto`,e),...a})}export{o as ButtonGroup,c as ButtonGroupSeparator,s as ButtonGroupText,a as buttonGroupVariants};
2
- //# sourceMappingURL=button-group.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"button-group.mjs","names":[],"sources":["../../packages/components/ui/button-group.tsx"],"sourcesContent":["import { cn } from '@customafk/react-toolkit/utils';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Separator } from '@/components/ui/separator';\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal: '[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none',\n vertical: 'flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * Groups buttons (or inputs) into a visually connected row or column by removing the border radii on adjacent sides.\n *\n * @example\n * ```tsx\n * import { ButtonGroup, ButtonGroupSeparator } from '@customafk/lunas-ui/ui/button-group';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n *\n * <ButtonGroup orientation=\"horizontal\">\n * <Button variant=\"outline\">Left</Button>\n * <ButtonGroupSeparator />\n * <Button variant=\"outline\">Right</Button>\n * </ButtonGroup>\n * ```\n */\nfunction ButtonGroup({ className, orientation, ...props }: React.ComponentProps<'div'> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div role=\"group\" data-slot=\"button-group\" data-orientation={orientation} className={cn(buttonGroupVariants({ orientation }), className)} {...props} />\n );\n}\n\n/**\n * A static text or icon addon rendered inside a ButtonGroup with muted background styling.\n *\n * @param asChild - When true, renders as the child element via Radix Slot instead of `<div>`.\n */\nfunction ButtonGroupText({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n className={cn(\n \"flex items-center gap-2 rounded-md border border-border bg-muted px-4 font-medium text-sm shadow-xs [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className\n )}\n {...props}\n />\n );\n}\n\n/** A visual Separator rendered between items inside a ButtonGroup. */\nfunction ButtonGroupSeparator({ className, orientation = 'vertical', ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn('relative m-0! self-stretch bg-muted-muted data-[orientation=vertical]:h-auto', className)}\n {...props}\n />\n );\n}\n\nexport { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants };\n"],"mappings":"6NAMA,MAAM,EAAsB,EAC1B,2RACA,CACE,SAAU,CACR,YAAa,CACX,WAAY,kHACZ,SAAU,2HACX,CACF,CACD,gBAAiB,CACf,YAAa,aACd,CACF,CACF,CAiBD,SAAS,EAAY,CAAE,YAAW,cAAa,GAAG,GAAiF,CACjI,OACE,EAAC,MAAA,CAAI,KAAK,QAAQ,YAAU,eAAe,mBAAkB,EAAa,UAAW,EAAG,EAAoB,CAAE,cAAa,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS,CAS3J,SAAS,EAAgB,CACvB,YACA,UAAU,GACV,GAAG,GAGF,CAGD,OACE,EAHW,EAAU,EAAO,MAAA,CAI1B,UAAW,EACT,uKACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAqB,CAAE,YAAW,cAAc,WAAY,GAAG,GAAiD,CACvH,OACE,EAAC,EAAA,CACC,YAAU,yBACG,cACb,UAAW,EAAG,+EAAgF,EAAU,CACxG,GAAI,GACJ"}
@@ -1,2 +0,0 @@
1
- import { n as ButtonProps, t as Button } from "../button-D3d7M90P.mjs";
2
- export { Button, ButtonProps };
@@ -1 +0,0 @@
1
- "use client";import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";export{e as Button};
@@ -1,2 +0,0 @@
1
- import"../../button.variants-DkMqWB8G.mjs";import{t as e}from"../../button-CCVJTHBI.mjs";import{t}from"../../paragraph-DYLaQtTV.mjs";import{PlusIcon as n}from"lucide-react";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({onClick:a=()=>{}})=>i(e,{"aria-label":`Tạo mới`,variant:`outline`,color:`muted`,className:`outline-border-weak max-sm:aspect-square max-sm:size-9 max-sm:p-0`,onClick:a,children:[r(n,{className:`opacity-60 sm:-ms-1`,size:16,"aria-hidden":`true`}),r(t,{variant:`sm`,className:`max-sm:sr-only`,children:`Create`})]});export{a as AddNewBtn};
2
- //# sourceMappingURL=add-new.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-new.mjs","names":["AddNewBtn: React.FC<React.PropsWithChildren<Props>>"],"sources":["../../../packages/components/ui/buttons/add-new.tsx"],"sourcesContent":["import { PlusIcon } from 'lucide-react';\n\nimport { Paragraph } from '@/components/typography/paragraph';\n\nimport { Button } from '../button';\n\ntype Props = {\n /** Callback invoked when the button is clicked. Defaults to a no-op. */\n onClick?: () => void;\n};\n\n/**\n * A toolbar button that triggers a \"create new\" action, displaying a plus icon alongside a \"Create\" label that is hidden on small screens.\n *\n * @example\n * import { AddNewBtn } from '@customafk/lunas-ui/ui/buttons/add-new';\n *\n * <AddNewBtn onClick={() => setOpen(true)} />\n */\nexport const AddNewBtn: React.FC<React.PropsWithChildren<Props>> = ({ onClick = () => {} }) => {\n return (\n <Button\n aria-label=\"Tạo mới\"\n variant=\"outline\"\n color=\"muted\"\n className=\"outline-border-weak max-sm:aspect-square max-sm:size-9 max-sm:p-0\"\n onClick={onClick}\n >\n <PlusIcon className=\"opacity-60 sm:-ms-1\" size={16} aria-hidden=\"true\" />\n <Paragraph variant=\"sm\" className=\"max-sm:sr-only\">\n Create\n </Paragraph>\n </Button>\n );\n};\n"],"mappings":"+NAmBA,MAAaA,GAAuD,CAAE,cAAgB,MAElF,EAAC,EAAA,CACC,aAAW,UACX,QAAQ,UACR,MAAM,QACN,UAAU,oEACD,oBAET,EAAC,EAAA,CAAS,UAAU,sBAAsB,KAAM,GAAI,cAAY,QAAS,CACzE,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,0BAAiB,UAEvC,CAAA,EACL"}
@@ -1,2 +0,0 @@
1
- import"../../button.variants-DkMqWB8G.mjs";import{t as e}from"../../button-CCVJTHBI.mjs";import{Edit2Icon as t}from"lucide-react";import{jsx as n}from"react/jsx-runtime";const r=({onClick:r})=>n(e,{"aria-label":`Chỉnh sửa`,variant:`ghost`,color:`secondary`,size:`icon`,className:`max-sm:aspect-square max-sm:p-0`,onClick:r,children:n(t,{size:16,className:`opacity-60`})});export{r as EditBtn};
2
- //# sourceMappingURL=edit.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"edit.mjs","names":["EditBtn: React.FC<Props>"],"sources":["../../../packages/components/ui/buttons/edit.tsx"],"sourcesContent":["import { Edit2Icon } from 'lucide-react';\n\nimport { Button } from '../button';\n\ntype Props = {\n /** Callback invoked when the button is clicked. */\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n};\n\n/**\n * An icon-only ghost button that triggers an edit action, rendered with a pencil icon.\n *\n * @example\n * import { EditBtn } from '@customafk/lunas-ui/ui/buttons/edit';\n *\n * <EditBtn onClick={() => openEditDialog(record.id)} />\n */\nexport const EditBtn: React.FC<Props> = ({ onClick }) => {\n return (\n <Button aria-label=\"Chỉnh sửa\" variant=\"ghost\" color=\"secondary\" size=\"icon\" className=\"max-sm:aspect-square max-sm:p-0\" onClick={onClick}>\n <Edit2Icon size={16} className=\"opacity-60\" />\n </Button>\n );\n};\n"],"mappings":"0KAiBA,MAAaA,GAA4B,CAAE,aAEvC,EAAC,EAAA,CAAO,aAAW,YAAY,QAAQ,QAAQ,MAAM,YAAY,KAAK,OAAO,UAAU,kCAA2C,mBAChI,EAAC,EAAA,CAAU,KAAM,GAAI,UAAU,cAAe,EACvC"}
@@ -1,2 +0,0 @@
1
- import"../../button.variants-DkMqWB8G.mjs";import{t as e}from"../../button-CCVJTHBI.mjs";import{t}from"../../paragraph-DYLaQtTV.mjs";import{RefreshCwIcon as n}from"lucide-react";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({onClick:a=()=>{}})=>i(e,{"aria-label":`Tạo mới`,variant:`outline`,color:`muted`,className:`outline-border-weak max-sm:aspect-square max-sm:size-9 max-sm:p-0`,onClick:a,children:[r(n,{className:`opacity-60 sm:-ms-1`,size:16,"aria-hidden":`true`}),r(t,{variant:`sm`,className:`max-sm:sr-only`,children:`Reset`})]});export{a as RefreshBtn};
2
- //# sourceMappingURL=refresh.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"refresh.mjs","names":["RefreshBtn: React.FC<React.PropsWithChildren<Props>>"],"sources":["../../../packages/components/ui/buttons/refresh.tsx"],"sourcesContent":["import { RefreshCwIcon } from 'lucide-react';\n\nimport { Paragraph } from '@/components/typography/paragraph';\n\nimport { Button } from '../button';\n\ntype Props = {\n /** Callback invoked when the button is clicked. Defaults to a no-op. */\n onClick?: () => void;\n};\n\n/**\n * A toolbar button that triggers a refresh/reset action, displaying a rotating arrows icon alongside a \"Reset\" label that is hidden on small screens.\n *\n * @example\n * import { RefreshBtn } from '@customafk/lunas-ui/ui/buttons/refresh';\n *\n * <RefreshBtn onClick={() => resetFilters()} />\n */\nexport const RefreshBtn: React.FC<React.PropsWithChildren<Props>> = ({ onClick = () => {} }) => {\n return (\n <Button\n aria-label=\"Tạo mới\"\n variant=\"outline\"\n color=\"muted\"\n className=\"outline-border-weak max-sm:aspect-square max-sm:size-9 max-sm:p-0\"\n onClick={onClick}\n >\n <RefreshCwIcon className=\"opacity-60 sm:-ms-1\" size={16} aria-hidden=\"true\" />\n <Paragraph variant=\"sm\" className=\"max-sm:sr-only\">\n Reset\n </Paragraph>\n </Button>\n );\n};\n"],"mappings":"oOAmBA,MAAaA,GAAwD,CAAE,cAAgB,MAEnF,EAAC,EAAA,CACC,aAAW,UACX,QAAQ,UACR,MAAM,QACN,UAAU,oEACD,oBAET,EAAC,EAAA,CAAc,UAAU,sBAAsB,KAAM,GAAI,cAAY,QAAS,CAC9E,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,0BAAiB,SAEvC,CAAA,EACL"}
@@ -1,2 +0,0 @@
1
- import"../../button.variants-DkMqWB8G.mjs";import{t as e}from"../../button-CCVJTHBI.mjs";import{Trash2Icon as t}from"lucide-react";import{jsx as n}from"react/jsx-runtime";const r=({onClick:r})=>n(e,{"aria-label":`Xoá`,variant:`ghost`,size:`icon`,color:`secondary`,className:`max-sm:aspect-square max-sm:p-0`,onClick:r,children:n(t,{size:16,className:`opacity-60`,"aria-hidden":`true`})});export{r as TrashBtn};
2
- //# sourceMappingURL=trash.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trash.mjs","names":["TrashBtn: React.FC<Props>"],"sources":["../../../packages/components/ui/buttons/trash.tsx"],"sourcesContent":["import { Trash2Icon } from 'lucide-react';\n\nimport { Button } from '../button';\n\ntype Props = {\n /** Callback invoked when the button is clicked. */\n onClick?: () => void;\n};\n\n/**\n * An icon-only ghost button that triggers a delete action, rendered with a trash-can icon.\n *\n * @example\n * import { TrashBtn } from '@customafk/lunas-ui/ui/buttons/trash';\n *\n * <TrashBtn onClick={() => deleteRecord(record.id)} />\n */\nexport const TrashBtn: React.FC<Props> = ({ onClick }) => {\n return (\n <Button aria-label=\"Xoá\" variant=\"ghost\" size=\"icon\" color=\"secondary\" className=\"max-sm:aspect-square max-sm:p-0\" onClick={onClick}>\n <Trash2Icon size={16} className=\"opacity-60\" aria-hidden=\"true\" />\n </Button>\n );\n};\n"],"mappings":"2KAiBA,MAAaA,GAA6B,CAAE,aAExC,EAAC,EAAA,CAAO,aAAW,MAAM,QAAQ,QAAQ,KAAK,OAAO,MAAM,YAAY,UAAU,kCAA2C,mBAC1H,EAAC,EAAA,CAAW,KAAM,GAAI,UAAU,aAAa,cAAY,QAAS,EAC3D"}
@@ -1,2 +0,0 @@
1
- import"../../button.variants-DkMqWB8G.mjs";import{t as e}from"../../button-CCVJTHBI.mjs";import{UploadIcon as t}from"lucide-react";import{jsx as n}from"react/jsx-runtime";const r=({size:r=`5rem`,onClick:i})=>n(e,{style:{width:r,height:r},variant:`outline`,color:`muted`,onClick:i,children:n(t,{className:`size-6`})});export{r as UploadImageBtn};
2
- //# sourceMappingURL=upload-image.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload-image.mjs","names":["UploadImageBtn: React.FC<PropsWithChildren<Props>>"],"sources":["../../../packages/components/ui/buttons/upload-image.tsx"],"sourcesContent":["import type { PropsWithChildren } from 'react';\n\nimport { UploadIcon } from 'lucide-react';\n\nimport { Button } from '../button';\n\ntype Props = {\n /**\n * Numeric pixel value applied to both the `width` and `height` of the button via inline styles.\n * @default '5rem'\n */\n size?: number;\n /** Callback invoked when the button is clicked. */\n onClick?: () => void;\n};\n\n/**\n * A square outline button for triggering image upload flows, rendered with an upload icon and a configurable size.\n *\n * @example\n * import { UploadImageBtn } from '@customafk/lunas-ui/ui/buttons/upload-image';\n *\n * <UploadImageBtn size={96} onClick={() => openFilePicker()} />\n */\nexport const UploadImageBtn: React.FC<PropsWithChildren<Props>> = ({ size = '5rem', onClick }) => {\n return (\n <Button\n style={{\n width: size,\n height: size,\n }}\n variant=\"outline\"\n color=\"muted\"\n onClick={onClick}\n >\n <UploadIcon className=\"size-6\" />\n </Button>\n );\n};\n"],"mappings":"2KAwBA,MAAaA,GAAsD,CAAE,OAAO,OAAQ,aAEhF,EAAC,EAAA,CACC,MAAO,CACL,MAAO,EACP,OAAQ,EACT,CACD,QAAQ,UACR,MAAM,QACG,mBAET,EAAC,EAAA,CAAW,UAAU,SAAA,CAAW,EAC1B"}
@@ -1 +0,0 @@
1
- "use client";import"../button.variants-DkMqWB8G.mjs";import"../button-CCVJTHBI.mjs";import{n as e,t}from"../calendar-R866yyd1.mjs";export{t as Calendar,e as CalendarDayButton};
package/dist/ui/card.mjs DELETED
@@ -1,2 +0,0 @@
1
- "use client";import{t as e}from"../heading-De4Pn3mZ.mjs";import{n as t}from"../paragraph-DYLaQtTV.mjs";import{cn as n}from"@customafk/react-toolkit/utils";import{jsx as r}from"react/jsx-runtime";function i({className:e,...t}){return r(`div`,{"data-slot":`card`,className:n(`flex flex-col gap-6 rounded-lg border border-border bg-card py-6 text-text-positive shadow-card`,`transition-[box-shadow,opacity] duration-150 ease-in-out`,`data-[interactive=true]:cursor-pointer`,`data-[interactive=true]:hover:shadow-dropdown`,`data-[interactive=true]:focus-visible:outline-none data-[interactive=true]:focus-visible:ring-2 data-[interactive=true]:focus-visible:ring-ring data-[interactive=true]:focus-visible:ring-offset-2`,`data-[interactive=true]:active:opacity-90`,e),...t})}function a({className:e,...t}){return r(`div`,{"data-slot":`card-header`,className:n(`@container/card-header`,`grid auto-rows-min grid-rows-[auto_auto]`,`items-start gap-1.5 px-6 text-text-positive-strong`,`has-data-[slot=card-action]:grid-cols-[1fr_auto]`,`[.border-b]:pb-6`,e),...t})}function o({className:t,...i}){return r(`div`,{"data-slot":`card-title`,className:n(e({level:`h3`}),t),...i})}function s({className:e,...i}){return r(`div`,{"data-slot":`card-description`,className:n(t({variant:`muted`}),e),...i})}function c({className:e,...t}){return r(`div`,{"data-slot":`card-action`,className:n(`col-start-2 row-span-2 row-start-1 self-start justify-self-end`,e),...t})}function l({className:e,...t}){return r(`div`,{"data-slot":`card-content`,className:n(`px-6 text-sm`,e),...t})}function u({className:e,...t}){return r(`div`,{"data-slot":`card-footer`,className:n(`flex items-center px-6 text-sm [.border-t]:pt-6`,e),...t})}export{i as Card,c as CardAction,l as CardContent,s as CardDescription,u as CardFooter,a as CardHeader,o as CardTitle};
2
- //# sourceMappingURL=card.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"card.mjs","names":[],"sources":["../../packages/components/ui/card.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { headingVariants } from '../typography/heading';\nimport { paragraphVariants } from '../typography/paragraph';\n\n/**\n * Surface container for grouping related content with a bordered, shadowed panel that supports optional interactive hover states.\n *\n * @example\n * ```tsx\n * import {\n * Card, CardHeader, CardTitle, CardDescription,\n * CardContent, CardFooter, CardAction,\n * } from '@customafk/lunas-ui/ui/card';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n *\n * <Card>\n * <CardHeader>\n * <CardTitle>Plan overview</CardTitle>\n * <CardDescription>Your current subscription details.</CardDescription>\n * <CardAction><Button size=\"sm\">Upgrade</Button></CardAction>\n * </CardHeader>\n * <CardContent>Monthly usage: 42 / 100 requests</CardContent>\n * <CardFooter>Renews on 1 Jun 2026</CardFooter>\n * </Card>\n * ```\n */\nfunction Card({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n 'flex flex-col gap-6 rounded-lg border border-border bg-card py-6 text-text-positive shadow-card',\n 'transition-[box-shadow,opacity] duration-150 ease-in-out',\n 'data-[interactive=true]:cursor-pointer',\n 'data-[interactive=true]:hover:shadow-dropdown',\n 'data-[interactive=true]:focus-visible:outline-none data-[interactive=true]:focus-visible:ring-2 data-[interactive=true]:focus-visible:ring-ring data-[interactive=true]:focus-visible:ring-offset-2',\n 'data-[interactive=true]:active:opacity-90',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Top section of the card that holds the title, description, and optional action slot. */\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n '@container/card-header',\n 'grid auto-rows-min grid-rows-[auto_auto]',\n 'items-start gap-1.5 px-6 text-text-positive-strong',\n 'has-data-[slot=card-action]:grid-cols-[1fr_auto]',\n '[.border-b]:pb-6',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Primary heading for the card, styled with the h3 heading variant. */\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-title\" className={cn(headingVariants({ level: 'h3' }), className)} {...props} />;\n}\n\n/** Muted supporting text displayed beneath the card title. */\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-description\" className={cn(paragraphVariants({ variant: 'muted' }), className)} {...props} />;\n}\n\n/** Optional slot in the card header for a contextual action (e.g. a button or menu); positioned in the top-right grid cell. */\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-action\" className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)} {...props} />;\n}\n\n/** Main body area of the card with horizontal padding for content alignment. */\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-content\" className={cn('px-6 text-sm', className)} {...props} />;\n}\n\n/** Bottom section of the card, typically used for supplementary text or secondary actions. */\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-footer\" className={cn('flex items-center px-6 text-sm [.border-t]:pt-6', className)} {...props} />;\n}\n\nexport { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\n"],"mappings":"mMA4BA,SAAS,EAAK,CAAE,YAAW,GAAG,GAAsC,CAClE,OACE,EAAC,MAAA,CACC,YAAU,OACV,UAAW,EACT,kGACA,2DACA,yCACA,gDACA,sMACA,4CACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OACE,EAAC,MAAA,CACC,YAAU,cACV,UAAW,EACT,yBACA,2CACA,qDACA,mDACA,mBACA,EACD,CACD,GAAI,GACJ,CAKN,SAAS,EAAU,CAAE,YAAW,GAAG,GAAsC,CACvE,OAAO,EAAC,MAAA,CAAI,YAAU,aAAa,UAAW,EAAG,EAAgB,CAAE,MAAO,KAAM,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS,CAI9G,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAsC,CAC7E,OAAO,EAAC,MAAA,CAAI,YAAU,mBAAmB,UAAW,EAAG,EAAkB,CAAE,QAAS,QAAS,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS,CAI3H,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OAAO,EAAC,MAAA,CAAI,YAAU,cAAc,UAAW,EAAG,iEAAkE,EAAU,CAAE,GAAI,GAAS,CAI/I,SAAS,EAAY,CAAE,YAAW,GAAG,GAAsC,CACzE,OAAO,EAAC,MAAA,CAAI,YAAU,eAAe,UAAW,EAAG,eAAgB,EAAU,CAAE,GAAI,GAAS,CAI9F,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OAAO,EAAC,MAAA,CAAI,YAAU,cAAc,UAAW,EAAG,kDAAmD,EAAU,CAAE,GAAI,GAAS"}
@@ -1,2 +0,0 @@
1
- "use client";import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import{ArrowLeft as t,ArrowRight as n}from"lucide-react";import{createContext as r,use as i,useCallback as a,useEffect as o,useState as s}from"react";import{cn as c}from"@customafk/react-toolkit/utils";import{jsx as l,jsxs as u}from"react/jsx-runtime";import d from"embla-carousel-react";const f=r(null);function p(){let e=i(f);if(!e)throw Error(`useCarousel must be used within a <Carousel />`);return e}function m({orientation:e=`horizontal`,opts:t,setApi:n,plugins:r,className:i,children:u,...p}){let[m,h]=d({...t,axis:e===`horizontal`?`x`:`y`},r),[g,_]=s(!1),[v,y]=s(!1),b=a(e=>{e&&(_(e.canScrollPrev()),y(e.canScrollNext()))},[]),x=a(()=>{h?.scrollPrev()},[h]),S=a(()=>{h?.scrollNext()},[h]),C=a(e=>{e.key===`ArrowLeft`?(e.preventDefault(),x()):e.key===`ArrowRight`&&(e.preventDefault(),S())},[x,S]);return o(()=>{!h||!n||n(h)},[h,n]),o(()=>{if(h)return b(h),h.on(`reInit`,b),h.on(`select`,b),()=>{h?.off(`select`,b)}},[h,b]),l(f.Provider,{value:{carouselRef:m,api:h,opts:t,orientation:e||(t?.axis===`y`?`vertical`:`horizontal`),scrollPrev:x,scrollNext:S,canScrollPrev:g,canScrollNext:v},children:l(`div`,{onKeyDownCapture:C,className:c(`relative`,i),role:`region`,"aria-roledescription":`carousel`,"data-slot":`carousel`,...p,children:u})})}function h({className:e,...t}){let{carouselRef:n,orientation:r}=p();return l(`div`,{ref:n,className:`overflow-hidden`,"data-slot":`carousel-content`,children:l(`div`,{className:c(`flex`,r===`horizontal`?`-ml-4`:`-mt-4 flex-col`,e),...t})})}function g({className:e,...t}){let{orientation:n}=p();return l(`div`,{role:`group`,"aria-roledescription":`slide`,"data-slot":`carousel-item`,className:c(`min-w-0 shrink-0 grow-0 basis-full`,n===`horizontal`?`pl-4`:`pt-4`,e),...t})}function _({className:n,variant:r=`outline`,size:i=`icon`,...a}){let{orientation:o,scrollPrev:s,canScrollPrev:d}=p();return u(e,{"data-slot":`carousel-previous`,variant:r,size:i,className:c(`absolute size-8 rounded-full`,o===`horizontal`?`top-1/2 -left-12 -translate-y-1/2`:`-top-12 left-1/2 -translate-x-1/2 rotate-90`,n),disabled:!d,onClick:s,...a,children:[l(t,{}),l(`span`,{className:`sr-only`,children:`Previous slide`})]})}function v({className:t,variant:r=`outline`,size:i=`icon`,...a}){let{orientation:o,scrollNext:s,canScrollNext:d}=p();return u(e,{"data-slot":`carousel-next`,variant:r,size:i,className:c(`absolute size-8 rounded-full`,o===`horizontal`?`top-1/2 -right-12 -translate-y-1/2`:`-bottom-12 left-1/2 -translate-x-1/2 rotate-90`,t),disabled:!d,onClick:s,...a,children:[l(n,{}),l(`span`,{className:`sr-only`,children:`Next slide`})]})}export{m as Carousel,h as CarouselContent,g as CarouselItem,v as CarouselNext,_ as CarouselPrevious};
2
- //# sourceMappingURL=carousel.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"carousel.mjs","names":["api"],"sources":["../../packages/components/ui/carousel.tsx"],"sourcesContent":["'use client';\nimport { createContext, use, useCallback, useEffect, useState } from 'react';\n\nimport { ArrowLeft, ArrowRight } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react';\nimport { Button } from '@/components/ui/button';\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: 'horizontal' | 'vertical';\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = use(CarouselContext);\n\n if (!context) {\n throw new Error('useCarousel must be used within a <Carousel />');\n }\n\n return context;\n}\n\n/**\n * Embla-powered carousel that supports horizontal and vertical orientations with keyboard navigation.\n *\n * @example\n * ```tsx\n * import {\n * Carousel, CarouselContent, CarouselItem,\n * CarouselPrevious, CarouselNext,\n * } from '@customafk/lunas-ui/ui/carousel';\n *\n * <Carousel>\n * <CarouselContent>\n * <CarouselItem>Slide 1</CarouselItem>\n * <CarouselItem>Slide 2</CarouselItem>\n * </CarouselContent>\n * <CarouselPrevious />\n * <CarouselNext />\n * </Carousel>\n * ```\n */\nfunction Carousel({ orientation = 'horizontal', opts, setApi, plugins, className, children, ...props }: React.ComponentProps<'div'> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === 'horizontal' ? 'x' : 'y',\n },\n plugins\n );\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n const onSelect = useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext]\n );\n\n useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on('reInit', onSelect);\n api.on('select', onSelect);\n\n return () => {\n api?.off('select', onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === 'y' ? 'vertical' : 'horizontal'),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div onKeyDownCapture={handleKeyDown} className={cn('relative', className)} role=\"region\" aria-roledescription=\"carousel\" data-slot=\"carousel\" {...props}>\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\n/** The scrollable track that holds all CarouselItem elements. */\nfunction CarouselContent({ className, ...props }: React.ComponentProps<'div'>) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div className={cn('flex', orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col', className)} {...props} />\n </div>\n );\n}\n\n/** A single slide within a CarouselContent; occupies the full width (or height for vertical carousels). */\nfunction CarouselItem({ className, ...props }: React.ComponentProps<'div'>) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn('min-w-0 shrink-0 grow-0 basis-full', orientation === 'horizontal' ? 'pl-4' : 'pt-4', className)}\n {...props}\n />\n );\n}\n\n/** Circular button positioned to the left (or top for vertical) that scrolls to the previous slide. */\nfunction CarouselPrevious({ className, variant = 'outline', size = 'icon', ...props }: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n 'absolute size-8 rounded-full',\n orientation === 'horizontal' ? 'top-1/2 -left-12 -translate-y-1/2' : '-top-12 left-1/2 -translate-x-1/2 rotate-90',\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\n/** Circular button positioned to the right (or bottom for vertical) that scrolls to the next slide. */\nfunction CarouselNext({ className, variant = 'outline', size = 'icon', ...props }: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n 'absolute size-8 rounded-full',\n orientation === 'horizontal' ? 'top-1/2 -right-12 -translate-y-1/2' : '-bottom-12 left-1/2 -translate-x-1/2 rotate-90',\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport { Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious };\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- "use client";import{t as e}from"../checkbox-Cat3i08X.mjs";export{e as Checkbox};
@@ -1 +0,0 @@
1
- {"version":3,"file":"collapsible.mjs","names":["CollapsiblePrimitive"],"sources":["../../packages/components/ui/collapsible.tsx"],"sourcesContent":["'use client';\n\nimport { Collapsible as CollapsiblePrimitive } from 'radix-ui';\n\n/**\n * Root provider for a Collapsible section — toggles the visibility of its content.\n *\n * @example\n * ```tsx\n * import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '@customafk/lunas-ui/ui/collapsible';\n *\n * <Collapsible>\n * <CollapsibleTrigger>Toggle section</CollapsibleTrigger>\n * <CollapsibleContent>\n * <p>Hidden content revealed on toggle.</p>\n * </CollapsibleContent>\n * </Collapsible>\n * ```\n */\nfunction Collapsible({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\n/** Button or element that expands or collapses the CollapsibleContent. */\nfunction CollapsibleTrigger({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return <CollapsiblePrimitive.CollapsibleTrigger data-slot=\"collapsible-trigger\" {...props} />;\n}\n\n/** The section that is shown or hidden based on the Collapsible open state. */\nfunction CollapsibleContent({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return <CollapsiblePrimitive.CollapsibleContent data-slot=\"collapsible-content\" {...props} />;\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger };\n"],"mappings":"4FAmBA,SAAS,EAAY,CAAE,GAAG,GAAiE,CACzF,OAAO,EAACA,EAAqB,KAAA,CAAK,YAAU,cAAc,GAAI,GAAS,CAIzE,SAAS,EAAmB,CAAE,GAAG,GAA+E,CAC9G,OAAO,EAACA,EAAqB,mBAAA,CAAmB,YAAU,sBAAsB,GAAI,GAAS,CAI/F,SAAS,EAAmB,CAAE,GAAG,GAA+E,CAC9G,OAAO,EAACA,EAAqB,mBAAA,CAAmB,YAAU,sBAAsB,GAAI,GAAS"}
@@ -1 +0,0 @@
1
- "use client";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import"../close-_UHFeiLS.mjs";import"../dialog-CLDnvNH_.mjs";import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"../command-D6_CSbwJ.mjs";export{c as Command,i as CommandDialog,o as CommandEmpty,n as CommandGroup,e as CommandInput,a as CommandItem,s as CommandList,t as CommandSeparator,r as CommandShortcut};
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-menu.mjs","names":["ContextMenuPrimitive"],"sources":["../../packages/components/ui/context-menu.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\n\nimport { ContextMenu as ContextMenuPrimitive } from 'radix-ui';\n\n/**\n * Root provider for the ContextMenu — revealed on right-click (or long-press) of the trigger area.\n *\n * @example\n * ```tsx\n * import {\n * ContextMenu, ContextMenuTrigger, ContextMenuContent,\n * ContextMenuItem, ContextMenuLabel, ContextMenuSeparator,\n * } from '@customafk/lunas-ui/ui/context-menu';\n *\n * <ContextMenu>\n * <ContextMenuTrigger>Right-click me</ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuLabel>Actions</ContextMenuLabel>\n * <ContextMenuSeparator />\n * <ContextMenuItem>Copy</ContextMenuItem>\n * <ContextMenuItem variant=\"destructive\">Delete</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n * ```\n */\nfunction ContextMenu({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n}\n\n/** The area that listens for right-click to open the ContextMenu. */\nfunction ContextMenuTrigger({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />;\n}\n\n/** Groups related ContextMenuItems under a shared logical section. */\nfunction ContextMenuGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />;\n}\n\n/** Portals ContextMenu content outside the current DOM hierarchy. */\nfunction ContextMenuPortal({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />;\n}\n\n/** Root container for a nested sub-menu inside a ContextMenu. */\nfunction ContextMenuSub({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />;\n}\n\n/** Groups ContextMenuRadioItems so only one can be selected at a time. */\nfunction ContextMenuRadioGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return <ContextMenuPrimitive.RadioGroup data-slot=\"context-menu-radio-group\" {...props} />;\n}\n\n/**\n * Menu item that reveals a nested ContextMenuSubContent on hover or activation.\n *\n * @param inset - When true, adds left padding to align with inset items.\n */\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n );\n}\n\n/** Floating panel that contains the items of a nested ContextMenu sub-menu. */\nfunction ContextMenuSubContent({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Animated floating panel that contains the context menu items. */\nfunction ContextMenuContent({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n}\n\n/**\n * A single clickable row inside a ContextMenuContent.\n *\n * @param inset - When true, adds left padding to align with items that have icons.\n * @param variant - Visual style: `'default'` or `'destructive'`.\n */\nfunction ContextMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\n/** A checkable context menu item that displays a checkmark when selected. */\nfunction ContextMenuCheckboxItem({ className, children, checked, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n}\n\n/** A radio-button context menu item; shows a filled circle when selected. */\nfunction ContextMenuRadioItem({ className, children, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n className={cn(\n 'relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none',\n 'focus:bg-accent',\n 'focus:text-accent-foreground',\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none',\n '[&_svg]:shrink-0',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n}\n\n/**\n * Non-interactive label used to describe a group of context menu items.\n *\n * @param inset - When true, adds left padding to align with inset items.\n */\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn('text-foreground px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\n {...props}\n />\n );\n}\n\n/** Horizontal dividing line between groups of context menu items. */\nfunction ContextMenuSeparator({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return <ContextMenuPrimitive.Separator data-slot=\"context-menu-separator\" className={cn('bg-border -mx-1 my-1 h-px', className)} {...props} />;\n}\n\n/** Displays a keyboard shortcut hint aligned to the right of a context menu item. */\nfunction ContextMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return <span data-slot=\"context-menu-shortcut\" className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)} {...props} />;\n}\n\nexport {\n ContextMenu,\n ContextMenuCheckboxItem,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuItem,\n ContextMenuLabel,\n ContextMenuPortal,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuTrigger,\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- "use client";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import"../close-_UHFeiLS.mjs";import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"../dialog-CLDnvNH_.mjs";export{c as Dialog,i as DialogClose,o as DialogContent,n as DialogDescription,e as DialogFooter,a as DialogHeader,s as DialogOverlay,t as DialogPortal,r as DialogTitle,l as DialogTrigger};
@@ -1 +0,0 @@
1
- "use client";import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"../drawer-CMD7JWH8.mjs";export{c as Drawer,i as DrawerClose,o as DrawerContent,n as DrawerDescription,e as DrawerFooter,a as DrawerHeader,s as DrawerOverlay,t as DrawerPortal,r as DrawerTitle,l as DrawerTrigger};
@@ -1 +0,0 @@
1
- "use client";import{a as e,c as t,d as n,f as r,h as i,i as a,l as o,m as s,n as c,o as l,p as u,r as d,s as f,t as p,u as m}from"../dropdown-menu-BWhiVsEf.mjs";export{p as DropdownMenu,c as DropdownMenuCheckboxItem,d as DropdownMenuContent,a as DropdownMenuGroup,e as DropdownMenuItem,l as DropdownMenuLabel,f as DropdownMenuPortal,t as DropdownMenuRadioGroup,o as DropdownMenuRadioItem,m as DropdownMenuSeparator,n as DropdownMenuShortcut,r as DropdownMenuSub,u as DropdownMenuSubContent,s as DropdownMenuSubTrigger,i as DropdownMenuTrigger};
@@ -1 +0,0 @@
1
- {"version":3,"file":"empty.mjs","names":[],"sources":["../../packages/components/ui/empty.tsx"],"sourcesContent":["import { cn } from '@customafk/react-toolkit/utils';\n\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\n/**\n * Full-page or section empty-state container with centred layout and dashed border, composed with EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, and EmptyContent.\n *\n * @example\n * ```tsx\n * import {\n * Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent,\n * } from '@customafk/lunas-ui/ui/empty';\n * import { SearchX } from 'lucide-react';\n *\n * <Empty>\n * <EmptyHeader>\n * <EmptyMedia variant=\"icon\"><SearchX /></EmptyMedia>\n * <EmptyTitle>No results found</EmptyTitle>\n * <EmptyDescription>Try adjusting your search filters.</EmptyDescription>\n * </EmptyHeader>\n * <EmptyContent>\n * <button>Reset filters</button>\n * </EmptyContent>\n * </Empty>\n * ```\n */\nfunction Empty({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"empty\"\n className={cn('flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12', className)}\n {...props}\n />\n );\n}\n\n/** Centred column container for the media, title, and description of an empty state. */\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"empty-header\" className={cn('flex max-w-sm flex-col items-center gap-2 text-center', className)} {...props} />;\n}\n\nconst emptyMediaVariants = cva('flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0', {\n variants: {\n variant: {\n default: 'bg-transparent',\n icon: \"bg-muted-muted text-text-positive-weak flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\n/**\n * Container for the visual element (illustration, icon, or image) in an empty state.\n *\n * @param variant - `'default'` renders a transparent wrapper; `'icon'` renders a rounded muted square with the icon centred inside.\n */\nfunction EmptyMedia({ className, variant = 'default', ...props }: React.ComponentProps<'div'> & VariantProps<typeof emptyMediaVariants>) {\n return <div data-slot=\"empty-icon\" data-variant={variant} className={cn(emptyMediaVariants({ variant, className }))} {...props} />;\n}\n\n/** Prominent heading text for the empty state. */\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"empty-title\" className={cn('text-lg font-medium tracking-tight', className)} {...props} />;\n}\n\n/** Supporting body text that explains the empty state to the user. */\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<'p'>) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn('text-text-positive-weak [&>a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4', className)}\n {...props}\n />\n );\n}\n\n/** Action area below the header — typically holds buttons or links to help the user proceed. */\nfunction EmptyContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div data-slot=\"empty-content\" className={cn('flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance', className)} {...props} />\n );\n}\n\nexport { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia };\n"],"mappings":"2IA2BA,SAAS,EAAM,CAAE,YAAW,GAAG,GAAsC,CACnE,OACE,EAAC,MAAA,CACC,YAAU,QACV,UAAW,EAAG,+HAAgI,EAAU,CACxJ,GAAI,GACJ,CAKN,SAAS,EAAY,CAAE,YAAW,GAAG,GAAsC,CACzE,OAAO,EAAC,MAAA,CAAI,YAAU,eAAe,UAAW,EAAG,wDAAyD,EAAU,CAAE,GAAI,GAAS,CAGvI,MAAM,EAAqB,EAAI,8FAA+F,CAC5H,SAAU,CACR,QAAS,CACP,QAAS,iBACT,KAAM,2IACP,CACF,CACD,gBAAiB,CACf,QAAS,UACV,CACF,CAAC,CAOF,SAAS,EAAW,CAAE,YAAW,UAAU,UAAW,GAAG,GAAgF,CACvI,OAAO,EAAC,MAAA,CAAI,YAAU,aAAa,eAAc,EAAS,UAAW,EAAG,EAAmB,CAAE,UAAS,YAAW,CAAC,CAAC,CAAE,GAAI,GAAS,CAIpI,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OAAO,EAAC,MAAA,CAAI,YAAU,cAAc,UAAW,EAAG,qCAAsC,EAAU,CAAE,GAAI,GAAS,CAInH,SAAS,EAAiB,CAAE,YAAW,GAAG,GAAoC,CAC5E,OACE,EAAC,MAAA,CACC,YAAU,oBACV,UAAW,EAAG,4GAA6G,EAAU,CACrI,GAAI,GACJ,CAKN,SAAS,EAAa,CAAE,YAAW,GAAG,GAAsC,CAC1E,OACE,EAAC,MAAA,CAAI,YAAU,gBAAgB,UAAW,EAAG,gFAAiF,EAAU,CAAE,GAAI,GAAS"}
@@ -1,65 +0,0 @@
1
- import { Label } from "./label.mjs";
2
- import * as react181 from "react";
3
- import { VariantProps } from "class-variance-authority";
4
- import * as class_variance_authority_types7 from "class-variance-authority/types";
5
-
6
- //#region packages/components/ui/field.d.ts
7
- declare const FieldSet: react181.MemoExoticComponent<({
8
- className,
9
- ...props
10
- }: React.ComponentProps<"fieldset">) => react181.JSX.Element>;
11
- declare const FieldLegend: react181.MemoExoticComponent<({
12
- className,
13
- variant,
14
- ...props
15
- }: React.ComponentProps<"legend"> & {
16
- variant?: "legend" | "label";
17
- }) => react181.JSX.Element>;
18
- declare const FieldGroup: react181.MemoExoticComponent<({
19
- className,
20
- ...props
21
- }: React.ComponentProps<"div">) => react181.JSX.Element>;
22
- declare const fieldVariants: (props?: ({
23
- orientation?: "vertical" | "horizontal" | "responsive" | null | undefined;
24
- } & class_variance_authority_types7.ClassProp) | undefined) => string;
25
- declare const Field: react181.MemoExoticComponent<({
26
- className,
27
- orientation,
28
- ...props
29
- }: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>) => react181.JSX.Element>;
30
- declare const FieldContent: react181.MemoExoticComponent<({
31
- className,
32
- ...props
33
- }: React.ComponentProps<"div">) => react181.JSX.Element>;
34
- declare const FieldLabel: react181.MemoExoticComponent<({
35
- className,
36
- ...props
37
- }: React.ComponentProps<typeof Label>) => react181.JSX.Element>;
38
- declare const FieldTitle: react181.MemoExoticComponent<({
39
- className,
40
- ...props
41
- }: React.ComponentProps<"div">) => react181.JSX.Element>;
42
- declare const FieldDescription: react181.MemoExoticComponent<({
43
- className,
44
- ...props
45
- }: React.ComponentProps<"p">) => react181.JSX.Element>;
46
- declare const FieldSeparator: react181.MemoExoticComponent<({
47
- children,
48
- className,
49
- ...props
50
- }: React.ComponentProps<"div"> & {
51
- children?: React.ReactNode;
52
- }) => react181.JSX.Element>;
53
- declare const FieldError: react181.MemoExoticComponent<({
54
- className,
55
- children,
56
- errors,
57
- ...props
58
- }: React.ComponentProps<"div"> & {
59
- errors?: Array<{
60
- message?: string;
61
- } | undefined>;
62
- }) => react181.JSX.Element | null>;
63
- //#endregion
64
- export { Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle };
65
- //# sourceMappingURL=field.d.mts.map
package/dist/ui/field.mjs DELETED
@@ -1 +0,0 @@
1
- "use client";import"../separator-D3Gmkxzq.mjs";import"../label-CUCpwS5D.mjs";import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"../field-dYemS0hQ.mjs";export{c as Field,i as FieldContent,o as FieldDescription,n as FieldError,e as FieldGroup,a as FieldLabel,s as FieldLegend,t as FieldSeparator,r as FieldSet,l as FieldTitle};
@@ -1,3 +0,0 @@
1
- "use client";import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import{t}from"../progress-CLeM0e7Z.mjs";import{FileText as n,Image as r,Trash2 as i,Upload as a}from"lucide-react";import{useCallback as o,useEffect as s}from"react";import{cn as c,formatBytes as l}from"@customafk/react-toolkit/utils";import{jsx as u,jsxs as d}from"react/jsx-runtime";import f from"react-dropzone";import{useControllableState as p}from"@customafk/react-toolkit/hooks/useControllableState";import{toast as m}from"sonner";function h(e){let{value:t,onValueChange:n,onUpload:h,progresses:v,accept:y={"image/*":[]},maxSize:b=1024*1024*2,maxFileCount:x=1,multiple:S=!1,disabled:C=!1,showText:w=!0,iconSize:T,className:E,...D}=e,[O,k]=p({prop:t,onChange:n}),A=o((e,t)=>{if(!S&&x===1&&e.length>1){m.error(`Cannot upload more than 1 file at a time`);return}if((O?.length??0)+e.length>x){m.error(`Cannot upload more than ${x} files`);return}let n=e.map(e=>Object.assign(e,{preview:URL.createObjectURL(e)})),r=O?[...O,...n]:n;if(k(r),t.length>0&&t.forEach(({file:e})=>{m.error(`File ${e.name} was rejected`)}),h&&r.length>0&&r.length<=x){let e=r.length>0?`${r.length} files`:`file`;h(r).then(()=>{k([]),m(`${e} uploaded`)})}},[O,x,S,h,k]);function j(e){if(!O)return;_(O[e])&&URL.revokeObjectURL(O[e].preview);let t=O.filter((t,n)=>n!==e);k(t),n?.(t)}s(()=>()=>{O&&O.forEach(e=>{_(e)&&URL.revokeObjectURL(e.preview)})},[]);let M=C||(O?.length??0)>=x;return d(`div`,{className:`relative flex w-full flex-col gap-6`,children:[u(f,{onDrop:A,accept:y,maxSize:b,maxFiles:x,multiple:x>1||S,disabled:M,children:({getRootProps:e,getInputProps:t,isDragActive:n})=>d(`div`,{...e(),className:c(`group`,`border-border-weak`,`hover:bg-border-weak/20`,`relative grid h-52 w-full cursor-pointer place-items-center rounded-lg border-2 border-dashed px-5 py-2.5 text-center transition`,`ring-offset-background`,`focus-visible:ring-primary-weak`,`focus-visible:ring-2`,`focus-visible:ring-offset-2`,`focus-visible:outline-hidden`,n&&`border-border-primary-strong bg-border-weak/40`,M&&`pointer-events-none opacity-60`,E),...D,children:[u(`input`,{...t()}),n?d(`div`,{className:`flex flex-col items-center justify-center gap-4 sm:px-5`,children:[u(`div`,{className:`rounded-full border border-dashed p-3`,children:u(a,{className:`text-text-positive-muted size-7`,"aria-hidden":`true`})}),u(`p`,{className:`text-text-positive-muted font-medium`,children:`Drop the files here`})]}):d(`div`,{className:`flex flex-col items-center justify-center gap-4 sm:px-5`,children:[u(`div`,{className:`rounded-full border border-dashed p-3`,children:u(a,{size:T||24,className:`text-muted-foreground`,"aria-hidden":`true`})}),w&&d(`div`,{className:`flex flex-col gap-px`,children:[d(`p`,{className:`text-text-positive-weak text-xs font-medium`,children:[`Drag `,`'n'`,` drop files here, or click to select files`]}),d(`p`,{className:`text-text-positive-muted text-xs`,children:[`You can upload`,x>1?` ${x===1/0?`multiple`:x}
2
- files (up to ${l(b)} each)`:` a file with ${l(b)}`]})]})]})]})}),O?.length?d(`div`,{className:`h-fit w-full overflow-y-auto`,children:[d(`div`,{className:`flex items-center justify-between px-3 py-2.5`,children:[d(`div`,{className:`text-text-positive-weak flex items-center gap-1`,children:[u(r,{size:16,"aria-hidden":`true`}),d(`p`,{className:`text-sm`,children:[`Ảnh đã tải lên (`,O.length,`)`]})]}),d(`button`,{className:`hover:text-text-positive text-text-positive-muted flex cursor-pointer items-center gap-1 transition-colors duration-200`,onClick:()=>{O&&(O.forEach(e=>{_(e)&&URL.revokeObjectURL(e.preview)}),k([]),n?.([]))},children:[u(i,{size:16,"aria-hidden":`true`}),u(`p`,{className:`text-sm`,children:`Xóa tất cả`})]})]}),u(`div`,{className:`flex flex-col gap-2.5`,children:O?.map((e,t)=>u(g,{file:e,onRemove:()=>j(t),progress:v?.[e.name]},t))})]}):null]})}function g({file:n,progress:r,onRemove:a}){return d(`div`,{className:`border-border-weak hover:border-border relative flex items-center gap-4 rounded-md border py-2 pr-3 pl-2 shadow-xs transition-colors`,children:[d(`div`,{className:`flex flex-1 gap-2.5`,children:[_(n)?u(v,{file:n}):null,d(`div`,{className:`flex w-full flex-col gap-2`,children:[d(`div`,{className:`flex flex-col gap-y-0.5`,children:[u(`p`,{className:`text-text-positive line-clamp-1 text-sm`,children:n.name}),u(`p`,{className:`text-text-positive-muted text-xs`,children:l(n.size)})]}),r?u(t,{value:r}):null]})]}),u(`div`,{className:`flex items-center gap-2`,children:d(e,{type:`button`,variant:`ghost`,color:`secondary`,size:`icon`,className:`size-7`,onClick:a,children:[u(i,{size:16,className:`text-text-positive-muted`,"aria-hidden":`true`}),u(`span`,{className:`sr-only`,children:`Remove file`})]})})]})}function _(e){return`preview`in e&&typeof e.preview==`string`}function v({file:e}){return e.type.startsWith(`image/`)?u(`img`,{src:e.preview,className:`border-border aspect-square size-10 shrink-0 rounded border object-cover object-top shadow-sm`}):u(n,{className:`text-text-positive-muted size-10 border`,"aria-hidden":`true`})}export{h as FileUploader};
3
- //# sourceMappingURL=file-uploader.mjs.map