@customafk/lunas-ui 0.2.68 → 0.2.69

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 (251) hide show
  1. package/dist/{action-submit-SviPJW3i.mjs → action-submit-Bew9PJtF.mjs} +2 -2
  2. package/dist/{action-submit-SviPJW3i.mjs.map → action-submit-Bew9PJtF.mjs.map} +1 -1
  3. package/dist/{action-submit-42PxGLsR.cjs → action-submit-Dzo0A7Ew.cjs} +2 -2
  4. package/dist/{action-submit-42PxGLsR.cjs.map → action-submit-Dzo0A7Ew.cjs.map} +1 -1
  5. package/dist/{actions-form-Bo46j_dH.cjs → actions-form-BnDcdbd-.cjs} +2 -2
  6. package/dist/{actions-form-Bo46j_dH.cjs.map → actions-form-BnDcdbd-.cjs.map} +1 -1
  7. package/dist/{actions-form-QdAsKwcQ.mjs → actions-form-Z8BX9Hmy.mjs} +2 -2
  8. package/dist/{actions-form-QdAsKwcQ.mjs.map → actions-form-Z8BX9Hmy.mjs.map} +1 -1
  9. package/dist/analysis-panel-BqZmOU58.mjs +2 -0
  10. package/dist/analysis-panel-BqZmOU58.mjs.map +1 -0
  11. package/dist/{analysis-panel-UlC7cvO2.cjs → analysis-panel-CQZ0hmfN.cjs} +2 -2
  12. package/dist/analysis-panel-CQZ0hmfN.cjs.map +1 -0
  13. package/dist/{badge-display-Bs0QeCJt.cjs → badge-display-DmCKpGk9.cjs} +2 -2
  14. package/dist/{badge-display-Bs0QeCJt.cjs.map → badge-display-DmCKpGk9.cjs.map} +1 -1
  15. package/dist/{badge-display-Dg5XM66P.mjs → badge-display-RP5VTE10.mjs} +2 -2
  16. package/dist/{badge-display-Dg5XM66P.mjs.map → badge-display-RP5VTE10.mjs.map} +1 -1
  17. package/dist/{boolean-display-DVn3UGuZ.mjs → boolean-display-B9qxrF5f.mjs} +2 -2
  18. package/dist/{boolean-display-DVn3UGuZ.mjs.map → boolean-display-B9qxrF5f.mjs.map} +1 -1
  19. package/dist/{boolean-display-BnN32_Jd.cjs → boolean-display-BwB-l9k0.cjs} +2 -2
  20. package/dist/{boolean-display-BnN32_Jd.cjs.map → boolean-display-BwB-l9k0.cjs.map} +1 -1
  21. package/dist/{checkbox-field-FqCe38_D.mjs → checkbox-field-BaqE-eVv.mjs} +2 -2
  22. package/dist/{checkbox-field-FqCe38_D.mjs.map → checkbox-field-BaqE-eVv.mjs.map} +1 -1
  23. package/dist/{checkbox-field-B1vCz-Wf.cjs → checkbox-field-BsGsZz_N.cjs} +2 -2
  24. package/dist/{checkbox-field-B1vCz-Wf.cjs.map → checkbox-field-BsGsZz_N.cjs.map} +1 -1
  25. package/dist/combobox-field-CAN8g_xv.mjs +2 -0
  26. package/dist/combobox-field-CAN8g_xv.mjs.map +1 -0
  27. package/dist/combobox-field-DERJQd5o.cjs +2 -0
  28. package/dist/combobox-field-DERJQd5o.cjs.map +1 -0
  29. package/dist/{currency-display-CZ6PJAzu.cjs → currency-display-Buxc6Ph5.cjs} +2 -2
  30. package/dist/{currency-display-CZ6PJAzu.cjs.map → currency-display-Buxc6Ph5.cjs.map} +1 -1
  31. package/dist/{currency-display-CKLQ_lxN.mjs → currency-display-CEg_HRYv.mjs} +2 -2
  32. package/dist/{currency-display-CKLQ_lxN.mjs.map → currency-display-CEg_HRYv.mjs.map} +1 -1
  33. package/dist/{date-display-BQOVmN7S.cjs → date-display-BgI7Wjqf.cjs} +2 -2
  34. package/dist/{date-display-BQOVmN7S.cjs.map → date-display-BgI7Wjqf.cjs.map} +1 -1
  35. package/dist/{date-display-BrCdJkmq.mjs → date-display-DGfHQhpu.mjs} +2 -2
  36. package/dist/{date-display-BrCdJkmq.mjs.map → date-display-DGfHQhpu.mjs.map} +1 -1
  37. package/dist/{date-field-RvEB9F1r.cjs → date-field--jOKZ2x1.cjs} +2 -2
  38. package/dist/{date-field-RvEB9F1r.cjs.map → date-field--jOKZ2x1.cjs.map} +1 -1
  39. package/dist/{date-field-Cxbrc0Vl.mjs → date-field-CXzcsnjn.mjs} +2 -2
  40. package/dist/{date-field-Cxbrc0Vl.mjs.map → date-field-CXzcsnjn.mjs.map} +1 -1
  41. package/dist/{description-display-DnDAB3a1.cjs → description-display-BR8nXqc_.cjs} +2 -2
  42. package/dist/{description-display-DnDAB3a1.cjs.map → description-display-BR8nXqc_.cjs.map} +1 -1
  43. package/dist/{description-display-BQFLzI2g.mjs → description-display-CW0g3aJa.mjs} +2 -2
  44. package/dist/{description-display-BQFLzI2g.mjs.map → description-display-CW0g3aJa.mjs.map} +1 -1
  45. package/dist/{dialog-form-C0W5C0u9.mjs → dialog-form-BbumLQqe.mjs} +2 -2
  46. package/dist/{dialog-form-C0W5C0u9.mjs.map → dialog-form-BbumLQqe.mjs.map} +1 -1
  47. package/dist/{dialog-form-CkNCwzWG.cjs → dialog-form-CEiuEMXD.cjs} +2 -2
  48. package/dist/{dialog-form-CkNCwzWG.cjs.map → dialog-form-CEiuEMXD.cjs.map} +1 -1
  49. package/dist/dialogs/detail-dialog/index.cjs +1 -1
  50. package/dist/dialogs/detail-dialog/index.cjs.map +1 -1
  51. package/dist/dialogs/detail-dialog/index.mjs +1 -1
  52. package/dist/dialogs/detail-dialog/index.mjs.map +1 -1
  53. package/dist/edit-button-0_FLZoT3.cjs.map +1 -1
  54. package/dist/edit-button-DmMFMzG0.mjs.map +1 -1
  55. package/dist/email-display-BKcoWmPK.mjs +2 -0
  56. package/dist/email-display-BKcoWmPK.mjs.map +1 -0
  57. package/dist/email-display-DqKYq0iM.cjs +2 -0
  58. package/dist/email-display-DqKYq0iM.cjs.map +1 -0
  59. package/dist/{email-field-BErx3liY.cjs → email-field-DRb71gQI.cjs} +2 -2
  60. package/dist/{email-field-BErx3liY.cjs.map → email-field-DRb71gQI.cjs.map} +1 -1
  61. package/dist/{email-field-BtcdBWL4.mjs → email-field-HFmUE81o.mjs} +2 -2
  62. package/dist/{email-field-BtcdBWL4.mjs.map → email-field-HFmUE81o.mjs.map} +1 -1
  63. package/dist/features/tables/index.cjs +1 -1
  64. package/dist/features/tables/index.d.cts +2 -2
  65. package/dist/features/tables/index.d.mts +2 -2
  66. package/dist/features/tables/index.mjs +1 -1
  67. package/dist/features/tanstack-form/index.cjs +1 -1
  68. package/dist/features/tanstack-form/index.d.cts +1 -1
  69. package/dist/features/tanstack-form/index.d.mts +1 -1
  70. package/dist/features/tanstack-form/index.mjs +1 -1
  71. package/dist/{filter-CG6wQHRd.mjs → filter-CWuRGTl4.mjs} +2 -2
  72. package/dist/{filter-CG6wQHRd.mjs.map → filter-CWuRGTl4.mjs.map} +1 -1
  73. package/dist/{filter-Bb9_Blk3.cjs → filter-DqedvThM.cjs} +2 -2
  74. package/dist/{filter-Bb9_Blk3.cjs.map → filter-DqedvThM.cjs.map} +1 -1
  75. package/dist/{index-DDROD2y9.d.cts → index-CgP5OCy0.d.cts} +10 -2
  76. package/dist/{index-DDROD2y9.d.mts → index-CgP5OCy0.d.mts} +10 -2
  77. package/dist/{index-BRE7tL8d.d.cts → index-FEMPGfwO.d.cts} +15 -10
  78. package/dist/{index-DvoLzsh0.d.mts → index-_GTjwUdG.d.mts} +15 -10
  79. package/dist/index.cjs +1 -1
  80. package/dist/index.d.cts +3 -3
  81. package/dist/index.d.mts +3 -3
  82. package/dist/index.mjs +1 -1
  83. package/dist/{list-display-BQjNDttz.cjs → list-display-BRJVmji0.cjs} +2 -2
  84. package/dist/{list-display-BQjNDttz.cjs.map → list-display-BRJVmji0.cjs.map} +1 -1
  85. package/dist/{list-display-8Jx6G5nk.mjs → list-display-Co94sV4H.mjs} +2 -2
  86. package/dist/{list-display-8Jx6G5nk.mjs.map → list-display-Co94sV4H.mjs.map} +1 -1
  87. package/dist/more-button-BKBcXz6E.mjs.map +1 -1
  88. package/dist/more-button-RYvZgYiu.cjs.map +1 -1
  89. package/dist/{name-display-scAMZdyr.cjs → name-display-B-FtblLL.cjs} +2 -2
  90. package/dist/{name-display-scAMZdyr.cjs.map → name-display-B-FtblLL.cjs.map} +1 -1
  91. package/dist/{name-display-BBJoNnRG.mjs → name-display-CB9XAhXP.mjs} +2 -2
  92. package/dist/{name-display-BBJoNnRG.mjs.map → name-display-CB9XAhXP.mjs.map} +1 -1
  93. package/dist/{number-field-BjVjf6s4.mjs → number-field-CZ06Uzb3.mjs} +2 -2
  94. package/dist/{number-field-BjVjf6s4.mjs.map → number-field-CZ06Uzb3.mjs.map} +1 -1
  95. package/dist/{number-field-DmKh7bbY.cjs → number-field-y0H7X4Ka.cjs} +2 -2
  96. package/dist/{number-field-DmKh7bbY.cjs.map → number-field-y0H7X4Ka.cjs.map} +1 -1
  97. package/dist/{password-field-gHYDiXWY.cjs → password-field-D0drFRG2.cjs} +2 -2
  98. package/dist/{password-field-gHYDiXWY.cjs.map → password-field-D0drFRG2.cjs.map} +1 -1
  99. package/dist/{password-field-C5FsQUa8.mjs → password-field-DSeObMIU.mjs} +2 -2
  100. package/dist/{password-field-C5FsQUa8.mjs.map → password-field-DSeObMIU.mjs.map} +1 -1
  101. package/dist/permalink-CUIKG9VA.cjs +2 -0
  102. package/dist/permalink-CUIKG9VA.cjs.map +1 -0
  103. package/dist/permalink-I-INEarM.mjs +2 -0
  104. package/dist/permalink-I-INEarM.mjs.map +1 -0
  105. package/dist/phone-number-Cu7Mnl6J.mjs +2 -0
  106. package/dist/phone-number-Cu7Mnl6J.mjs.map +1 -0
  107. package/dist/phone-number-DJvfJg1b.cjs +2 -0
  108. package/dist/phone-number-DJvfJg1b.cjs.map +1 -0
  109. package/dist/{popover-form-_hQQpfAB.cjs → popover-form-nkdwopLv.cjs} +2 -2
  110. package/dist/{popover-form-_hQQpfAB.cjs.map → popover-form-nkdwopLv.cjs.map} +1 -1
  111. package/dist/{popover-form-B2taDBAh.mjs → popover-form-rwhAulOD.mjs} +2 -2
  112. package/dist/{popover-form-B2taDBAh.mjs.map → popover-form-rwhAulOD.mjs.map} +1 -1
  113. package/dist/{progress-display-B45TkUcr.cjs → progress-display-DbfN7U8m.cjs} +2 -2
  114. package/dist/{progress-display-B45TkUcr.cjs.map → progress-display-DbfN7U8m.cjs.map} +1 -1
  115. package/dist/{progress-display-DvV-YhkE.mjs → progress-display-qgvclwy9.mjs} +2 -2
  116. package/dist/{progress-display-DvV-YhkE.mjs.map → progress-display-qgvclwy9.mjs.map} +1 -1
  117. package/dist/{radio-group-field-ZqMrf9Dx.mjs → radio-group-field-0BXRGTJx.mjs} +2 -2
  118. package/dist/{radio-group-field-ZqMrf9Dx.mjs.map → radio-group-field-0BXRGTJx.mjs.map} +1 -1
  119. package/dist/{radio-group-field-McpjpLW-.cjs → radio-group-field-wX3cWjyq.cjs} +2 -2
  120. package/dist/{radio-group-field-McpjpLW-.cjs.map → radio-group-field-wX3cWjyq.cjs.map} +1 -1
  121. package/dist/remove-button-B3qFw-M5.cjs.map +1 -1
  122. package/dist/remove-button-Db5oSj4h.mjs.map +1 -1
  123. package/dist/section-form-Dv9fKWmB.mjs +2 -0
  124. package/dist/section-form-Dv9fKWmB.mjs.map +1 -0
  125. package/dist/section-form-cH13fOhg.cjs +2 -0
  126. package/dist/section-form-cH13fOhg.cjs.map +1 -0
  127. package/dist/{select-field-Kq5iQCRQ.mjs → select-field-B-bbY7td.mjs} +2 -2
  128. package/dist/{select-field-Kq5iQCRQ.mjs.map → select-field-B-bbY7td.mjs.map} +1 -1
  129. package/dist/{select-field-DG8sQ5iN.cjs → select-field-DR36Hpe0.cjs} +2 -2
  130. package/dist/{select-field-DG8sQ5iN.cjs.map → select-field-DR36Hpe0.cjs.map} +1 -1
  131. package/dist/{simple-array-field-C5XdemXa.mjs → simple-array-field-CBG9o26e.mjs} +2 -2
  132. package/dist/{simple-array-field-C5XdemXa.mjs.map → simple-array-field-CBG9o26e.mjs.map} +1 -1
  133. package/dist/{simple-array-field-4paKpxXk.cjs → simple-array-field-CZb-E4GS.cjs} +2 -2
  134. package/dist/{simple-array-field-4paKpxXk.cjs.map → simple-array-field-CZb-E4GS.cjs.map} +1 -1
  135. package/dist/{simple-boolean-field-DpJ-fSQk.mjs → simple-boolean-field-BEsGOyof.mjs} +2 -2
  136. package/dist/{simple-boolean-field-DpJ-fSQk.mjs.map → simple-boolean-field-BEsGOyof.mjs.map} +1 -1
  137. package/dist/{simple-boolean-field-B9T_fHk9.cjs → simple-boolean-field-BZ9paBNQ.cjs} +2 -2
  138. package/dist/{simple-boolean-field-B9T_fHk9.cjs.map → simple-boolean-field-BZ9paBNQ.cjs.map} +1 -1
  139. package/dist/{simple-combobox-field-Ch4SBHCH.mjs → simple-combobox-field-BbhxP-te.mjs} +2 -2
  140. package/dist/{simple-combobox-field-Ch4SBHCH.mjs.map → simple-combobox-field-BbhxP-te.mjs.map} +1 -1
  141. package/dist/{simple-combobox-field-ChMKk7xp.cjs → simple-combobox-field-C4Jmm1AJ.cjs} +2 -2
  142. package/dist/{simple-combobox-field-ChMKk7xp.cjs.map → simple-combobox-field-C4Jmm1AJ.cjs.map} +1 -1
  143. package/dist/{simple-date-field-CVKqIrEs.mjs → simple-date-field-D7-UWd6G.mjs} +2 -2
  144. package/dist/{simple-date-field-CVKqIrEs.mjs.map → simple-date-field-D7-UWd6G.mjs.map} +1 -1
  145. package/dist/{simple-date-field-BGGlsHzG.cjs → simple-date-field-JVkBTfCc.cjs} +2 -2
  146. package/dist/{simple-date-field-BGGlsHzG.cjs.map → simple-date-field-JVkBTfCc.cjs.map} +1 -1
  147. package/dist/{simple-email-field-DYqCWprP.cjs → simple-email-field-BBrdKmN8.cjs} +2 -2
  148. package/dist/{simple-email-field-DYqCWprP.cjs.map → simple-email-field-BBrdKmN8.cjs.map} +1 -1
  149. package/dist/{simple-email-field-98w0846B.mjs → simple-email-field-DHnUuabs.mjs} +2 -2
  150. package/dist/{simple-email-field-98w0846B.mjs.map → simple-email-field-DHnUuabs.mjs.map} +1 -1
  151. package/dist/{simple-number-field-otvv2xq-.cjs → simple-number-field-CZ-ycDza.cjs} +2 -2
  152. package/dist/{simple-number-field-otvv2xq-.cjs.map → simple-number-field-CZ-ycDza.cjs.map} +1 -1
  153. package/dist/{simple-number-field-zF3oqS8d.mjs → simple-number-field-DGaUnBOr.mjs} +2 -2
  154. package/dist/{simple-number-field-zF3oqS8d.mjs.map → simple-number-field-DGaUnBOr.mjs.map} +1 -1
  155. package/dist/{simple-password-field-D2UMmghM.cjs → simple-password-field-BUSJzB-t.cjs} +2 -2
  156. package/dist/{simple-password-field-D2UMmghM.cjs.map → simple-password-field-BUSJzB-t.cjs.map} +1 -1
  157. package/dist/{simple-password-field-CuC10c70.mjs → simple-password-field-BxYeEv-p.mjs} +2 -2
  158. package/dist/{simple-password-field-CuC10c70.mjs.map → simple-password-field-BxYeEv-p.mjs.map} +1 -1
  159. package/dist/{simple-radio-group-field-C2DDfIUs.cjs → simple-radio-group-field-CQTkbvt9.cjs} +2 -2
  160. package/dist/{simple-radio-group-field-C2DDfIUs.cjs.map → simple-radio-group-field-CQTkbvt9.cjs.map} +1 -1
  161. package/dist/{simple-radio-group-field-CfziNlLf.mjs → simple-radio-group-field-yJdq-reX.mjs} +2 -2
  162. package/dist/{simple-radio-group-field-CfziNlLf.mjs.map → simple-radio-group-field-yJdq-reX.mjs.map} +1 -1
  163. package/dist/{simple-select-field-CeNnXUHN.cjs → simple-select-field-CUFuptbH.cjs} +2 -2
  164. package/dist/{simple-select-field-CeNnXUHN.cjs.map → simple-select-field-CUFuptbH.cjs.map} +1 -1
  165. package/dist/{simple-select-field-DIaxhi1-.mjs → simple-select-field-Cp64m8Aa.mjs} +2 -2
  166. package/dist/{simple-select-field-DIaxhi1-.mjs.map → simple-select-field-Cp64m8Aa.mjs.map} +1 -1
  167. package/dist/{simple-text-field-LYWVIAfQ.cjs → simple-text-field-B2Z1E4sG.cjs} +2 -2
  168. package/dist/{simple-text-field-LYWVIAfQ.cjs.map → simple-text-field-B2Z1E4sG.cjs.map} +1 -1
  169. package/dist/{simple-text-field-D8jyznSd.mjs → simple-text-field-Dl2IOsO3.mjs} +2 -2
  170. package/dist/{simple-text-field-D8jyznSd.mjs.map → simple-text-field-Dl2IOsO3.mjs.map} +1 -1
  171. package/dist/{simple-textarea-field-p9qX_n7m.mjs → simple-textarea-field-CM9aHy-q.mjs} +2 -2
  172. package/dist/{simple-textarea-field-p9qX_n7m.mjs.map → simple-textarea-field-CM9aHy-q.mjs.map} +1 -1
  173. package/dist/{simple-textarea-field-DcEvaizE.cjs → simple-textarea-field-Cjjk9WOW.cjs} +2 -2
  174. package/dist/{simple-textarea-field-DcEvaizE.cjs.map → simple-textarea-field-Cjjk9WOW.cjs.map} +1 -1
  175. package/dist/{statistic-DwiUKz02.mjs → statistic-ClkqqDfk.mjs} +2 -2
  176. package/dist/statistic-ClkqqDfk.mjs.map +1 -0
  177. package/dist/{statistic-BHCSCw9Q.cjs → statistic-LL4uHlRb.cjs} +2 -2
  178. package/dist/statistic-LL4uHlRb.cjs.map +1 -0
  179. package/dist/{status-display-BKe0EupF.mjs → status-display-BUphOF18.mjs} +2 -2
  180. package/dist/{status-display-BKe0EupF.mjs.map → status-display-BUphOF18.mjs.map} +1 -1
  181. package/dist/{status-display-BRJX53bQ.cjs → status-display-o9inMVvb.cjs} +2 -2
  182. package/dist/{status-display-BRJX53bQ.cjs.map → status-display-o9inMVvb.cjs.map} +1 -1
  183. package/dist/summary-bar-CYfgdxrQ.mjs +2 -0
  184. package/dist/summary-bar-CYfgdxrQ.mjs.map +1 -0
  185. package/dist/summary-bar-Mb1B9Dnf.cjs +2 -0
  186. package/dist/summary-bar-Mb1B9Dnf.cjs.map +1 -0
  187. package/dist/{switch-field-n6a5SaEM.cjs → switch-field-CO5M4qiM.cjs} +2 -2
  188. package/dist/{switch-field-n6a5SaEM.cjs.map → switch-field-CO5M4qiM.cjs.map} +1 -1
  189. package/dist/{switch-field-CIoNsRWN.mjs → switch-field-IXQ1Blrd.mjs} +2 -2
  190. package/dist/{switch-field-CIoNsRWN.mjs.map → switch-field-IXQ1Blrd.mjs.map} +1 -1
  191. package/dist/tables-078i-X0d.cjs +2 -0
  192. package/dist/tables-078i-X0d.cjs.map +1 -0
  193. package/dist/tables-BGzwkdFO.mjs +2 -0
  194. package/dist/tables-BGzwkdFO.mjs.map +1 -0
  195. package/dist/{tanstack-form-CNrZQZhn.cjs → tanstack-form-BC61U3F-.cjs} +2 -2
  196. package/dist/{tanstack-form-CNrZQZhn.cjs.map → tanstack-form-BC61U3F-.cjs.map} +1 -1
  197. package/dist/{tanstack-form-PC9YNeeo.mjs → tanstack-form-DJMaMeUh.mjs} +2 -2
  198. package/dist/{tanstack-form-PC9YNeeo.mjs.map → tanstack-form-DJMaMeUh.mjs.map} +1 -1
  199. package/dist/{text-editor-field-gas5r-xy.cjs → text-editor-field-D_l4zp_y.cjs} +2 -2
  200. package/dist/{text-editor-field-gas5r-xy.cjs.map → text-editor-field-D_l4zp_y.cjs.map} +1 -1
  201. package/dist/{text-editor-field-fso-sw29.mjs → text-editor-field-DxLBaxTL.mjs} +2 -2
  202. package/dist/{text-editor-field-fso-sw29.mjs.map → text-editor-field-DxLBaxTL.mjs.map} +1 -1
  203. package/dist/{text-field-BMo-8rsq.cjs → text-field-B8xQe0U9.cjs} +2 -2
  204. package/dist/{text-field-BMo-8rsq.cjs.map → text-field-B8xQe0U9.cjs.map} +1 -1
  205. package/dist/{text-field-B67oTV62.mjs → text-field-BrxKYCui.mjs} +2 -2
  206. package/dist/{text-field-B67oTV62.mjs.map → text-field-BrxKYCui.mjs.map} +1 -1
  207. package/dist/{textarea-field-D70rGYIk.mjs → textarea-field-BoQtVUI-.mjs} +2 -2
  208. package/dist/{textarea-field-D70rGYIk.mjs.map → textarea-field-BoQtVUI-.mjs.map} +1 -1
  209. package/dist/{textarea-field-BUGcITwp.cjs → textarea-field-IZUGVQjJ.cjs} +2 -2
  210. package/dist/{textarea-field-BUGcITwp.cjs.map → textarea-field-IZUGVQjJ.cjs.map} +1 -1
  211. package/dist/{tooltip-DVK6xfZ1.cjs → tooltip-BcfELg8e.cjs} +3 -3
  212. package/dist/tooltip-BcfELg8e.cjs.map +1 -0
  213. package/dist/tooltip-TGmzPdoR.mjs +4 -0
  214. package/dist/tooltip-TGmzPdoR.mjs.map +1 -0
  215. package/package.json +1 -1
  216. package/dist/analysis-panel-BD2QvOth.mjs +0 -2
  217. package/dist/analysis-panel-BD2QvOth.mjs.map +0 -1
  218. package/dist/analysis-panel-UlC7cvO2.cjs.map +0 -1
  219. package/dist/combobox-field-D6fiCcvU.mjs +0 -2
  220. package/dist/combobox-field-D6fiCcvU.mjs.map +0 -1
  221. package/dist/combobox-field-DLpH6J9H.cjs +0 -2
  222. package/dist/combobox-field-DLpH6J9H.cjs.map +0 -1
  223. package/dist/email-display-D6ZgA_en.cjs +0 -2
  224. package/dist/email-display-D6ZgA_en.cjs.map +0 -1
  225. package/dist/email-display-m745lUts.mjs +0 -2
  226. package/dist/email-display-m745lUts.mjs.map +0 -1
  227. package/dist/permalink-CZ3g9daG.mjs +0 -2
  228. package/dist/permalink-CZ3g9daG.mjs.map +0 -1
  229. package/dist/permalink-DeeEKhfc.cjs +0 -2
  230. package/dist/permalink-DeeEKhfc.cjs.map +0 -1
  231. package/dist/phone-number-C43z68gT.mjs +0 -2
  232. package/dist/phone-number-C43z68gT.mjs.map +0 -1
  233. package/dist/phone-number-DhThJwd6.cjs +0 -2
  234. package/dist/phone-number-DhThJwd6.cjs.map +0 -1
  235. package/dist/section-form-B9iTs2we.cjs +0 -2
  236. package/dist/section-form-B9iTs2we.cjs.map +0 -1
  237. package/dist/section-form-B_AZr7jZ.mjs +0 -2
  238. package/dist/section-form-B_AZr7jZ.mjs.map +0 -1
  239. package/dist/statistic-BHCSCw9Q.cjs.map +0 -1
  240. package/dist/statistic-DwiUKz02.mjs.map +0 -1
  241. package/dist/summary-bar-ByYm7uWR.mjs +0 -2
  242. package/dist/summary-bar-ByYm7uWR.mjs.map +0 -1
  243. package/dist/summary-bar-DjdtmsIY.cjs +0 -2
  244. package/dist/summary-bar-DjdtmsIY.cjs.map +0 -1
  245. package/dist/tables-9d53sH9E.mjs +0 -2
  246. package/dist/tables-9d53sH9E.mjs.map +0 -1
  247. package/dist/tables-B1O9qy-m.cjs +0 -2
  248. package/dist/tables-B1O9qy-m.cjs.map +0 -1
  249. package/dist/tooltip-DVK6xfZ1.cjs.map +0 -1
  250. package/dist/tooltip-lvpW5dMi.mjs +0 -4
  251. package/dist/tooltip-lvpW5dMi.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-TGmzPdoR.mjs","names":[],"sources":["../packages/components/features/tables/utils/csv.ts","../packages/components/features/tables/components/table/tooltip.tsx"],"sourcesContent":["'use client';\n\nimport type { CsvCell } from '../types';\n\nfunction formatCell(value: CsvCell['value']): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n const str = String(value);\n if (str.includes(',') || str.includes('\"') || str.includes('\\n') || str.includes('\\r')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\nexport function buildCsvContent(rows: CsvCell[][]): string {\n if (rows.length === 0) return '';\n const headers = rows[0].map(cell => formatCell(cell.label));\n const dataRows = rows.map(row => row.map(cell => formatCell(cell.value)).join(','));\n return [headers.join(','), ...dataRows].join('\\n');\n}\n\nexport function downloadCsv(rows: CsvCell[][], fileName: string): void {\n const content = buildCsvContent(rows);\n if (!content) return;\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `${fileName}.csv`;\n link.click();\n URL.revokeObjectURL(url);\n}\n","/**\n * @file tooltip.tsx\n * Toolbar components rendered above the table: a debounced search input,\n * an action button group (create / refresh / download), and the outer\n * toolbar shell that displays the table title.\n */\nimport { useCallback } from 'react';\n\nimport { ArrowRightIcon, BarChart2Icon, CirclePlus, DownloadIcon, LayoutDashboardIcon, RefreshCwIcon, SearchIcon } from 'lucide-react';\n\nimport { useDebounceCallback } from '@customafk/react-toolkit/hooks/useDebounceCallback';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\n\nimport { useUITableAnalysisContext, useUITableContext, useUITableSummaryContext } from '../../hooks/use-context';\nimport { downloadCsv } from '../../utils/csv';\n\n/**\n * Debounced search input rendered inside the table toolbar.\n *\n * Fires `onSearch` 500 ms after the user stops typing and delegates all other\n * native input events via the spread `props`.\n *\n * @example\n * ```tsx\n * import { UITableTooltipFilter } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableTooltipFilter\n * placeholder=\"Search users…\"\n * onSearch={value => setQuery(value)}\n * />\n * ```\n */\nexport const UITableTooltipFilter: React.FC<\n Omit<React.ComponentProps<typeof Input>, 'className'> & {\n onSearch?: (value: string) => void;\n }\n> = ({ onSearch, onChange, ...props }) => {\n const debouncedSearch = useDebounceCallback((value: string) => {\n onSearch?.(value);\n }, 500);\n return (\n <div className=\"relative w-full max-w-80 flex-1\">\n <Input\n {...props}\n size=\"lg\"\n type=\"search\"\n placeholder=\"Tìm kiếm...\"\n className=\"flex-1 ps-9 pe-9\"\n onChange={e => {\n onChange?.(e);\n debouncedSearch(e.target.value ?? '');\n }}\n />\n <div className=\"pointer-events-none absolute inset-y-0 inset-s-0 flex items-center justify-center ps-3 text-text-positive-weak peer-disabled:opacity-50\">\n <SearchIcon size={16} />\n </div>\n <button\n className=\"absolute inset-y-0 inset-e-0 flex h-full w-9 items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:z-10 focus-visible:border focus-visible:border-primary-strong focus-visible:ring-[3px] focus-visible:ring-primary-weak disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Submit search\"\n type=\"submit\"\n >\n <ArrowRightIcon size={16} aria-hidden=\"true\" />\n </button>\n </div>\n );\n};\n\nconst ActionButton: React.FC<React.PropsWithChildren<React.ComponentProps<'button'>>> = ({ children, disabled, onClick, className, ...props }) => {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'flex cursor-pointer items-center gap-x-1 rounded-sm border border-border bg-background p-2.5 text-sm text-text-positive-weak outline-none transition-all hover:shadow-card focus:border-border-emphasis focus:bg-muted-muted active:border-border-emphasis active:bg-muted-muted active:text-text-positive disabled:pointer-events-none disabled:cursor-default disabled:opacity-60 [&_svg]:size-3.5',\n className\n )}\n onClick={onClick}\n {...props}\n >\n {children}\n </button>\n );\n};\n\n/**\n * Grouped action buttons (create, refresh, download) displayed in the table\n * toolbar.\n *\n * Each button is disabled automatically when the corresponding handler prop is\n * omitted, so only the actions relevant to a given table need to be provided.\n * A toggle for `UITableSummaryBar` appears automatically when `summary` is\n * non-empty, and a toggle for `UITableAnalysisPanel` appears when\n * `showAnalysisPanel` is `true` (both set on `UITableProvider`).\n *\n * @example\n * ```tsx\n * import { UITableTooltipActions } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableTooltipActions\n * onCreate={() => setOpenCreate(true)}\n * onRefresh={() => refetch()}\n * />\n * ```\n */\nexport const UITableTooltipActions: React.FC<{\n onCreate?: () => void;\n onRefresh?: () => void;\n onDownload?: () => void;\n}> = ({ onCreate, onDownload, onRefresh }) => {\n const { table, csvData, csvFileName, title, showAnalysisPanel, summary } = useUITableContext();\n const { isOpen: isAnalysisOpen, toggle: toggleAnalysis } = useUITableAnalysisContext();\n const { isOpen: isSummaryOpen, toggle: toggleSummary } = useUITableSummaryContext();\n\n const handleDownload = useCallback(() => {\n if (onDownload) {\n onDownload();\n return;\n }\n if (!csvData || csvData.length === 0) return;\n const selectedRows = table.getSelectedRowModel().flatRows;\n const rows = selectedRows.length > 0 ? selectedRows.map(row => csvData[row.index]).filter(Boolean) : csvData;\n downloadCsv(rows, csvFileName || title);\n }, [onDownload, csvData, csvFileName, table, title]);\n\n const isDownloadEnabled = !!(onDownload || (csvData && csvData.length > 0));\n\n return (\n <div className=\"flex [&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\">\n <ActionButton\n disabled={!onCreate}\n onClick={e => {\n onCreate?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <CirclePlus />\n </ActionButton>\n <ActionButton\n disabled={!onRefresh}\n onClick={e => {\n onRefresh?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <RefreshCwIcon />\n </ActionButton>\n <ActionButton\n disabled={!isDownloadEnabled}\n onClick={e => {\n handleDownload();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <DownloadIcon />\n </ActionButton>\n {summary && summary.length > 0 && (\n <ActionButton\n onClick={e => {\n toggleSummary();\n e.stopPropagation();\n e.preventDefault();\n }}\n aria-pressed={isSummaryOpen}\n aria-label={isSummaryOpen ? 'Ẩn tổng quan' : 'Hiện tổng quan'}\n className={isSummaryOpen ? 'bg-muted-muted text-text-positive' : undefined}\n >\n <LayoutDashboardIcon />\n </ActionButton>\n )}\n {showAnalysisPanel && (\n <ActionButton\n onClick={e => {\n toggleAnalysis();\n e.stopPropagation();\n e.preventDefault();\n }}\n aria-pressed={isAnalysisOpen}\n className={isAnalysisOpen ? 'bg-muted-muted text-text-positive' : undefined}\n >\n <BarChart2Icon />\n </ActionButton>\n )}\n </div>\n );\n};\n\n/**\n * Outer toolbar shell for the UITable component.\n *\n * Reads the table `title` from `UITableContext` and renders it as a heading\n * above the `children` slot, which typically contains a\n * `UITableTooltipFilter` and/or `UITableTooltipActions`.\n *\n * @example\n * ```tsx\n * import {\n * UITableTooltip,\n * UITableTooltipFilter,\n * UITableTooltipActions,\n * } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableTooltip>\n * <UITableTooltipFilter onSearch={setQuery} />\n * <UITableTooltipActions onCreate={handleCreate} onRefresh={refetch} />\n * </UITableTooltip>\n * ```\n */\nexport const UITableTooltip: React.FC<React.PropsWithChildren> = ({ children }) => {\n const { title, description, headerActions } = useUITableContext();\n return (\n <div data-slot=\"table-tooltip\" className=\"relative flex w-full flex-col gap-2 px-2 py-0 text-sm\">\n <div className=\"flex w-full items-start justify-between gap-4\">\n <div className=\"flex flex-col gap-0.5\">\n <h3 className=\"font-semibold text-base text-text-positive\">{title}</h3>\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n {headerActions && <div className=\"flex items-center gap-2 shrink-0\">{headerActions}</div>}\n </div>\n <div className=\"flex w-full flex-1 justify-between gap-x-2\">{children}</div>\n </div>\n );\n};\nUITableTooltip.displayName = 'UITableTooltip';\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@customafk/lunas-ui",
3
- "version": "0.2.68",
3
+ "version": "0.2.69",
4
4
  "description": "UI library for Lunas Enterprise",
5
5
  "type": "module",
6
6
  "author": {
@@ -1,2 +0,0 @@
1
- import{Statistic as e}from"./data-display/statistic.mjs";import{G as t,K as n,q as r}from"./tables-9d53sH9E.mjs";import{ChevronDownIcon as i,ChevronUpIcon as a}from"lucide-react";import{memo as o,useMemo as s}from"react";import{cn as c}from"@customafk/react-toolkit/utils";import{jsx as l,jsxs as u}from"react/jsx-runtime";function d(e,t,n){switch(n){case`count`:return e;case`sum`:return t.reduce((e,t)=>e+t,0);case`avg`:return t.length===0?0:t.reduce((e,t)=>e+t,0)/t.length;case`min`:return t.length===0?0:Math.min(...t);case`max`:return t.length===0?0:Math.max(...t)}}function f(e,t){return e.map(e=>{let n=e.getValue(t);return typeof n==`string`?Number(n):typeof n==`number`?n:NaN}).filter(e=>!Number.isNaN(e))}const p={sum:`Tổng`,avg:`Trung bình`,count:`Đếm`,min:`Nhỏ nhất`,max:`Lớn nhất`},m=o(()=>{let{table:o,totalRows:m}=r(),{rowSelectionState:g}=n(),{isOpen:_,toggle:v}=t(),y=s(()=>o.getRowModel().rows,[o]),b=s(()=>o.getSelectedRowModel().flatRows,[o,g]),x=s(()=>o.getHeaderGroups()[0]?.headers??[],[o]),S=s(()=>x.filter(e=>![`select`,`actions`].includes(e.id)).flatMap(e=>{let t=e.column.columnDef.meta?.aggregation;if(!t)return[];let n=t.label??(typeof e.column.columnDef.header==`string`?e.column.columnDef.header:e.id),r=f(y,e.id),i=b.length>0?f(b,e.id):null;return[{colId:e.id,header:n,aggregation:t,allValue:d(y.length,r,t.type),selectedValue:i===null?null:d(b.length,i,t.type)}]}),[x,y,b]);return u(`div`,{"data-slot":`table-analysis-panel`,className:`w-full border-t border-border`,children:[u(`button`,{type:`button`,className:c(`flex w-full items-center justify-between px-4 py-2 text-sm font-medium text-text-positive`,`hover:bg-muted-bg-subtle transition-colors outline-none`,`focus-visible:ring-2 focus-visible:ring-primary-weak`),onClick:v,"aria-expanded":_,children:[l(`span`,{children:`Tổng quan dữ liệu`}),l(_?a:i,{size:14})]}),_&&u(`div`,{className:`px-4 pb-4 pt-2 space-y-4`,children:[u(`div`,{className:`flex flex-wrap gap-4`,children:[l(h,{label:`Tổng bản ghi`,value:m??y.length}),l(h,{label:`Hàng hiển thị`,value:y.length}),l(h,{label:`Hàng đã chọn`,value:b.length,highlight:b.length>0})]}),S.length>0&&u(`div`,{children:[l(`p`,{className:`mb-2 text-xs font-semibold uppercase tracking-wide text-text-positive-weak`,children:`Tóm tắt cột`}),l(`div`,{className:`overflow-x-auto rounded-md border border-border`,children:u(`table`,{className:`w-full text-sm`,children:[l(`thead`,{children:u(`tr`,{className:`border-b border-border bg-muted-bg-subtle text-xs text-text-positive-weak`,children:[l(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Cột`}),l(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Kiểu`}),l(`th`,{className:`px-3 py-2 text-right font-medium`,children:`Tất cả hàng`}),b.length>0&&l(`th`,{className:`px-3 py-2 text-right font-medium`,children:`Hàng đã chọn`})]})}),l(`tbody`,{children:S.map((t,n)=>u(`tr`,{className:c(`border-b border-border last:border-b-0`,n%2==1&&`bg-muted-bg-subtle/50`),children:[l(`td`,{className:`px-3 py-2 text-text-positive font-medium`,children:t.header}),l(`td`,{className:`px-3 py-2 text-text-positive-weak`,children:p[t.aggregation.type]}),l(`td`,{className:`px-3 py-2 text-right`,children:l(e,{value:t.allValue,prefix:t.aggregation.prefix,suffix:t.aggregation.suffix,precision:t.aggregation.precision,size:`sm`})}),b.length>0&&l(`td`,{className:`px-3 py-2 text-right`,children:t.selectedValue===null?l(`span`,{className:`text-text-positive-weak`,children:`—`}):l(e,{value:t.selectedValue,prefix:t.aggregation.prefix,suffix:t.aggregation.suffix,precision:t.aggregation.precision,size:`sm`})})]},t.colId))})]})})]})]})]})});m.displayName=`UITableAnalysisPanel`;const h=o(({label:e,value:t,highlight:n})=>u(`div`,{className:c(`flex flex-col gap-0.5 rounded border px-3 py-2 min-w-25 bg-white`,n&&t>0?`border-primary bg-primary-bg-subtle`:`border-border bg-white`),children:[l(`span`,{className:`text-[11px] text-text-positive-weak`,children:e}),l(`span`,{className:`text-base font-semibold tabular-nums text-text-positive-strong`,children:t.toLocaleString()})]}));h.displayName=`StatChip`;export{m as UITableAnalysisPanel};
2
- //# sourceMappingURL=analysis-panel-BD2QvOth.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analysis-panel-BD2QvOth.mjs","names":[],"sources":["../packages/components/features/tables/components/table/analysis-panel.tsx"],"sourcesContent":["'use client';\nimport { memo, useMemo } from 'react';\n\nimport { ChevronDownIcon, ChevronUpIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { AnyEntity } from '@/types';\nimport { Statistic } from '@/components/data-display/statistic';\n\nimport { useUITableAnalysisContext, useUITableBodyContext, useUITableContext } from '../../hooks/use-context';\nimport type { ColumnAggregation, ColumnAggregationType } from '../../types';\n\nfunction computeAggregation(rowCount: number, values: number[], type: ColumnAggregationType): number {\n switch (type) {\n case 'count':\n return rowCount;\n case 'sum':\n return values.reduce((a, b) => a + b, 0);\n case 'avg':\n return values.length === 0 ? 0 : values.reduce((a, b) => a + b, 0) / values.length;\n case 'min':\n return values.length === 0 ? 0 : Math.min(...values);\n case 'max':\n return values.length === 0 ? 0 : Math.max(...values);\n }\n}\n\nfunction extractNumericValues(rows: { getValue: (id: string) => unknown }[], colId: string): number[] {\n return rows\n .map(r => {\n const v = r.getValue(colId);\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return n;\n })\n .filter(n => !Number.isNaN(n));\n}\n\ntype AggregationLabel = {\n colId: string;\n header: string;\n aggregation: ColumnAggregation;\n allValue: number;\n selectedValue: number | null;\n};\n\nconst typeLabels: Record<ColumnAggregationType, string> = {\n sum: 'Tổng',\n avg: 'Trung bình',\n count: 'Đếm',\n min: 'Nhỏ nhất',\n max: 'Lớn nhất',\n};\n\nexport const UITableAnalysisPanel = memo(() => {\n const { table, totalRows } = useUITableContext();\n const { rowSelectionState } = useUITableBodyContext();\n const { isOpen, toggle } = useUITableAnalysisContext();\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: row model\n const allRows = useMemo(() => table.getRowModel().rows, [table]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: selected rows\n const selectedRows = useMemo(() => table.getSelectedRowModel().flatRows, [table, rowSelectionState]);\n\n const headers = useMemo(() => table.getHeaderGroups()[0]?.headers ?? [], [table]);\n\n const aggregationRows = useMemo<AggregationLabel[]>(() => {\n return headers\n .filter(h => !['select', 'actions'].includes(h.id))\n .flatMap(header => {\n const agg = (header.column.columnDef.meta as AnyEntity)?.aggregation as ColumnAggregation | undefined;\n if (!agg) return [];\n\n const headerText = agg.label ?? (typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : header.id);\n\n const allValues = extractNumericValues(allRows, header.id);\n const selectedValues = selectedRows.length > 0 ? extractNumericValues(selectedRows, header.id) : null;\n\n return [\n {\n colId: header.id,\n header: headerText,\n aggregation: agg,\n allValue: computeAggregation(allRows.length, allValues, agg.type),\n selectedValue: selectedValues !== null ? computeAggregation(selectedRows.length, selectedValues, agg.type) : null,\n },\n ];\n });\n }, [headers, allRows, selectedRows]);\n\n return (\n <div data-slot=\"table-analysis-panel\" className=\"w-full border-t border-border\">\n <button\n type=\"button\"\n className={cn(\n 'flex w-full items-center justify-between px-4 py-2 text-sm font-medium text-text-positive',\n 'hover:bg-muted-bg-subtle transition-colors outline-none',\n 'focus-visible:ring-2 focus-visible:ring-primary-weak'\n )}\n onClick={toggle}\n aria-expanded={isOpen}\n >\n <span>Tổng quan dữ liệu</span>\n {isOpen ? <ChevronUpIcon size={14} /> : <ChevronDownIcon size={14} />}\n </button>\n\n {isOpen && (\n <div className=\"px-4 pb-4 pt-2 space-y-4\">\n {/* Row summary */}\n <div className=\"flex flex-wrap gap-4\">\n <StatChip label=\"Tổng bản ghi\" value={totalRows ?? allRows.length} />\n <StatChip label=\"Hàng hiển thị\" value={allRows.length} />\n <StatChip label=\"Hàng đã chọn\" value={selectedRows.length} highlight={selectedRows.length > 0} />\n </div>\n\n {/* Column aggregations */}\n {aggregationRows.length > 0 && (\n <div>\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-positive-weak\">Tóm tắt cột</p>\n <div className=\"overflow-x-auto rounded-md border border-border\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-muted-bg-subtle text-xs text-text-positive-weak\">\n <th className=\"px-3 py-2 text-left font-medium\">Cột</th>\n <th className=\"px-3 py-2 text-left font-medium\">Kiểu</th>\n <th className=\"px-3 py-2 text-right font-medium\">Tất cả hàng</th>\n {selectedRows.length > 0 && <th className=\"px-3 py-2 text-right font-medium\">Hàng đã chọn</th>}\n </tr>\n </thead>\n <tbody>\n {aggregationRows.map((row, idx) => (\n <tr key={row.colId} className={cn('border-b border-border last:border-b-0', idx % 2 === 1 && 'bg-muted-bg-subtle/50')}>\n <td className=\"px-3 py-2 text-text-positive font-medium\">{row.header}</td>\n <td className=\"px-3 py-2 text-text-positive-weak\">{typeLabels[row.aggregation.type]}</td>\n <td className=\"px-3 py-2 text-right\">\n <Statistic\n value={row.allValue}\n prefix={row.aggregation.prefix}\n suffix={row.aggregation.suffix}\n precision={row.aggregation.precision}\n size=\"sm\"\n />\n </td>\n {selectedRows.length > 0 && (\n <td className=\"px-3 py-2 text-right\">\n {row.selectedValue !== null ? (\n <Statistic\n value={row.selectedValue}\n prefix={row.aggregation.prefix}\n suffix={row.aggregation.suffix}\n precision={row.aggregation.precision}\n size=\"sm\"\n />\n ) : (\n <span className=\"text-text-positive-weak\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n});\nUITableAnalysisPanel.displayName = 'UITableAnalysisPanel';\n\nconst StatChip = memo<{ label: string; value: number; highlight?: boolean }>(({ label, value, highlight }) => (\n <div\n className={cn(\n 'flex flex-col gap-0.5 rounded border px-3 py-2 min-w-25 bg-white',\n highlight && value > 0 ? 'border-primary bg-primary-bg-subtle' : 'border-border bg-white'\n )}\n >\n <span className=\"text-[11px] text-text-positive-weak\">{label}</span>\n <span className=\"text-base font-semibold tabular-nums text-text-positive-strong\">{value.toLocaleString()}</span>\n </div>\n));\nStatChip.displayName = 'StatChip';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"analysis-panel-UlC7cvO2.cjs","names":["useUITableContext","useUITableBodyContext","useUITableAnalysisContext","ChevronUpIcon","ChevronDownIcon","Statistic"],"sources":["../packages/components/features/tables/components/table/analysis-panel.tsx"],"sourcesContent":["'use client';\nimport { memo, useMemo } from 'react';\n\nimport { ChevronDownIcon, ChevronUpIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { AnyEntity } from '@/types';\nimport { Statistic } from '@/components/data-display/statistic';\n\nimport { useUITableAnalysisContext, useUITableBodyContext, useUITableContext } from '../../hooks/use-context';\nimport type { ColumnAggregation, ColumnAggregationType } from '../../types';\n\nfunction computeAggregation(rowCount: number, values: number[], type: ColumnAggregationType): number {\n switch (type) {\n case 'count':\n return rowCount;\n case 'sum':\n return values.reduce((a, b) => a + b, 0);\n case 'avg':\n return values.length === 0 ? 0 : values.reduce((a, b) => a + b, 0) / values.length;\n case 'min':\n return values.length === 0 ? 0 : Math.min(...values);\n case 'max':\n return values.length === 0 ? 0 : Math.max(...values);\n }\n}\n\nfunction extractNumericValues(rows: { getValue: (id: string) => unknown }[], colId: string): number[] {\n return rows\n .map(r => {\n const v = r.getValue(colId);\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return n;\n })\n .filter(n => !Number.isNaN(n));\n}\n\ntype AggregationLabel = {\n colId: string;\n header: string;\n aggregation: ColumnAggregation;\n allValue: number;\n selectedValue: number | null;\n};\n\nconst typeLabels: Record<ColumnAggregationType, string> = {\n sum: 'Tổng',\n avg: 'Trung bình',\n count: 'Đếm',\n min: 'Nhỏ nhất',\n max: 'Lớn nhất',\n};\n\nexport const UITableAnalysisPanel = memo(() => {\n const { table, totalRows } = useUITableContext();\n const { rowSelectionState } = useUITableBodyContext();\n const { isOpen, toggle } = useUITableAnalysisContext();\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: row model\n const allRows = useMemo(() => table.getRowModel().rows, [table]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: selected rows\n const selectedRows = useMemo(() => table.getSelectedRowModel().flatRows, [table, rowSelectionState]);\n\n const headers = useMemo(() => table.getHeaderGroups()[0]?.headers ?? [], [table]);\n\n const aggregationRows = useMemo<AggregationLabel[]>(() => {\n return headers\n .filter(h => !['select', 'actions'].includes(h.id))\n .flatMap(header => {\n const agg = (header.column.columnDef.meta as AnyEntity)?.aggregation as ColumnAggregation | undefined;\n if (!agg) return [];\n\n const headerText = agg.label ?? (typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : header.id);\n\n const allValues = extractNumericValues(allRows, header.id);\n const selectedValues = selectedRows.length > 0 ? extractNumericValues(selectedRows, header.id) : null;\n\n return [\n {\n colId: header.id,\n header: headerText,\n aggregation: agg,\n allValue: computeAggregation(allRows.length, allValues, agg.type),\n selectedValue: selectedValues !== null ? computeAggregation(selectedRows.length, selectedValues, agg.type) : null,\n },\n ];\n });\n }, [headers, allRows, selectedRows]);\n\n return (\n <div data-slot=\"table-analysis-panel\" className=\"w-full border-t border-border\">\n <button\n type=\"button\"\n className={cn(\n 'flex w-full items-center justify-between px-4 py-2 text-sm font-medium text-text-positive',\n 'hover:bg-muted-bg-subtle transition-colors outline-none',\n 'focus-visible:ring-2 focus-visible:ring-primary-weak'\n )}\n onClick={toggle}\n aria-expanded={isOpen}\n >\n <span>Tổng quan dữ liệu</span>\n {isOpen ? <ChevronUpIcon size={14} /> : <ChevronDownIcon size={14} />}\n </button>\n\n {isOpen && (\n <div className=\"px-4 pb-4 pt-2 space-y-4\">\n {/* Row summary */}\n <div className=\"flex flex-wrap gap-4\">\n <StatChip label=\"Tổng bản ghi\" value={totalRows ?? allRows.length} />\n <StatChip label=\"Hàng hiển thị\" value={allRows.length} />\n <StatChip label=\"Hàng đã chọn\" value={selectedRows.length} highlight={selectedRows.length > 0} />\n </div>\n\n {/* Column aggregations */}\n {aggregationRows.length > 0 && (\n <div>\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-positive-weak\">Tóm tắt cột</p>\n <div className=\"overflow-x-auto rounded-md border border-border\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-muted-bg-subtle text-xs text-text-positive-weak\">\n <th className=\"px-3 py-2 text-left font-medium\">Cột</th>\n <th className=\"px-3 py-2 text-left font-medium\">Kiểu</th>\n <th className=\"px-3 py-2 text-right font-medium\">Tất cả hàng</th>\n {selectedRows.length > 0 && <th className=\"px-3 py-2 text-right font-medium\">Hàng đã chọn</th>}\n </tr>\n </thead>\n <tbody>\n {aggregationRows.map((row, idx) => (\n <tr key={row.colId} className={cn('border-b border-border last:border-b-0', idx % 2 === 1 && 'bg-muted-bg-subtle/50')}>\n <td className=\"px-3 py-2 text-text-positive font-medium\">{row.header}</td>\n <td className=\"px-3 py-2 text-text-positive-weak\">{typeLabels[row.aggregation.type]}</td>\n <td className=\"px-3 py-2 text-right\">\n <Statistic\n value={row.allValue}\n prefix={row.aggregation.prefix}\n suffix={row.aggregation.suffix}\n precision={row.aggregation.precision}\n size=\"sm\"\n />\n </td>\n {selectedRows.length > 0 && (\n <td className=\"px-3 py-2 text-right\">\n {row.selectedValue !== null ? (\n <Statistic\n value={row.selectedValue}\n prefix={row.aggregation.prefix}\n suffix={row.aggregation.suffix}\n precision={row.aggregation.precision}\n size=\"sm\"\n />\n ) : (\n <span className=\"text-text-positive-weak\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n});\nUITableAnalysisPanel.displayName = 'UITableAnalysisPanel';\n\nconst StatChip = memo<{ label: string; value: number; highlight?: boolean }>(({ label, value, highlight }) => (\n <div\n className={cn(\n 'flex flex-col gap-0.5 rounded border px-3 py-2 min-w-25 bg-white',\n highlight && value > 0 ? 'border-primary bg-primary-bg-subtle' : 'border-border bg-white'\n )}\n >\n <span className=\"text-[11px] text-text-positive-weak\">{label}</span>\n <span className=\"text-base font-semibold tabular-nums text-text-positive-strong\">{value.toLocaleString()}</span>\n </div>\n));\nStatChip.displayName = 'StatChip';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{Button as e}from"./ui/button.mjs";import{Dialog as t,DialogClose as n,DialogOverlay as ee,DialogPortal as te}from"./ui/dialog.mjs";import{Command as r,CommandEmpty as i,CommandGroup as a,CommandInput as o,CommandItem as s,CommandList as c}from"./ui/command.mjs";import{G as ne}from"./tanstack-form-PC9YNeeo.mjs";import{Popover as re,PopoverContent as l,PopoverTrigger as u}from"./ui/popover.mjs";import{Field as d,FieldContent as f,FieldContentMain as p,FieldDescription as m,FieldError as h,FieldGroup as g,FieldLabel as _,FieldNote as ie,FieldSeparator as ae,FieldTooltip as oe}from"./field-BKyUqvzh.mjs";import{XIcon as v}from"lucide-react";import{memo as y,useId as b,useState as x}from"react";import{cn as S}from"@customafk/react-toolkit/utils";import{Fragment as C,jsx as w,jsxs as T}from"react/jsx-runtime";import{Dialog as E}from"radix-ui";import{useIsMobile as D}from"@customafk/react-toolkit/hooks/useMobile";import{useStore as O}from"@tanstack/react-form";const k=y(({label:y,description:k,placeholder:A,tooltip:j,helperText:M,orientation:N=`responsive`,options:P,required:F=!1,disabled:se=!1,clearable:I=!1,showErrorMessage:L=!0})=>{let R=b(),z=ne(),B=D(),[V,H]=x(!1),[U,W]=x(!1),G=O(z.form.store,({isSubmitting:e})=>e),K=se||G,q=z.state.meta.isDirty||z.state.meta.isTouched,J=q&&!z.state.meta.isValid,ce=F&&z.state.value===null,Y=I&&!!z.state.value&&!K,X=P.find(({value:e})=>e===z.state.value)?.label,Z=()=>{z.handleChange(null),z.handleBlur()},Q=t=>w(e,{variant:`outline`,color:`muted`,size:`lg`,disabled:K,"aria-invalid":J?!0:void 0,"aria-describedby":R,className:S(`flex w-full items-center justify-start rounded outline-border`,`hover:bg-transparent`,`focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak`,`data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`,Y&&`pr-8`,!z.state.value&&`text-text-positive-muted`,J&&`outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak`),onClick:t,children:X?w(`p`,{className:`flex min-w-0 flex-1 items-center gap-2 truncate text-start`,children:X}):w(`p`,{className:`flex-1 text-start text-text-positive-muted`,children:A})}),$=e=>T(r,{className:`border-none`,children:[w(o,{placeholder:A??`Tìm kiếm…`}),T(c,{children:[w(i,{className:`flex min-h-30 items-center justify-center text-sm text-text-positive-weak`,children:`Không tìm thấy kết quả nào phù hợp.`}),w(a,{className:`max-h-60 overflow-y-auto`,children:P.map(({value:t,label:n})=>w(s,{value:n,onSelect:()=>e(t),children:n},t))})]})]});return T(g,{className:`gap-y-4 px-4`,children:[T(d,{orientation:N,"data-invalid":J,children:[T(f,{children:[T(_,{"aria-required":ce,htmlFor:z.name,children:[y,j&&w(oe,{tooltip:j})]}),w(m,{children:k})]}),w(p,{className:`flex justify-end`,children:T(`div`,{className:`flex w-full flex-col`,children:[T(`div`,{className:`relative`,children:[B?T(C,{children:[Q(()=>H(!0)),w(t,{open:V,onOpenChange:e=>{H(e),e||z.handleBlur()},children:T(te,{children:[w(ee,{}),T(E.Content,{onOpenAutoFocus:e=>e.preventDefault(),className:S(`fixed inset-x-0 bottom-0 z-50`,`flex flex-col bg-background rounded-t-2xl outline-none`,`max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]`,`data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0`,`data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0`,`duration-300`),children:[T(`div`,{className:`flex items-center justify-between px-4 py-3 border-b border-border shrink-0`,children:[w(`span`,{className:`font-semibold text-sm text-text-positive`,children:y}),w(n,{asChild:!0,children:w(`button`,{type:`button`,"aria-label":`Đóng`,className:`flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive`,children:w(v,{size:16})})})]}),T(`div`,{className:`flex flex-col overflow-y-auto`,children:[Y&&w(n,{asChild:!0,children:T(`button`,{type:`button`,className:`flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle`,onClick:Z,children:[w(v,{size:14}),`Xóa lựa chọn`]})}),$(e=>{z.handleChange(e),H(!1),z.handleBlur()})]}),w(`div`,{className:`shrink-0 h-safe-bottom`})]})]})})]}):T(re,{open:U,onOpenChange:e=>{W(e),e||z.handleBlur()},children:[w(u,{asChild:!0,children:Q()}),w(l,{align:`end`,side:`bottom`,className:`flex w-fit rounded p-0`,children:$(e=>{z.handleChange(e),W(!1),z.handleBlur()})})]}),Y&&w(`button`,{type:`button`,"aria-label":`Xóa lựa chọn`,className:`absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform`,onClick:Z,children:w(v,{"aria-hidden":`true`})})]}),q&&L&&w(h,{id:R,className:`mt-1`,errors:z.state.meta.errors}),w(ie,{isShow:!!M,children:M})]})})]}),w(ae,{})]})});k.displayName=`ComboboxField`;export{k as ComboboxField};
2
- //# sourceMappingURL=combobox-field-D6fiCcvU.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"combobox-field-D6fiCcvU.mjs","names":["Dialog","RadixDialog","Popover"],"sources":["../packages/components/features/tanstack-form/components/fields/combobox-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { XIcon } from 'lucide-react';\n\nimport { Dialog as RadixDialog } from 'radix-ui';\n\nimport { useIsMobile } from '@customafk/react-toolkit/hooks/useMobile';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Dialog, DialogClose, DialogOverlay, DialogPortal } from '@/components/ui/dialog';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { useTanStackFieldContext } from '../form-context';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\nimport type { ComboboxFieldProps } from '../../types';\n\nexport const ComboboxField = memo<ComboboxFieldProps>(\n ({\n label,\n description,\n placeholder,\n tooltip,\n helperText,\n orientation = 'responsive',\n options,\n required = false,\n disabled = false,\n clearable = false,\n showErrorMessage = true,\n }) => {\n const errorId = useId();\n const field = useTanStackFieldContext<string | null>();\n const isMobile = useIsMobile();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = field.state.meta.isDirty || field.state.meta.isTouched;\n const _invalid = _touched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n const _showClear = clearable && !!field.state.value && !isDisabled;\n\n const selectedLabel = options.find(({ value }) => value === field.state.value)?.label;\n\n const onClear = () => {\n field.handleChange(null);\n field.handleBlur();\n };\n\n const triggerButton = (onClick?: () => void) => (\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n disabled={isDisabled}\n aria-invalid={_invalid ? true : undefined}\n aria-describedby={errorId}\n className={cn(\n 'flex w-full items-center justify-start rounded outline-border',\n 'hover:bg-transparent',\n 'focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n _showClear && 'pr-8',\n !field.state.value && 'text-text-positive-muted',\n _invalid && 'outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak'\n )}\n onClick={onClick}\n >\n {selectedLabel ? (\n <p className=\"flex min-w-0 flex-1 items-center gap-2 truncate text-start\">{selectedLabel}</p>\n ) : (\n <p className=\"flex-1 text-start text-text-positive-muted\">{placeholder}</p>\n )}\n </Button>\n );\n\n const renderCommandList = (onSelect: (value: string) => void) => (\n <Command className=\"border-none\">\n <CommandInput placeholder={placeholder ?? 'Tìm kiếm…'} />\n <CommandList>\n <CommandEmpty className=\"flex min-h-30 items-center justify-center text-sm text-text-positive-weak\">Không tìm thấy kết quả nào phù hợp.</CommandEmpty>\n <CommandGroup className=\"max-h-60 overflow-y-auto\">\n {options.map(({ value, label: optLabel }) => (\n <CommandItem key={value} value={optLabel} onSelect={() => onSelect(value)}>\n {optLabel}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={field.name}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex justify-end\">\n <div className=\"flex w-full flex-col\">\n <div className=\"relative\">\n {isMobile ? (\n <>\n {triggerButton(() => setDialogOpen(true))}\n <Dialog\n open={dialogOpen}\n onOpenChange={open => {\n setDialogOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n onOpenAutoFocus={e => e.preventDefault()}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50',\n 'flex flex-col bg-background rounded-t-2xl outline-none',\n 'max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]',\n 'data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0',\n 'duration-300'\n )}\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border shrink-0\">\n <span className=\"font-semibold text-sm text-text-positive\">{label}</span>\n <DialogClose asChild>\n <button\n type=\"button\"\n aria-label=\"Đóng\"\n className=\"flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive\"\n >\n <XIcon size={16} />\n </button>\n </DialogClose>\n </div>\n\n <div className=\"flex flex-col overflow-y-auto\">\n {_showClear && (\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle\"\n onClick={onClear}\n >\n <XIcon size={14} />\n Xóa lựa chọn\n </button>\n </DialogClose>\n )}\n {renderCommandList(value => {\n field.handleChange(value);\n setDialogOpen(false);\n field.handleBlur();\n })}\n </div>\n\n <div className=\"shrink-0 h-safe-bottom\" />\n </RadixDialog.Content>\n </DialogPortal>\n </Dialog>\n </>\n ) : (\n <Popover\n open={popoverOpen}\n onOpenChange={open => {\n setPopoverOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <PopoverTrigger asChild>{triggerButton()}</PopoverTrigger>\n <PopoverContent align=\"end\" side=\"bottom\" className=\"flex w-fit rounded p-0\">\n {renderCommandList(value => {\n field.handleChange(value);\n setPopoverOpen(false);\n field.handleBlur();\n })}\n </PopoverContent>\n </Popover>\n )}\n\n {_showClear && (\n <button\n type=\"button\"\n aria-label=\"Xóa lựa chọn\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {_touched && showErrorMessage && <FieldError id={errorId} className=\"mt-1\" errors={field.state.meta.errors} />}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nComboboxField.displayName = 'ComboboxField';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- const e=require("./ui/button.cjs"),t=require("./ui/dialog.cjs"),n=require("./ui/command.cjs"),r=require("./tanstack-form-CNrZQZhn.cjs"),i=require("./ui/popover.cjs"),a=require("./field-BV5twmKA.cjs");let o=require("lucide-react"),s=require("react"),c=require("@customafk/react-toolkit/utils"),l=require("react/jsx-runtime"),u=require("radix-ui"),d=require("@customafk/react-toolkit/hooks/useMobile"),f=require("@tanstack/react-form");const p=(0,s.memo)(({label:p,description:m,placeholder:h,tooltip:g,helperText:_,orientation:v=`responsive`,options:y,required:b=!1,disabled:x=!1,clearable:S=!1,showErrorMessage:C=!0})=>{let w=(0,s.useId)(),T=r.G(),E=(0,d.useIsMobile)(),[D,O]=(0,s.useState)(!1),[k,A]=(0,s.useState)(!1),j=(0,f.useStore)(T.form.store,({isSubmitting:e})=>e),M=x||j,N=T.state.meta.isDirty||T.state.meta.isTouched,P=N&&!T.state.meta.isValid,F=b&&T.state.value===null,I=S&&!!T.state.value&&!M,L=y.find(({value:e})=>e===T.state.value)?.label,R=()=>{T.handleChange(null),T.handleBlur()},z=t=>(0,l.jsx)(e.Button,{variant:`outline`,color:`muted`,size:`lg`,disabled:M,"aria-invalid":P?!0:void 0,"aria-describedby":w,className:(0,c.cn)(`flex w-full items-center justify-start rounded outline-border`,`hover:bg-transparent`,`focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak`,`data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`,I&&`pr-8`,!T.state.value&&`text-text-positive-muted`,P&&`outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak`),onClick:t,children:L?(0,l.jsx)(`p`,{className:`flex min-w-0 flex-1 items-center gap-2 truncate text-start`,children:L}):(0,l.jsx)(`p`,{className:`flex-1 text-start text-text-positive-muted`,children:h})}),B=e=>(0,l.jsxs)(n.Command,{className:`border-none`,children:[(0,l.jsx)(n.CommandInput,{placeholder:h??`Tìm kiếm…`}),(0,l.jsxs)(n.CommandList,{children:[(0,l.jsx)(n.CommandEmpty,{className:`flex min-h-30 items-center justify-center text-sm text-text-positive-weak`,children:`Không tìm thấy kết quả nào phù hợp.`}),(0,l.jsx)(n.CommandGroup,{className:`max-h-60 overflow-y-auto`,children:y.map(({value:t,label:r})=>(0,l.jsx)(n.CommandItem,{value:r,onSelect:()=>e(t),children:r},t))})]})]});return(0,l.jsxs)(a.FieldGroup,{className:`gap-y-4 px-4`,children:[(0,l.jsxs)(a.Field,{orientation:v,"data-invalid":P,children:[(0,l.jsxs)(a.FieldContent,{children:[(0,l.jsxs)(a.FieldLabel,{"aria-required":F,htmlFor:T.name,children:[p,g&&(0,l.jsx)(a.FieldTooltip,{tooltip:g})]}),(0,l.jsx)(a.FieldDescription,{children:m})]}),(0,l.jsx)(a.FieldContentMain,{className:`flex justify-end`,children:(0,l.jsxs)(`div`,{className:`flex w-full flex-col`,children:[(0,l.jsxs)(`div`,{className:`relative`,children:[E?(0,l.jsxs)(l.Fragment,{children:[z(()=>O(!0)),(0,l.jsx)(t.Dialog,{open:D,onOpenChange:e=>{O(e),e||T.handleBlur()},children:(0,l.jsxs)(t.DialogPortal,{children:[(0,l.jsx)(t.DialogOverlay,{}),(0,l.jsxs)(u.Dialog.Content,{onOpenAutoFocus:e=>e.preventDefault(),className:(0,c.cn)(`fixed inset-x-0 bottom-0 z-50`,`flex flex-col bg-background rounded-t-2xl outline-none`,`max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]`,`data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0`,`data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0`,`duration-300`),children:[(0,l.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 border-b border-border shrink-0`,children:[(0,l.jsx)(`span`,{className:`font-semibold text-sm text-text-positive`,children:p}),(0,l.jsx)(t.DialogClose,{asChild:!0,children:(0,l.jsx)(`button`,{type:`button`,"aria-label":`Đóng`,className:`flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive`,children:(0,l.jsx)(o.XIcon,{size:16})})})]}),(0,l.jsxs)(`div`,{className:`flex flex-col overflow-y-auto`,children:[I&&(0,l.jsx)(t.DialogClose,{asChild:!0,children:(0,l.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle`,onClick:R,children:[(0,l.jsx)(o.XIcon,{size:14}),`Xóa lựa chọn`]})}),B(e=>{T.handleChange(e),O(!1),T.handleBlur()})]}),(0,l.jsx)(`div`,{className:`shrink-0 h-safe-bottom`})]})]})})]}):(0,l.jsxs)(i.Popover,{open:k,onOpenChange:e=>{A(e),e||T.handleBlur()},children:[(0,l.jsx)(i.PopoverTrigger,{asChild:!0,children:z()}),(0,l.jsx)(i.PopoverContent,{align:`end`,side:`bottom`,className:`flex w-fit rounded p-0`,children:B(e=>{T.handleChange(e),A(!1),T.handleBlur()})})]}),I&&(0,l.jsx)(`button`,{type:`button`,"aria-label":`Xóa lựa chọn`,className:`absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform`,onClick:R,children:(0,l.jsx)(o.XIcon,{"aria-hidden":`true`})})]}),N&&C&&(0,l.jsx)(a.FieldError,{id:w,className:`mt-1`,errors:T.state.meta.errors}),(0,l.jsx)(a.FieldNote,{isShow:!!_,children:_})]})})]}),(0,l.jsx)(a.FieldSeparator,{})]})});p.displayName=`ComboboxField`,exports.ComboboxField=p;
2
- //# sourceMappingURL=combobox-field-DLpH6J9H.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"combobox-field-DLpH6J9H.cjs","names":["useTanStackFieldContext","Button","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","FieldGroup","Field","FieldContent","FieldLabel","FieldTooltip","FieldDescription","FieldContentMain","Dialog","DialogPortal","DialogOverlay","RadixDialog","DialogClose","XIcon","Popover","PopoverTrigger","PopoverContent","FieldError","FieldNote","FieldSeparator"],"sources":["../packages/components/features/tanstack-form/components/fields/combobox-field.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { XIcon } from 'lucide-react';\n\nimport { Dialog as RadixDialog } from 'radix-ui';\n\nimport { useIsMobile } from '@customafk/react-toolkit/hooks/useMobile';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Dialog, DialogClose, DialogOverlay, DialogPortal } from '@/components/ui/dialog';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { useTanStackFieldContext } from '../form-context';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\nimport type { ComboboxFieldProps } from '../../types';\n\nexport const ComboboxField = memo<ComboboxFieldProps>(\n ({\n label,\n description,\n placeholder,\n tooltip,\n helperText,\n orientation = 'responsive',\n options,\n required = false,\n disabled = false,\n clearable = false,\n showErrorMessage = true,\n }) => {\n const errorId = useId();\n const field = useTanStackFieldContext<string | null>();\n const isMobile = useIsMobile();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n const isDisabled = disabled || isSubmitting;\n\n const _touched = field.state.meta.isDirty || field.state.meta.isTouched;\n const _invalid = _touched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n const _showClear = clearable && !!field.state.value && !isDisabled;\n\n const selectedLabel = options.find(({ value }) => value === field.state.value)?.label;\n\n const onClear = () => {\n field.handleChange(null);\n field.handleBlur();\n };\n\n const triggerButton = (onClick?: () => void) => (\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n disabled={isDisabled}\n aria-invalid={_invalid ? true : undefined}\n aria-describedby={errorId}\n className={cn(\n 'flex w-full items-center justify-start rounded outline-border',\n 'hover:bg-transparent',\n 'focus-visible:outline-1 focus-visible:outline-primary-strong focus-visible:ring-4 focus-visible:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n _showClear && 'pr-8',\n !field.state.value && 'text-text-positive-muted',\n _invalid && 'outline-danger bg-danger-bg-subtle ring-4 ring-danger-weak'\n )}\n onClick={onClick}\n >\n {selectedLabel ? (\n <p className=\"flex min-w-0 flex-1 items-center gap-2 truncate text-start\">{selectedLabel}</p>\n ) : (\n <p className=\"flex-1 text-start text-text-positive-muted\">{placeholder}</p>\n )}\n </Button>\n );\n\n const renderCommandList = (onSelect: (value: string) => void) => (\n <Command className=\"border-none\">\n <CommandInput placeholder={placeholder ?? 'Tìm kiếm…'} />\n <CommandList>\n <CommandEmpty className=\"flex min-h-30 items-center justify-center text-sm text-text-positive-weak\">Không tìm thấy kết quả nào phù hợp.</CommandEmpty>\n <CommandGroup className=\"max-h-60 overflow-y-auto\">\n {options.map(({ value, label: optLabel }) => (\n <CommandItem key={value} value={optLabel} onSelect={() => onSelect(value)}>\n {optLabel}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={field.name}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex justify-end\">\n <div className=\"flex w-full flex-col\">\n <div className=\"relative\">\n {isMobile ? (\n <>\n {triggerButton(() => setDialogOpen(true))}\n <Dialog\n open={dialogOpen}\n onOpenChange={open => {\n setDialogOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n onOpenAutoFocus={e => e.preventDefault()}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50',\n 'flex flex-col bg-background rounded-t-2xl outline-none',\n 'max-h-[80dvh] shadow-[0_-4px_24px_rgba(0,0,0,0.08)]',\n 'data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=closed]:fade-out-0',\n 'duration-300'\n )}\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border shrink-0\">\n <span className=\"font-semibold text-sm text-text-positive\">{label}</span>\n <DialogClose asChild>\n <button\n type=\"button\"\n aria-label=\"Đóng\"\n className=\"flex size-7 items-center justify-center rounded-md text-text-positive-weak transition-colors hover:bg-muted-muted hover:text-text-positive\"\n >\n <XIcon size={16} />\n </button>\n </DialogClose>\n </div>\n\n <div className=\"flex flex-col overflow-y-auto\">\n {_showClear && (\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-x-2 px-4 py-3 text-left text-sm text-danger-strong transition-colors hover:bg-danger-bg-subtle\"\n onClick={onClear}\n >\n <XIcon size={14} />\n Xóa lựa chọn\n </button>\n </DialogClose>\n )}\n {renderCommandList(value => {\n field.handleChange(value);\n setDialogOpen(false);\n field.handleBlur();\n })}\n </div>\n\n <div className=\"shrink-0 h-safe-bottom\" />\n </RadixDialog.Content>\n </DialogPortal>\n </Dialog>\n </>\n ) : (\n <Popover\n open={popoverOpen}\n onOpenChange={open => {\n setPopoverOpen(open);\n if (!open) field.handleBlur();\n }}\n >\n <PopoverTrigger asChild>{triggerButton()}</PopoverTrigger>\n <PopoverContent align=\"end\" side=\"bottom\" className=\"flex w-fit rounded p-0\">\n {renderCommandList(value => {\n field.handleChange(value);\n setPopoverOpen(false);\n field.handleBlur();\n })}\n </PopoverContent>\n </Popover>\n )}\n\n {_showClear && (\n <button\n type=\"button\"\n aria-label=\"Xóa lựa chọn\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 flex size-4 cursor-pointer items-center justify-center rounded-md text-text-positive-weak outline-none transition-[color,transform] hover:text-text-positive focus-visible:text-primary-strong focus-visible:[&>svg]:scale-125 [&>svg]:size-3.5 [&>svg]:transition-transform\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {_touched && showErrorMessage && <FieldError id={errorId} className=\"mt-1\" errors={field.state.meta.errors} />}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\n\nComboboxField.displayName = 'ComboboxField';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- const e=require("./ui/tooltip.cjs"),t=require("./tables-B1O9qy-m.cjs");let n=require("lucide-react"),r=require("react"),i=require("react/jsx-runtime");const a=({email:a,linkable:o=!0})=>{let[s,c]=(0,r.useState)(!1);return a?(0,i.jsx)(e.TooltipProvider,{children:(0,i.jsxs)(`div`,{className:`group flex items-center gap-x-1.5`,children:[(0,i.jsx)(n.MailIcon,{size:13,className:`shrink-0 text-text-positive-weak`}),o?(0,i.jsx)(`a`,{href:`mailto:${a}`,className:`truncate text-primary text-sm underline-offset-2 hover:underline`,onClick:e=>e.stopPropagation(),children:a}):(0,i.jsx)(`span`,{className:`truncate text-text-positive text-sm`,children:a}),(0,i.jsxs)(e.Tooltip,{children:[(0,i.jsx)(e.TooltipTrigger,{asChild:!0,children:(0,i.jsx)(`button`,{onClick:e=>{e.stopPropagation(),e.preventDefault(),navigator.clipboard.writeText(a).then(()=>{c(!0),setTimeout(()=>c(!1),1500)})},className:`shrink-0 cursor-pointer text-text-positive-weak opacity-0 transition-opacity group-hover:opacity-100 hover:text-text-positive`,children:s?(0,i.jsx)(n.CheckIcon,{size:13,className:`text-success-strong`}):(0,i.jsx)(n.CopyIcon,{size:13})})}),(0,i.jsx)(e.TooltipContent,{children:s?`Copied!`:`Copy email`})]})]})}):(0,i.jsx)(t.Y,{})};exports.UITableEmailDisplay=a;
2
- //# sourceMappingURL=email-display-D6ZgA_en.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-display-D6ZgA_en.cjs","names":["UITableEmpty","TooltipProvider","MailIcon","Tooltip","TooltipTrigger","CheckIcon","CopyIcon","TooltipContent"],"sources":["../packages/components/features/tables/components/atoms/email-display.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\n\nimport { CheckIcon, CopyIcon, MailIcon } from 'lucide-react';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableEmailDisplay} component. */\ntype Props = {\n /** The email address to display; `null`/`undefined`/empty renders an empty state. */\n email: string | null | undefined;\n /** When `true`, a `mailto:` anchor wraps the address (default: `true`). */\n linkable?: boolean;\n};\n\n/**\n * Displays an email address in a table cell with a copy-to-clipboard button.\n * Shows a brief checkmark confirmation after copying. Optionally wraps the\n * address in a `mailto:` link. Renders {@link UITableEmpty} when `email` is\n * absent.\n *\n * @example\n * import { UITableEmailDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableEmailDisplay email=\"jane@example.com\" />\n */\nexport const UITableEmailDisplay: React.FC<Props> = ({ email, linkable = true }) => {\n const [copied, setCopied] = useState(false);\n\n if (!email) return <UITableEmpty />;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n navigator.clipboard.writeText(email).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n });\n };\n\n return (\n <TooltipProvider>\n <div className=\"group flex items-center gap-x-1.5\">\n <MailIcon size={13} className=\"shrink-0 text-text-positive-weak\" />\n\n {linkable ? (\n <a href={`mailto:${email}`} className=\"truncate text-primary text-sm underline-offset-2 hover:underline\" onClick={e => e.stopPropagation()}>\n {email}\n </a>\n ) : (\n <span className=\"truncate text-text-positive text-sm\">{email}</span>\n )}\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleCopy}\n className=\"shrink-0 cursor-pointer text-text-positive-weak opacity-0 transition-opacity group-hover:opacity-100 hover:text-text-positive\"\n >\n {copied ? <CheckIcon size={13} className=\"text-success-strong\" /> : <CopyIcon size={13} />}\n </button>\n </TooltipTrigger>\n <TooltipContent>{copied ? 'Copied!' : 'Copy email'}</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n );\n};\n"],"mappings":"uJA4BA,MAAa,GAAwC,CAAE,QAAO,WAAW,MAAW,CAClF,GAAM,CAAC,EAAQ,IAAA,EAAA,EAAA,SAAA,CAAsB,EAAK,EAa1C,OAXK,GAYH,EAAA,EAAA,IAAA,CAACC,EAAAA,gBAAD,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,IAAA,CAACC,EAAAA,SAAD,CAAU,KAAM,GAAI,UAAU,kCAAoC,CAAA,EAEjE,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,KAAM,UAAU,IAAS,UAAU,mEAAmE,QAAS,GAAK,EAAE,gBAAgB,WACtI,CACA,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,+CAAuC,CAAY,CAAA,GAGrE,EAAA,EAAA,KAAA,CAACC,EAAAA,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAACC,EAAAA,eAAD,CAAgB,QAAA,aACd,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,QAzBQ,GAAwB,CAC1C,EAAE,gBAAgB,EAClB,EAAE,eAAe,EACjB,UAAU,UAAU,UAAU,CAAK,CAAC,CAAC,SAAW,CAC9C,EAAU,EAAI,EACd,eAAiB,EAAU,EAAK,EAAG,IAAI,CACzC,CAAC,CACH,EAmBY,UAAU,yIAET,GAAS,EAAA,EAAA,IAAA,CAACC,EAAAA,UAAD,CAAW,KAAM,GAAI,UAAU,qBAAuB,CAAA,GAAI,EAAA,EAAA,IAAA,CAACC,EAAAA,SAAD,CAAU,KAAM,EAAK,CAAA,CACnF,CAAA,CACM,CAAA,GAChB,EAAA,EAAA,IAAA,CAACC,EAAAA,eAAD,CAAA,SAAiB,EAAS,UAAY,YAA6B,CAAA,CAC5D,CAAA,CAAA,CACN,GACU,CAAA,GApCA,EAAA,EAAA,IAAA,CAACP,EAAAA,EAAD,CAAe,CAAA,CAsCpC"}
@@ -1,2 +0,0 @@
1
- import{Tooltip as e,TooltipContent as t,TooltipProvider as n,TooltipTrigger as r}from"./ui/tooltip.mjs";import{Y as i}from"./tables-9d53sH9E.mjs";import{CheckIcon as a,CopyIcon as o,MailIcon as s}from"lucide-react";import{useState as c}from"react";import{jsx as l,jsxs as u}from"react/jsx-runtime";const d=({email:d,linkable:f=!0})=>{let[p,m]=c(!1);return d?l(n,{children:u(`div`,{className:`group flex items-center gap-x-1.5`,children:[l(s,{size:13,className:`shrink-0 text-text-positive-weak`}),f?l(`a`,{href:`mailto:${d}`,className:`truncate text-primary text-sm underline-offset-2 hover:underline`,onClick:e=>e.stopPropagation(),children:d}):l(`span`,{className:`truncate text-text-positive text-sm`,children:d}),u(e,{children:[l(r,{asChild:!0,children:l(`button`,{onClick:e=>{e.stopPropagation(),e.preventDefault(),navigator.clipboard.writeText(d).then(()=>{m(!0),setTimeout(()=>m(!1),1500)})},className:`shrink-0 cursor-pointer text-text-positive-weak opacity-0 transition-opacity group-hover:opacity-100 hover:text-text-positive`,children:p?l(a,{size:13,className:`text-success-strong`}):l(o,{size:13})})}),l(t,{children:p?`Copied!`:`Copy email`})]})]})}):l(i,{})};export{d as UITableEmailDisplay};
2
- //# sourceMappingURL=email-display-m745lUts.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-display-m745lUts.mjs","names":[],"sources":["../packages/components/features/tables/components/atoms/email-display.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\n\nimport { CheckIcon, CopyIcon, MailIcon } from 'lucide-react';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableEmailDisplay} component. */\ntype Props = {\n /** The email address to display; `null`/`undefined`/empty renders an empty state. */\n email: string | null | undefined;\n /** When `true`, a `mailto:` anchor wraps the address (default: `true`). */\n linkable?: boolean;\n};\n\n/**\n * Displays an email address in a table cell with a copy-to-clipboard button.\n * Shows a brief checkmark confirmation after copying. Optionally wraps the\n * address in a `mailto:` link. Renders {@link UITableEmpty} when `email` is\n * absent.\n *\n * @example\n * import { UITableEmailDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableEmailDisplay email=\"jane@example.com\" />\n */\nexport const UITableEmailDisplay: React.FC<Props> = ({ email, linkable = true }) => {\n const [copied, setCopied] = useState(false);\n\n if (!email) return <UITableEmpty />;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n navigator.clipboard.writeText(email).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n });\n };\n\n return (\n <TooltipProvider>\n <div className=\"group flex items-center gap-x-1.5\">\n <MailIcon size={13} className=\"shrink-0 text-text-positive-weak\" />\n\n {linkable ? (\n <a href={`mailto:${email}`} className=\"truncate text-primary text-sm underline-offset-2 hover:underline\" onClick={e => e.stopPropagation()}>\n {email}\n </a>\n ) : (\n <span className=\"truncate text-text-positive text-sm\">{email}</span>\n )}\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleCopy}\n className=\"shrink-0 cursor-pointer text-text-positive-weak opacity-0 transition-opacity group-hover:opacity-100 hover:text-text-positive\"\n >\n {copied ? <CheckIcon size={13} className=\"text-success-strong\" /> : <CopyIcon size={13} />}\n </button>\n </TooltipTrigger>\n <TooltipContent>{copied ? 'Copied!' : 'Copy email'}</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n );\n};\n"],"mappings":"0SA4BA,MAAa,GAAwC,CAAE,QAAO,WAAW,MAAW,CAClF,GAAM,CAAC,EAAQ,GAAa,EAAS,EAAK,EAa1C,OAXK,EAYH,EAAC,EAAD,CAAA,SACE,EAAC,MAAD,CAAK,UAAU,6CAAf,CACE,EAAC,EAAD,CAAU,KAAM,GAAI,UAAU,kCAAoC,CAAA,EAEjE,EACC,EAAC,IAAD,CAAG,KAAM,UAAU,IAAS,UAAU,mEAAmE,QAAS,GAAK,EAAE,gBAAgB,WACtI,CACA,CAAA,EAEH,EAAC,OAAD,CAAM,UAAU,+CAAuC,CAAY,CAAA,EAGrE,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAgB,QAAA,YACd,EAAC,SAAD,CACE,QAzBQ,GAAwB,CAC1C,EAAE,gBAAgB,EAClB,EAAE,eAAe,EACjB,UAAU,UAAU,UAAU,CAAK,CAAC,CAAC,SAAW,CAC9C,EAAU,EAAI,EACd,eAAiB,EAAU,EAAK,EAAG,IAAI,CACzC,CAAC,CACH,EAmBY,UAAU,yIAET,EAAS,EAAC,EAAD,CAAW,KAAM,GAAI,UAAU,qBAAuB,CAAA,EAAI,EAAC,EAAD,CAAU,KAAM,EAAK,CAAA,CACnF,CAAA,CACM,CAAA,EAChB,EAAC,EAAD,CAAA,SAAiB,EAAS,UAAY,YAA6B,CAAA,CAC5D,CAAA,CAAA,CACN,GACU,CAAA,EApCA,EAAC,EAAD,CAAe,CAAA,CAsCpC"}
@@ -1,2 +0,0 @@
1
- import{ExternalLinkIcon as e}from"lucide-react";import{jsx as t,jsxs as n}from"react/jsx-runtime";const r=({href:r,label:i})=>n(`a`,{href:r,target:`_blank`,className:`inline-flex items-center gap-1 truncate text-primary text-sm underline`,rel:`noopener noreferrer`,children:[t(`span`,{children:i||r}),t(e,{size:14})]});export{r as UITablePermalink};
2
- //# sourceMappingURL=permalink-CZ3g9daG.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permalink-CZ3g9daG.mjs","names":[],"sources":["../packages/components/features/tables/components/atoms/permalink.tsx"],"sourcesContent":["import { ExternalLinkIcon } from 'lucide-react';\n\n/**\n * Renders an external-link anchor with an icon for use in table cells, opening\n * the target URL in a new tab with safe `rel` attributes.\n *\n * @example\n * import { UITablePermalink } from '@customafk/lunas-ui/features/tables';\n *\n * <UITablePermalink href=\"https://example.com/records/42\" label=\"View record\" />\n */\nexport const UITablePermalink: React.FC<{\n /** The destination URL the anchor navigates to. */\n href: string;\n /** Optional display text; falls back to the raw `href` when omitted. */\n label?: string;\n}> = ({ href, label }) => {\n return (\n <a href={href} target=\"_blank\" className=\"inline-flex items-center gap-1 truncate text-primary text-sm underline\" rel=\"noopener noreferrer\">\n <span>{label || href}</span>\n <ExternalLinkIcon size={14} />\n </a>\n );\n};\n"],"mappings":"kGAWA,MAAa,GAKP,CAAE,OAAM,WAEV,EAAC,IAAD,CAAS,OAAM,OAAO,SAAS,UAAU,yEAAyE,IAAI,+BAAtH,CACE,EAAC,OAAD,CAAA,SAAO,GAAS,CAAW,CAAA,EAC3B,EAAC,EAAD,CAAkB,KAAM,EAAK,CAAA,CAC5B"}
@@ -1,2 +0,0 @@
1
- let e=require("lucide-react"),t=require("react/jsx-runtime");const n=({href:n,label:r})=>(0,t.jsxs)(`a`,{href:n,target:`_blank`,className:`inline-flex items-center gap-1 truncate text-primary text-sm underline`,rel:`noopener noreferrer`,children:[(0,t.jsx)(`span`,{children:r||n}),(0,t.jsx)(e.ExternalLinkIcon,{size:14})]});exports.UITablePermalink=n;
2
- //# sourceMappingURL=permalink-DeeEKhfc.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permalink-DeeEKhfc.cjs","names":["ExternalLinkIcon"],"sources":["../packages/components/features/tables/components/atoms/permalink.tsx"],"sourcesContent":["import { ExternalLinkIcon } from 'lucide-react';\n\n/**\n * Renders an external-link anchor with an icon for use in table cells, opening\n * the target URL in a new tab with safe `rel` attributes.\n *\n * @example\n * import { UITablePermalink } from '@customafk/lunas-ui/features/tables';\n *\n * <UITablePermalink href=\"https://example.com/records/42\" label=\"View record\" />\n */\nexport const UITablePermalink: React.FC<{\n /** The destination URL the anchor navigates to. */\n href: string;\n /** Optional display text; falls back to the raw `href` when omitted. */\n label?: string;\n}> = ({ href, label }) => {\n return (\n <a href={href} target=\"_blank\" className=\"inline-flex items-center gap-1 truncate text-primary text-sm underline\" rel=\"noopener noreferrer\">\n <span>{label || href}</span>\n <ExternalLinkIcon size={14} />\n </a>\n );\n};\n"],"mappings":"6DAWA,MAAa,GAKP,CAAE,OAAM,YAEV,EAAA,EAAA,KAAA,CAAC,IAAD,CAAS,OAAM,OAAO,SAAS,UAAU,yEAAyE,IAAI,+BAAtH,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAS,CAAW,CAAA,GAC3B,EAAA,EAAA,IAAA,CAACA,EAAAA,iBAAD,CAAkB,KAAM,EAAK,CAAA,CAC5B"}
@@ -1,2 +0,0 @@
1
- import{Tooltip as e,TooltipContent as t,TooltipTrigger as n}from"./ui/tooltip.mjs";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({value:a})=>i(e,{children:[r(n,{asChild:!0,children:r(`p`,{className:`font-number text-text-positive text-sm tabular-nums`,children:a.replace(/(\d{3})(\d{3})(\d{4})/,`($1) $2-$3`)})}),r(t,{align:`start`,children:r(`p`,{className:`tabular-nums`,children:a.slice(1).replace(/(\d{2})(\d{3})(\d{4})/,`(00) (+84) ($1) $2-$3`)})})]});export{a as UITablePhoneNumberDisplay};
2
- //# sourceMappingURL=phone-number-C43z68gT.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phone-number-C43z68gT.mjs","names":[],"sources":["../packages/components/features/tables/components/atoms/phone-number.tsx"],"sourcesContent":["import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\n/**\n * Formats and displays a phone number string in a table cell using the\n * `(NXX) NXX-XXXX` pattern, with a tooltip that shows the full international\n * dialling representation.\n *\n * @example\n * import { UITablePhoneNumberDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITablePhoneNumberDisplay value=\"0843456789\" />\n */\nexport const UITablePhoneNumberDisplay: React.FC<\n React.PropsWithChildren<{\n /** The raw phone number string to format and display. */\n value: string;\n }>\n> = ({ value }) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"font-number text-text-positive text-sm tabular-nums\">{value.replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3')}</p>\n </TooltipTrigger>\n <TooltipContent align=\"start\">\n <p className=\"tabular-nums\">{value.slice(1).replace(/(\\d{2})(\\d{3})(\\d{4})/, '(00) (+84) ($1) $2-$3')}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n"],"mappings":"qIAYA,MAAa,GAKR,CAAE,WAEH,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAgB,QAAA,YACd,EAAC,IAAD,CAAG,UAAU,+DAAuD,EAAM,QAAQ,wBAAyB,YAAY,CAAK,CAAA,CAC9G,CAAA,EAChB,EAAC,EAAD,CAAgB,MAAM,iBACpB,EAAC,IAAD,CAAG,UAAU,wBAAgB,EAAM,MAAM,CAAC,CAAC,CAAC,QAAQ,wBAAyB,uBAAuB,CAAK,CAAA,CAC3F,CAAA,CACT,CAAA,CAAA"}
@@ -1,2 +0,0 @@
1
- const e=require("./ui/tooltip.cjs");let t=require("react/jsx-runtime");const n=({value:n})=>(0,t.jsxs)(e.Tooltip,{children:[(0,t.jsx)(e.TooltipTrigger,{asChild:!0,children:(0,t.jsx)(`p`,{className:`font-number text-text-positive text-sm tabular-nums`,children:n.replace(/(\d{3})(\d{3})(\d{4})/,`($1) $2-$3`)})}),(0,t.jsx)(e.TooltipContent,{align:`start`,children:(0,t.jsx)(`p`,{className:`tabular-nums`,children:n.slice(1).replace(/(\d{2})(\d{3})(\d{4})/,`(00) (+84) ($1) $2-$3`)})})]});exports.UITablePhoneNumberDisplay=n;
2
- //# sourceMappingURL=phone-number-DhThJwd6.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phone-number-DhThJwd6.cjs","names":["Tooltip","TooltipTrigger","TooltipContent"],"sources":["../packages/components/features/tables/components/atoms/phone-number.tsx"],"sourcesContent":["import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\n/**\n * Formats and displays a phone number string in a table cell using the\n * `(NXX) NXX-XXXX` pattern, with a tooltip that shows the full international\n * dialling representation.\n *\n * @example\n * import { UITablePhoneNumberDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITablePhoneNumberDisplay value=\"0843456789\" />\n */\nexport const UITablePhoneNumberDisplay: React.FC<\n React.PropsWithChildren<{\n /** The raw phone number string to format and display. */\n value: string;\n }>\n> = ({ value }) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"font-number text-text-positive text-sm tabular-nums\">{value.replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3')}</p>\n </TooltipTrigger>\n <TooltipContent align=\"start\">\n <p className=\"tabular-nums\">{value.slice(1).replace(/(\\d{2})(\\d{3})(\\d{4})/, '(00) (+84) ($1) $2-$3')}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n"],"mappings":"uEAYA,MAAa,GAKR,CAAE,YAEH,EAAA,EAAA,KAAA,CAACA,EAAAA,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAACC,EAAAA,eAAD,CAAgB,QAAA,aACd,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,+DAAuD,EAAM,QAAQ,wBAAyB,YAAY,CAAK,CAAA,CAC9G,CAAA,GAChB,EAAA,EAAA,IAAA,CAACC,EAAAA,eAAD,CAAgB,MAAM,kBACpB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,wBAAgB,EAAM,MAAM,CAAC,CAAC,CAAC,QAAQ,wBAAyB,uBAAuB,CAAK,CAAA,CAC3F,CAAA,CACT,CAAA,CAAA"}
@@ -1,2 +0,0 @@
1
- const e=require("./separator-sBz__BXC.cjs");let t=require("react/jsx-runtime");const n=({children:e})=>(0,t.jsx)(`header`,{"data-slot":`section-header`,className:`flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight`,children:e}),r=({children:e})=>(0,t.jsx)(`main`,{"data-slot":`section-main`,className:`relative flex flex-col py-4`,children:e}),i=({title:i,children:a})=>(0,t.jsxs)(`section`,{"data-slot":`section-form`,className:`flex flex-col rounded-md bg-background shadow-card ring-1 ring-border`,children:[(0,t.jsx)(n,{children:i}),(0,t.jsx)(e.t,{}),(0,t.jsx)(r,{children:a})]});exports.TanStackSectionForm=i;
2
- //# sourceMappingURL=section-form-B9iTs2we.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"section-form-B9iTs2we.cjs","names":["Separator"],"sources":["../packages/components/features/tanstack-form/components/forms/section-form.tsx"],"sourcesContent":["'use client';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Internal header sub-component for `TanStackSectionForm` that renders a styled section title.\n */\nconst SectionHeader: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <header data-slot=\"section-header\" className=\"flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight\">\n {children}\n </header>\n );\n};\n\n/**\n * Internal body sub-component for `TanStackSectionForm` that wraps field content with vertical padding.\n */\nconst SectionMain: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <main data-slot=\"section-main\" className=\"relative flex flex-col py-4\">\n {children}\n </main>\n );\n};\n\n/**\n * Renders a card-like form section with a titled header, separator, and a content area for form fields.\n *\n * @example\n * import { TanStackSectionForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackSectionForm title=\"Account Settings\">\n * <EmailField />\n * <PasswordField />\n * </TanStackSectionForm>\n */\nexport const TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n }>\n> = ({ title, children }) => {\n return (\n <section data-slot=\"section-form\" className=\"flex flex-col rounded-md bg-background shadow-card ring-1 ring-border\">\n <SectionHeader>{title}</SectionHeader>\n <Separator />\n <SectionMain>{children}</SectionMain>\n </section>\n );\n};\n"],"mappings":"+EAOA,MAAM,GAAoD,CAAE,eAExD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,YAAU,iBAAiB,UAAU,wFAC1C,UACK,CAAA,EAON,GAAkD,CAAE,eAEtD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,eAAe,UAAU,8BACtC,UACG,CAAA,EAeG,GAKR,CAAE,QAAO,eAEV,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,YAAU,eAAe,UAAU,iFAA5C,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAgB,CAAqB,CAAA,GACrC,EAAA,EAAA,IAAA,CAACA,EAAAA,EAAD,CAAY,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,UAAsB,CAAA,CAC7B"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./separator-BlNAFSJv.mjs";import{jsx as t,jsxs as n}from"react/jsx-runtime";const r=({children:e})=>t(`header`,{"data-slot":`section-header`,className:`flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight`,children:e}),i=({children:e})=>t(`main`,{"data-slot":`section-main`,className:`relative flex flex-col py-4`,children:e}),a=({title:a,children:o})=>n(`section`,{"data-slot":`section-form`,className:`flex flex-col rounded-md bg-background shadow-card ring-1 ring-border`,children:[t(r,{children:a}),t(e,{}),t(i,{children:o})]});export{a as TanStackSectionForm};
2
- //# sourceMappingURL=section-form-B_AZr7jZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"section-form-B_AZr7jZ.mjs","names":[],"sources":["../packages/components/features/tanstack-form/components/forms/section-form.tsx"],"sourcesContent":["'use client';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Internal header sub-component for `TanStackSectionForm` that renders a styled section title.\n */\nconst SectionHeader: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <header data-slot=\"section-header\" className=\"flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight\">\n {children}\n </header>\n );\n};\n\n/**\n * Internal body sub-component for `TanStackSectionForm` that wraps field content with vertical padding.\n */\nconst SectionMain: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <main data-slot=\"section-main\" className=\"relative flex flex-col py-4\">\n {children}\n </main>\n );\n};\n\n/**\n * Renders a card-like form section with a titled header, separator, and a content area for form fields.\n *\n * @example\n * import { TanStackSectionForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackSectionForm title=\"Account Settings\">\n * <EmailField />\n * <PasswordField />\n * </TanStackSectionForm>\n */\nexport const TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n }>\n> = ({ title, children }) => {\n return (\n <section data-slot=\"section-form\" className=\"flex flex-col rounded-md bg-background shadow-card ring-1 ring-border\">\n <SectionHeader>{title}</SectionHeader>\n <Separator />\n <SectionMain>{children}</SectionMain>\n </section>\n );\n};\n"],"mappings":"+FAOA,MAAM,GAAoD,CAAE,cAExD,EAAC,SAAD,CAAQ,YAAU,iBAAiB,UAAU,wFAC1C,UACK,CAAA,EAON,GAAkD,CAAE,cAEtD,EAAC,OAAD,CAAM,YAAU,eAAe,UAAU,8BACtC,UACG,CAAA,EAeG,GAKR,CAAE,QAAO,cAEV,EAAC,UAAD,CAAS,YAAU,eAAe,UAAU,iFAA5C,CACE,EAAC,EAAD,CAAA,SAAgB,CAAqB,CAAA,EACrC,EAAC,EAAD,CAAY,CAAA,EACZ,EAAC,EAAD,CAAc,UAAsB,CAAA,CAC7B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"statistic-BHCSCw9Q.cjs","names":["UITableEmpty","Flex"],"sources":["../packages/components/features/tables/components/atoms/statistic.tsx"],"sourcesContent":["import { memo, useCallback, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Flex } from '@/components/layouts/flex';\nimport { UITableEmpty } from './empty';\n\n/**\n * Applies the specified rounding mode to `num` at the given decimal precision.\n *\n * @param num - The number to round.\n * @param precisionValue - Number of decimal places to keep.\n * @param roundingMode - Rounding strategy: `'round'` (default), `'floor'`, or `'ceil'`.\n * @returns The rounded number.\n */\nconst applyRounding = (num: number, precisionValue: number, roundingMode?: 'round' | 'floor' | 'ceil') => {\n const multiplier = 10 ** precisionValue;\n\n switch (roundingMode) {\n case 'floor':\n return Math.floor(num * multiplier) / multiplier;\n case 'ceil':\n return Math.ceil(num * multiplier) / multiplier;\n default:\n return Math.round(num * multiplier) / multiplier;\n }\n};\n\n/** Props for the {@link UITableStatisticDisplay} component. */\ntype Props = {\n /** Character used to separate the integer and fractional parts (default: `'.'`). */\n decimalSeparator?: string;\n /** Character used to separate thousands groups (default: `','`). */\n groupSeparator?: string;\n /** Optional node rendered before the formatted number (e.g. a currency symbol). */\n prefix?: React.ReactNode;\n /** Optional node rendered after the formatted number (e.g. a unit label). */\n suffix?: React.ReactNode;\n /** Number of decimal digits to display. */\n precision?: number;\n /** Rounding strategy applied before formatting (default: `'round'`). */\n roundingMode?: 'round' | 'floor' | 'ceil';\n /** When `true`, pads the fractional part with trailing zeros up to `precision` digits. */\n showTrailingZeros?: boolean;\n /** Font-size variant for the displayed number (default: `'lg'`). */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** The numeric or string value to format; falsy / invalid values render an empty state. */\n value: number | string | null | undefined;\n};\n\n/**\n * A memoized table-cell component that formats a numeric value with configurable\n * separators, precision, rounding, and size; renders {@link UITableEmpty} when\n * the value is zero, invalid, or absent.\n *\n * @example\n * import { UITableStatisticDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableStatisticDisplay value={1234567.89} precision={2} prefix=\"$\" size=\"md\" />\n */\nexport const UITableStatisticDisplay = memo(\n ({\n decimalSeparator = '.',\n groupSeparator = ',',\n prefix: Prefix,\n suffix: Suffix,\n precision,\n roundingMode = 'round',\n showTrailingZeros = false,\n size = 'lg',\n value = 0,\n }: Props) => {\n // Memoize number formatting options\n const formatOptions = useMemo((): Intl.NumberFormatOptions => {\n const options: Intl.NumberFormatOptions = {};\n\n if (typeof precision === 'number' && precision >= 0 && showTrailingZeros) {\n options.minimumFractionDigits = precision;\n options.maximumFractionDigits = precision;\n } else {\n options.maximumFractionDigits = precision;\n }\n\n return options;\n }, [precision, showTrailingZeros]);\n\n const formatNumber = useCallback(\n (num: number): string => {\n let processedNum = num;\n\n // Áp dụng làm tròn nếu có precision\n if (typeof precision === 'number' && precision >= 0) {\n processedNum = applyRounding(num, precision, roundingMode);\n }\n\n return processedNum.toLocaleString('en-US', formatOptions);\n },\n [roundingMode, formatOptions, precision]\n );\n\n // Memoize value processing\n const processedValue = useMemo((): string => {\n // Xử lý giá trị number\n if (typeof value === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 'N/A';\n }\n return formatNumber(value);\n }\n\n // Xử lý giá trị string\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n // Nếu là chuỗi rỗng\n if (!trimmedValue) {\n return 'N/A';\n }\n\n // Thử convert sang number\n const numValue = Number(trimmedValue);\n\n if (Number.isNaN(numValue) || !Number.isFinite(numValue)) {\n // Nếu không phải số, trả về string gốc\n return 'N/A';\n }\n\n return formatNumber(numValue);\n }\n\n return 'N/A';\n }, [value, formatNumber]);\n\n // Memoize separator replacement\n const finalFormattedValue = useMemo((): string => {\n // Chỉ thay thế separators nếu khác mặc định\n if (decimalSeparator === '.' && groupSeparator === ',') {\n return processedValue;\n }\n return processedValue.replace(/,/g, groupSeparator).replace(/\\./g, decimalSeparator);\n }, [processedValue, decimalSeparator, groupSeparator]);\n\n if (finalFormattedValue === '0' || finalFormattedValue === 'N/A' || !finalFormattedValue) {\n return <UITableEmpty />;\n }\n\n return (\n <Flex\n padding=\"none\"\n className={cn(\n 'font-number text-lg text-text-positive tabular-nums',\n size === 'xs' && 'text-xs',\n size === 'sm' && 'text-sm',\n size === 'md' && 'text-base',\n size === 'lg' && 'text-lg',\n size === 'xl' && 'text-xl'\n )}\n >\n {Prefix}\n <p>{finalFormattedValue}</p>\n {Suffix}\n </Flex>\n );\n }\n);\nUITableStatisticDisplay.displayName = 'UITableStatisticDisplay';\n"],"mappings":"2KAeA,MAAM,GAAiB,EAAa,EAAwB,IAA8C,CACxG,IAAM,EAAa,IAAM,EAEzB,OAAQ,EAAR,CACE,IAAK,QACH,OAAO,KAAK,MAAM,EAAM,CAAU,EAAI,EACxC,IAAK,OACH,OAAO,KAAK,KAAK,EAAM,CAAU,EAAI,EACvC,QACE,OAAO,KAAK,MAAM,EAAM,CAAU,EAAI,CAC1C,CACF,EAkCa,GAAA,EAAA,EAAA,KAAA,EACV,CACC,mBAAmB,IACnB,iBAAiB,IACjB,OAAQ,EACR,OAAQ,EACR,YACA,eAAe,QACf,oBAAoB,GACpB,OAAO,KACP,QAAQ,KACG,CAEX,IAAM,GAAA,EAAA,EAAA,QAAA,KAAwD,CAC5D,IAAM,EAAoC,CAAC,EAS3C,OAPI,OAAO,GAAc,UAAY,GAAa,GAAK,IACrD,EAAQ,sBAAwB,GAGhC,EAAQ,sBAAwB,EAG3B,CACT,EAAG,CAAC,EAAW,CAAiB,CAAC,EAE3B,GAAA,EAAA,EAAA,YAAA,CACH,GAAwB,CACvB,IAAI,EAAe,EAOnB,OAJI,OAAO,GAAc,UAAY,GAAa,IAChD,EAAe,EAAc,EAAK,EAAW,CAAY,GAGpD,EAAa,eAAe,QAAS,CAAa,CAC3D,EACA,CAAC,EAAc,EAAe,CAAS,CACzC,EAGM,GAAA,EAAA,EAAA,QAAA,KAAuC,CAE3C,GAAI,OAAO,GAAU,SAInB,OAHI,OAAO,MAAM,CAAK,GAAK,CAAC,OAAO,SAAS,CAAK,EACxC,MAEF,EAAa,CAAK,EAI3B,GAAI,OAAO,GAAU,SAAU,CAC7B,IAAM,EAAe,EAAM,KAAK,EAGhC,GAAI,CAAC,EACH,MAAO,MAIT,IAAM,EAAW,OAAO,CAAY,EAOpC,OALI,OAAO,MAAM,CAAQ,GAAK,CAAC,OAAO,SAAS,CAAQ,EAE9C,MAGF,EAAa,CAAQ,CAC9B,CAEA,MAAO,KACT,EAAG,CAAC,EAAO,CAAY,CAAC,EAGlB,GAAA,EAAA,EAAA,QAAA,KAEA,IAAqB,KAAO,IAAmB,IAC1C,EAEF,EAAe,QAAQ,KAAM,CAAc,CAAC,CAAC,QAAQ,MAAO,CAAgB,EAClF,CAAC,EAAgB,EAAkB,CAAc,CAAC,EAMrD,OAJI,IAAwB,KAAO,IAAwB,OAAS,CAAC,GAC5D,EAAA,EAAA,IAAA,CAACA,EAAAA,EAAD,CAAe,CAAA,GAItB,EAAA,EAAA,KAAA,CAACC,EAAAA,KAAD,CACE,QAAQ,OACR,WAAA,EAAA,EAAA,GAAA,CACE,sDACA,IAAS,MAAQ,UACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,YACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,SACnB,WATF,CAWG,GACD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,CAAuB,CAAA,EAC1B,CACG,GAEV,CACF,EACA,EAAwB,YAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"statistic-DwiUKz02.mjs","names":[],"sources":["../packages/components/features/tables/components/atoms/statistic.tsx"],"sourcesContent":["import { memo, useCallback, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Flex } from '@/components/layouts/flex';\nimport { UITableEmpty } from './empty';\n\n/**\n * Applies the specified rounding mode to `num` at the given decimal precision.\n *\n * @param num - The number to round.\n * @param precisionValue - Number of decimal places to keep.\n * @param roundingMode - Rounding strategy: `'round'` (default), `'floor'`, or `'ceil'`.\n * @returns The rounded number.\n */\nconst applyRounding = (num: number, precisionValue: number, roundingMode?: 'round' | 'floor' | 'ceil') => {\n const multiplier = 10 ** precisionValue;\n\n switch (roundingMode) {\n case 'floor':\n return Math.floor(num * multiplier) / multiplier;\n case 'ceil':\n return Math.ceil(num * multiplier) / multiplier;\n default:\n return Math.round(num * multiplier) / multiplier;\n }\n};\n\n/** Props for the {@link UITableStatisticDisplay} component. */\ntype Props = {\n /** Character used to separate the integer and fractional parts (default: `'.'`). */\n decimalSeparator?: string;\n /** Character used to separate thousands groups (default: `','`). */\n groupSeparator?: string;\n /** Optional node rendered before the formatted number (e.g. a currency symbol). */\n prefix?: React.ReactNode;\n /** Optional node rendered after the formatted number (e.g. a unit label). */\n suffix?: React.ReactNode;\n /** Number of decimal digits to display. */\n precision?: number;\n /** Rounding strategy applied before formatting (default: `'round'`). */\n roundingMode?: 'round' | 'floor' | 'ceil';\n /** When `true`, pads the fractional part with trailing zeros up to `precision` digits. */\n showTrailingZeros?: boolean;\n /** Font-size variant for the displayed number (default: `'lg'`). */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** The numeric or string value to format; falsy / invalid values render an empty state. */\n value: number | string | null | undefined;\n};\n\n/**\n * A memoized table-cell component that formats a numeric value with configurable\n * separators, precision, rounding, and size; renders {@link UITableEmpty} when\n * the value is zero, invalid, or absent.\n *\n * @example\n * import { UITableStatisticDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableStatisticDisplay value={1234567.89} precision={2} prefix=\"$\" size=\"md\" />\n */\nexport const UITableStatisticDisplay = memo(\n ({\n decimalSeparator = '.',\n groupSeparator = ',',\n prefix: Prefix,\n suffix: Suffix,\n precision,\n roundingMode = 'round',\n showTrailingZeros = false,\n size = 'lg',\n value = 0,\n }: Props) => {\n // Memoize number formatting options\n const formatOptions = useMemo((): Intl.NumberFormatOptions => {\n const options: Intl.NumberFormatOptions = {};\n\n if (typeof precision === 'number' && precision >= 0 && showTrailingZeros) {\n options.minimumFractionDigits = precision;\n options.maximumFractionDigits = precision;\n } else {\n options.maximumFractionDigits = precision;\n }\n\n return options;\n }, [precision, showTrailingZeros]);\n\n const formatNumber = useCallback(\n (num: number): string => {\n let processedNum = num;\n\n // Áp dụng làm tròn nếu có precision\n if (typeof precision === 'number' && precision >= 0) {\n processedNum = applyRounding(num, precision, roundingMode);\n }\n\n return processedNum.toLocaleString('en-US', formatOptions);\n },\n [roundingMode, formatOptions, precision]\n );\n\n // Memoize value processing\n const processedValue = useMemo((): string => {\n // Xử lý giá trị number\n if (typeof value === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 'N/A';\n }\n return formatNumber(value);\n }\n\n // Xử lý giá trị string\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n // Nếu là chuỗi rỗng\n if (!trimmedValue) {\n return 'N/A';\n }\n\n // Thử convert sang number\n const numValue = Number(trimmedValue);\n\n if (Number.isNaN(numValue) || !Number.isFinite(numValue)) {\n // Nếu không phải số, trả về string gốc\n return 'N/A';\n }\n\n return formatNumber(numValue);\n }\n\n return 'N/A';\n }, [value, formatNumber]);\n\n // Memoize separator replacement\n const finalFormattedValue = useMemo((): string => {\n // Chỉ thay thế separators nếu khác mặc định\n if (decimalSeparator === '.' && groupSeparator === ',') {\n return processedValue;\n }\n return processedValue.replace(/,/g, groupSeparator).replace(/\\./g, decimalSeparator);\n }, [processedValue, decimalSeparator, groupSeparator]);\n\n if (finalFormattedValue === '0' || finalFormattedValue === 'N/A' || !finalFormattedValue) {\n return <UITableEmpty />;\n }\n\n return (\n <Flex\n padding=\"none\"\n className={cn(\n 'font-number text-lg text-text-positive tabular-nums',\n size === 'xs' && 'text-xs',\n size === 'sm' && 'text-sm',\n size === 'md' && 'text-base',\n size === 'lg' && 'text-lg',\n size === 'xl' && 'text-xl'\n )}\n >\n {Prefix}\n <p>{finalFormattedValue}</p>\n {Suffix}\n </Flex>\n );\n }\n);\nUITableStatisticDisplay.displayName = 'UITableStatisticDisplay';\n"],"mappings":"qPAeA,MAAM,GAAiB,EAAa,EAAwB,IAA8C,CACxG,IAAM,EAAa,IAAM,EAEzB,OAAQ,EAAR,CACE,IAAK,QACH,OAAO,KAAK,MAAM,EAAM,CAAU,EAAI,EACxC,IAAK,OACH,OAAO,KAAK,KAAK,EAAM,CAAU,EAAI,EACvC,QACE,OAAO,KAAK,MAAM,EAAM,CAAU,EAAI,CAC1C,CACF,EAkCa,EAA0B,GACpC,CACC,mBAAmB,IACnB,iBAAiB,IACjB,OAAQ,EACR,OAAQ,EACR,YACA,eAAe,QACf,oBAAoB,GACpB,OAAO,KACP,QAAQ,KACG,CAEX,IAAM,EAAgB,MAAwC,CAC5D,IAAM,EAAoC,CAAC,EAS3C,OAPI,OAAO,GAAc,UAAY,GAAa,GAAK,IACrD,EAAQ,sBAAwB,GAGhC,EAAQ,sBAAwB,EAG3B,CACT,EAAG,CAAC,EAAW,CAAiB,CAAC,EAE3B,EAAe,EAClB,GAAwB,CACvB,IAAI,EAAe,EAOnB,OAJI,OAAO,GAAc,UAAY,GAAa,IAChD,EAAe,EAAc,EAAK,EAAW,CAAY,GAGpD,EAAa,eAAe,QAAS,CAAa,CAC3D,EACA,CAAC,EAAc,EAAe,CAAS,CACzC,EAGM,EAAiB,MAAsB,CAE3C,GAAI,OAAO,GAAU,SAInB,OAHI,OAAO,MAAM,CAAK,GAAK,CAAC,OAAO,SAAS,CAAK,EACxC,MAEF,EAAa,CAAK,EAI3B,GAAI,OAAO,GAAU,SAAU,CAC7B,IAAM,EAAe,EAAM,KAAK,EAGhC,GAAI,CAAC,EACH,MAAO,MAIT,IAAM,EAAW,OAAO,CAAY,EAOpC,OALI,OAAO,MAAM,CAAQ,GAAK,CAAC,OAAO,SAAS,CAAQ,EAE9C,MAGF,EAAa,CAAQ,CAC9B,CAEA,MAAO,KACT,EAAG,CAAC,EAAO,CAAY,CAAC,EAGlB,EAAsB,MAEtB,IAAqB,KAAO,IAAmB,IAC1C,EAEF,EAAe,QAAQ,KAAM,CAAc,CAAC,CAAC,QAAQ,MAAO,CAAgB,EAClF,CAAC,EAAgB,EAAkB,CAAc,CAAC,EAMrD,OAJI,IAAwB,KAAO,IAAwB,OAAS,CAAC,EAC5D,EAAC,EAAD,CAAe,CAAA,EAItB,EAAC,EAAD,CACE,QAAQ,OACR,UAAW,EACT,sDACA,IAAS,MAAQ,UACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,YACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,SACnB,WATF,CAWG,EACD,EAAC,IAAD,CAAA,SAAI,CAAuB,CAAA,EAC1B,CACG,GAEV,CACF,EACA,EAAwB,YAAc"}
@@ -1,2 +0,0 @@
1
- import{Statistic as e}from"./data-display/statistic.mjs";import{q as t}from"./tables-9d53sH9E.mjs";import{memo as n}from"react";import{cn as r}from"@customafk/react-toolkit/utils";import{jsx as i,jsxs as a}from"react/jsx-runtime";const o={up:`bg-success`,down:`bg-danger`,neutral:`bg-primary`},s=n(()=>{let{summary:n,onSummaryItemClick:s}=t();return!n||n.length===0?null:i(`div`,{"data-slot":`table-summary-bar`,className:`w-full overflow-x-auto px-2 pb-1`,children:i(`div`,{className:`grid gap-3`,style:{gridTemplateColumns:`repeat(auto-fill, minmax(200px, 240px))`},children:n.map(t=>{let n=o[t.trend??`neutral`],c=!!s;return a(`div`,{className:r(`flex flex-col overflow-hidden rounded border border-border bg-card shadow-card`,c&&`cursor-pointer transition-shadow hover:shadow-md`),onClick:c?()=>s(t):void 0,role:c?`button`:void 0,tabIndex:c?0:void 0,onKeyDown:c?e=>{(e.key===`Enter`||e.key===` `)&&s(t)}:void 0,children:[i(`div`,{className:r(`h-0.75 w-full shrink-0`,n)}),a(`div`,{className:`flex flex-1 flex-col gap-2 px-5 py-4`,children:[i(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-text-positive-weak`,children:t.label}),t.value!==null&&t.value!==void 0?i(e,{value:t.value,prefix:t.prefix,suffix:t.suffix,precision:t.precision,trend:t.trend,size:`xl`,className:`font-bold`}):i(`span`,{className:`text-xl font-bold tabular-nums text-text-positive-strong`,children:`—`}),t.description&&i(`span`,{className:`text-xs text-text-positive-weak`,children:t.description})]})]},t.label)})})})});s.displayName=`UITableSummaryBar`;export{s as UITableSummaryBar};
2
- //# sourceMappingURL=summary-bar-ByYm7uWR.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summary-bar-ByYm7uWR.mjs","names":[],"sources":["../packages/components/features/tables/components/table/summary-bar.tsx"],"sourcesContent":["'use client';\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Statistic } from '@/components/data-display/statistic';\n\nimport { useUITableContext } from '../../hooks/use-context';\nimport type { SummaryItem } from '../../types';\n\nconst trendAccent: Record<NonNullable<SummaryItem['trend']>, string> = {\n up: 'bg-success',\n down: 'bg-danger',\n neutral: 'bg-primary',\n};\n\nexport const UITableSummaryBar = memo(() => {\n const { summary, onSummaryItemClick } = useUITableContext();\n\n if (!summary || summary.length === 0) return null;\n\n return (\n <div data-slot=\"table-summary-bar\" className=\"w-full overflow-x-auto px-2 pb-1\">\n <div className=\"grid gap-3\" style={{ gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 240px))' }}>\n {summary.map(item => {\n const accent = trendAccent[item.trend ?? 'neutral'];\n const isClickable = !!onSummaryItemClick;\n\n return (\n <div\n key={item.label}\n className={cn(\n 'flex flex-col overflow-hidden rounded border border-border bg-card shadow-card',\n isClickable && 'cursor-pointer transition-shadow hover:shadow-md'\n )}\n onClick={isClickable ? () => onSummaryItemClick(item) : undefined}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? e => {\n if (e.key === 'Enter' || e.key === ' ') onSummaryItemClick(item);\n }\n : undefined\n }\n >\n {/* Coloured accent strip */}\n <div className={cn('h-0.75 w-full shrink-0', accent)} />\n\n <div className=\"flex flex-1 flex-col gap-2 px-5 py-4\">\n {/* Label */}\n <span className=\"text-[11px] font-semibold uppercase tracking-widest text-text-positive-weak\">{item.label}</span>\n\n {/* Value */}\n {item.value !== null && item.value !== undefined ? (\n <Statistic\n value={item.value}\n prefix={item.prefix}\n suffix={item.suffix}\n precision={item.precision}\n trend={item.trend}\n size=\"xl\"\n className=\"font-bold\"\n />\n ) : (\n <span className=\"text-xl font-bold tabular-nums text-text-positive-strong\">—</span>\n )}\n\n {/* Description */}\n {item.description && <span className=\"text-xs text-text-positive-weak\">{item.description}</span>}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n});\nUITableSummaryBar.displayName = 'UITableSummaryBar';\n"],"mappings":"sOAUA,MAAM,EAAiE,CACrE,GAAI,aACJ,KAAM,YACN,QAAS,YACX,EAEa,EAAoB,MAAW,CAC1C,GAAM,CAAE,UAAS,sBAAuB,EAAkB,EAI1D,MAFI,CAAC,GAAW,EAAQ,SAAW,EAAU,KAG3C,EAAC,MAAD,CAAK,YAAU,oBAAoB,UAAU,4CAC3C,EAAC,MAAD,CAAK,UAAU,aAAa,MAAO,CAAE,oBAAqB,yCAA0C,WACjG,EAAQ,IAAI,GAAQ,CACnB,IAAM,EAAS,EAAY,EAAK,OAAS,WACnC,EAAc,CAAC,CAAC,EAEtB,OACE,EAAC,MAAD,CAEE,UAAW,EACT,iFACA,GAAe,kDACjB,EACA,QAAS,MAAoB,EAAmB,CAAI,EAAI,IAAA,GACxD,KAAM,EAAc,SAAW,IAAA,GAC/B,SAAU,EAAc,EAAI,IAAA,GAC5B,UACE,EACI,GAAK,EACC,EAAE,MAAQ,SAAW,EAAE,MAAQ,MAAK,EAAmB,CAAI,CACjE,EACA,IAAA,YAdR,CAkBE,EAAC,MAAD,CAAK,UAAW,EAAG,yBAA0B,CAAM,CAAI,CAAA,EAEvD,EAAC,MAAD,CAAK,UAAU,gDAAf,CAEE,EAAC,OAAD,CAAM,UAAU,uFAA+E,EAAK,KAAY,CAAA,EAG/G,EAAK,QAAU,MAAQ,EAAK,QAAU,IAAA,GACrC,EAAC,EAAD,CACE,MAAO,EAAK,MACZ,OAAQ,EAAK,OACb,OAAQ,EAAK,OACb,UAAW,EAAK,UAChB,MAAO,EAAK,MACZ,KAAK,KACL,UAAU,WACX,CAAA,EAED,EAAC,OAAD,CAAM,UAAU,oEAA2D,GAAO,CAAA,EAInF,EAAK,aAAe,EAAC,OAAD,CAAM,UAAU,2CAAmC,EAAK,WAAkB,CAAA,CAC5F,GACF,GAzCE,EAAK,KAyCP,CAET,CAAC,CACE,CAAA,CACF,CAAA,CAET,CAAC,EACD,EAAkB,YAAc"}
@@ -1,2 +0,0 @@
1
- const e=require("./data-display/statistic.cjs"),t=require("./tables-B1O9qy-m.cjs");let n=require("react"),r=require("@customafk/react-toolkit/utils"),i=require("react/jsx-runtime");const a={up:`bg-success`,down:`bg-danger`,neutral:`bg-primary`},o=(0,n.memo)(()=>{let{summary:n,onSummaryItemClick:o}=t.q();return!n||n.length===0?null:(0,i.jsx)(`div`,{"data-slot":`table-summary-bar`,className:`w-full overflow-x-auto px-2 pb-1`,children:(0,i.jsx)(`div`,{className:`grid gap-3`,style:{gridTemplateColumns:`repeat(auto-fill, minmax(200px, 240px))`},children:n.map(t=>{let n=a[t.trend??`neutral`],s=!!o;return(0,i.jsxs)(`div`,{className:(0,r.cn)(`flex flex-col overflow-hidden rounded border border-border bg-card shadow-card`,s&&`cursor-pointer transition-shadow hover:shadow-md`),onClick:s?()=>o(t):void 0,role:s?`button`:void 0,tabIndex:s?0:void 0,onKeyDown:s?e=>{(e.key===`Enter`||e.key===` `)&&o(t)}:void 0,children:[(0,i.jsx)(`div`,{className:(0,r.cn)(`h-0.75 w-full shrink-0`,n)}),(0,i.jsxs)(`div`,{className:`flex flex-1 flex-col gap-2 px-5 py-4`,children:[(0,i.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-text-positive-weak`,children:t.label}),t.value!==null&&t.value!==void 0?(0,i.jsx)(e.Statistic,{value:t.value,prefix:t.prefix,suffix:t.suffix,precision:t.precision,trend:t.trend,size:`xl`,className:`font-bold`}):(0,i.jsx)(`span`,{className:`text-xl font-bold tabular-nums text-text-positive-strong`,children:`—`}),t.description&&(0,i.jsx)(`span`,{className:`text-xs text-text-positive-weak`,children:t.description})]})]},t.label)})})})});o.displayName=`UITableSummaryBar`,exports.UITableSummaryBar=o;
2
- //# sourceMappingURL=summary-bar-DjdtmsIY.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summary-bar-DjdtmsIY.cjs","names":["useUITableContext","Statistic"],"sources":["../packages/components/features/tables/components/table/summary-bar.tsx"],"sourcesContent":["'use client';\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Statistic } from '@/components/data-display/statistic';\n\nimport { useUITableContext } from '../../hooks/use-context';\nimport type { SummaryItem } from '../../types';\n\nconst trendAccent: Record<NonNullable<SummaryItem['trend']>, string> = {\n up: 'bg-success',\n down: 'bg-danger',\n neutral: 'bg-primary',\n};\n\nexport const UITableSummaryBar = memo(() => {\n const { summary, onSummaryItemClick } = useUITableContext();\n\n if (!summary || summary.length === 0) return null;\n\n return (\n <div data-slot=\"table-summary-bar\" className=\"w-full overflow-x-auto px-2 pb-1\">\n <div className=\"grid gap-3\" style={{ gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 240px))' }}>\n {summary.map(item => {\n const accent = trendAccent[item.trend ?? 'neutral'];\n const isClickable = !!onSummaryItemClick;\n\n return (\n <div\n key={item.label}\n className={cn(\n 'flex flex-col overflow-hidden rounded border border-border bg-card shadow-card',\n isClickable && 'cursor-pointer transition-shadow hover:shadow-md'\n )}\n onClick={isClickable ? () => onSummaryItemClick(item) : undefined}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? e => {\n if (e.key === 'Enter' || e.key === ' ') onSummaryItemClick(item);\n }\n : undefined\n }\n >\n {/* Coloured accent strip */}\n <div className={cn('h-0.75 w-full shrink-0', accent)} />\n\n <div className=\"flex flex-1 flex-col gap-2 px-5 py-4\">\n {/* Label */}\n <span className=\"text-[11px] font-semibold uppercase tracking-widest text-text-positive-weak\">{item.label}</span>\n\n {/* Value */}\n {item.value !== null && item.value !== undefined ? (\n <Statistic\n value={item.value}\n prefix={item.prefix}\n suffix={item.suffix}\n precision={item.precision}\n trend={item.trend}\n size=\"xl\"\n className=\"font-bold\"\n />\n ) : (\n <span className=\"text-xl font-bold tabular-nums text-text-positive-strong\">—</span>\n )}\n\n {/* Description */}\n {item.description && <span className=\"text-xs text-text-positive-weak\">{item.description}</span>}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n});\nUITableSummaryBar.displayName = 'UITableSummaryBar';\n"],"mappings":"qLAUA,MAAM,EAAiE,CACrE,GAAI,aACJ,KAAM,YACN,QAAS,YACX,EAEa,GAAA,EAAA,EAAA,KAAA,KAA+B,CAC1C,GAAM,CAAE,UAAS,sBAAuBA,EAAAA,EAAkB,EAI1D,MAFI,CAAC,GAAW,EAAQ,SAAW,EAAU,MAG3C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,oBAAoB,UAAU,6CAC3C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,aAAa,MAAO,CAAE,oBAAqB,yCAA0C,WACjG,EAAQ,IAAI,GAAQ,CACnB,IAAM,EAAS,EAAY,EAAK,OAAS,WACnC,EAAc,CAAC,CAAC,EAEtB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAEE,WAAA,EAAA,EAAA,GAAA,CACE,iFACA,GAAe,kDACjB,EACA,QAAS,MAAoB,EAAmB,CAAI,EAAI,IAAA,GACxD,KAAM,EAAc,SAAW,IAAA,GAC/B,SAAU,EAAc,EAAI,IAAA,GAC5B,UACE,EACI,GAAK,EACC,EAAE,MAAQ,SAAW,EAAE,MAAQ,MAAK,EAAmB,CAAI,CACjE,EACA,IAAA,YAdR,EAkBE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,WAAA,EAAA,EAAA,GAAA,CAAc,yBAA0B,CAAM,CAAI,CAAA,GAEvD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gDAAf,EAEE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,uFAA+E,EAAK,KAAY,CAAA,EAG/G,EAAK,QAAU,MAAQ,EAAK,QAAU,IAAA,IACrC,EAAA,EAAA,IAAA,CAACC,EAAAA,UAAD,CACE,MAAO,EAAK,MACZ,OAAQ,EAAK,OACb,OAAQ,EAAK,OACb,UAAW,EAAK,UAChB,MAAO,EAAK,MACZ,KAAK,KACL,UAAU,WACX,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,oEAA2D,GAAO,CAAA,EAInF,EAAK,cAAe,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2CAAmC,EAAK,WAAkB,CAAA,CAC5F,GACF,GAzCE,EAAK,KAyCP,CAET,CAAC,CACE,CAAA,CACF,CAAA,CAET,CAAC,EACD,EAAkB,YAAc"}
@@ -1,2 +0,0 @@
1
- import{Statistic as e}from"./data-display/statistic.mjs";import{Checkbox as t}from"./ui/checkbox.mjs";import{DropdownMenu as n,DropdownMenuContent as r,DropdownMenuGroup as i,DropdownMenuItem as a,DropdownMenuShortcut as o,DropdownMenuTrigger as s}from"./ui/dropdown-menu.mjs";import{Spinner as c}from"./ui/spinner.mjs";import{ResizableHandle as l,ResizablePanel as u,ResizablePanelGroup as d}from"./ui/resizable.mjs";import{AlertTriangle as f,BoxIcon as p,ChevronDown as m,EllipsisVerticalIcon as h,MinusIcon as g,MoveLeftIcon as _,MoveRightIcon as v,PinOffIcon as y}from"lucide-react";import{Activity as b,Suspense as ee,createContext as x,lazy as S,memo as C,use as w,useCallback as T,useEffect as E,useId as te,useMemo as D,useRef as O,useState as k}from"react";import{cn as A}from"@customafk/react-toolkit/utils";import{cva as j}from"class-variance-authority";import{Fragment as M,jsx as N,jsxs as P}from"react/jsx-runtime";import{flexRender as F,getCoreRowModel as ne,getExpandedRowModel as re,getGroupedRowModel as ie,useReactTable as ae}from"@tanstack/react-table";const oe=()=>P(`div`,{className:`flex gap-0 text-text-positive-weak`,children:[N(g,{size:16}),N(g,{size:16})]}),I=x(null),L=()=>{let e=w(I);if(!e)throw Error(`useTableInnerWrapperContext must be used within a TableInnerWrapperProvider`);return e},R=x(null),z=()=>{let e=w(R);if(!e)throw Error(`useTableInnerTableContext must be used within a TableInnerTableProvider`);return e},B=x(null),se=()=>{let e=w(B);if(!e)throw Error(`useTableHeaderRowContext must be used within a TableHeaderRowProvider`);return e},V=x(null),H=()=>{let e=w(V);if(!e)throw Error(`useTableBodyContext must be used within a TableBodyProvider`);return e},U=x(null),ce=()=>{let e=w(U);if(!e)throw Error(`useTableRowContext must be used within a TableRowProvider`);return e},le=x(null),W=()=>{let e=w(le);if(!e)throw Error(`useTableContext must be used within a TableProvider`);return e},ue=x(null),G=()=>{let e=w(ue);if(!e)throw Error(`useUITableFilterContext must be used within a UITableProvider`);return e},de=x(null),K=()=>{let e=w(de);if(!e)throw Error(`useUITableAnalysisContext must be used within a UITableProvider`);return e},fe=j([`absolute right-2 z-10 p-0.5 opacity-0 bg-card`,`cursor-pointer rounded-full transition-all`,`text-text-positive-weak`,`[&>svg]:size-4`,`group-hover:opacity-100`,`hover:bg-muted-muted hover:text-text-positive`]),q=j([`sticky left-0 flex flex-1 items-center justify-center bg-transparent text-text-positive-weak opacity-100`]),J=j([`relative m-0 flex size-full flex-col flex-nowrap items-start justify-start gap-2`]),pe=j([`relative w-full flex-1 min-h-0 overflow-auto border-b border-b-border border-l border-l-border`]),Y=j([`grid w-full table-fixed caption-bottom border-collapse border-spacing-0 flex-col content-start`]),X=j([`sticky top-0 z-40 h-9 w-full`,`grid select-none bg-white`,`border-b border-b-border shadow`,`font-medium text-[13px] text-text-positive-weak`,`[&_tr:not(:last-child)_td]:border-b`,`[&_th]:inline-flex`,`[&_th]:bg-card`,`[&_th]:items-center`,`[&_th]:transition-all`,`[&_th]:duration-300`,`[&_th]:whitespace-nowrap`,`[&_th]:border-border`,`[&_th]:border-r`,`[&_th]:first:border-l-0`,`[&_tr_th:not([data-pinned=false])]:bg-card`]),Z=j([`flex`]),me=j([`group flex`],{variants:{isPinned:{left:`sticky`,right:`sticky`,false:`relative`},isActions:{true:`border-r-0!`,false:``},isLastCell:{true:``,false:``},isFirstCell:{true:``,false:``},position:{start:`justify-start`,center:`justify-center`,end:`justify-end`}},compoundVariants:[{isPinned:`left`,isLastCell:!0,className:`border-r border-r-border`},{isPinned:`right`,isFirstCell:!0,className:`border-l border-l-border`}]}),Q=j([`relative w-full`,`[&_tr]:flex`,`[&_tr]:flex-none`,`[&_tr]:w-full`,`[&_tr]:cursor-pointer [&_tr]:focus:outline-none`,`[&_tr]:border-b [&_tr]:border-b-border`,`[&_td]:z-10`,`[&_td]:transition-all`,`[&_td]:flex`,`[&_td]:flex-none`,`[&_td]:overflow-hidden`,`[&_td]:whitespace-nowrap`,`[&_td]:px-4`,`[&_td]:py-2.5`,`[&_td]:align-middle`,`[&_td]:border-border`,`[&_td]:data-[selected=true]:bg-muted-muted!`,`[&_td]:data-[selected=true]:hover:bg-muted-muted!`,`[&_td>div]:inline-flex`,`[&_td>div]:items-center`,`[&_td>div]:w-full`,`[&_td:not([data-pinned=false])]:z-20`,`[&_td:not([data-pinned=false])]:sticky`,`[&_td:not([data-pinned=false])]:bg-muted-bg-subtle`]),he=j([`group transition-colors hover:bg-muted-muted hover:[&_td]:bg-muted-muted! [&_td]:border-r [&_td]:border-r-border`]),ge=j([`group-hover:bg-muted-muted!`],{variants:{isPinned:{left:`sticky`,right:`sticky`,false:`relative`}},defaultVariants:{isPinned:void 0}}),_e=j([`sticky border-r-0! inset-y-0 right-0 z-30 flex items-center pr-4 group-hover:bg-muted-muted!`]),ve=j([`group-hover:bg-muted-muted!`],{variants:{isPinned:{left:``,right:``,false:``},isLastCell:{true:``,false:``},isFirstCell:{true:``,false:``}},compoundVariants:[{isPinned:`left`,isLastCell:!0,className:`border-r border-r-border`},{isPinned:`right`,isFirstCell:!0,className:`border-l border-l-border`}]}),ye=j([`overflow-x-hidden`],{variants:{position:{start:`justify-start`,center:`justify-center`,end:`justify-end`}},defaultVariants:{position:`start`}}),be=j([`shrink-0 flex w-full justify-center border-t border-border-weak font-medium`]),xe=j([`flex w-full`,`text-[13px] font-medium text-text-positive-weak`]),Se=j([`flex flex-none items-center overflow-hidden whitespace-nowrap px-4 py-2`,`border-r border-r-border`],{variants:{isPinned:{left:`sticky z-20 bg-white`,right:`sticky z-20 bg-white`,false:`relative`},isFirstCell:{true:`border-l border-l-border`,false:``},isLastCell:{true:`border-r border-r-border`,false:``}}}),Ce=j([`flex cursor-pointer gap-x-0.5`],{variants:{state:{idle:`text-text-positive-weak hover:text-text-positive`,fetching:`cursor-not-allowed`,error:`text-danger hover:text-danger-strong`}},defaultVariants:{state:`idle`}}),we=C(({className:e,children:t,...n})=>{let{isFetching:r,isRefetching:i,isEmpty:a}=H();return a||r||i?null:N(`tbody`,{slot:`table-body`,className:A(Q(),e),...n,children:t})});we.displayName=`UITableBody`;const Te=C(({isPinned:e=!1,isFirstCell:t=!1,isLastCell:n=!1,colId:r,position:i=`start`,column:a,getContext:o,...s})=>{let{innerTableId:c,table:l}=z(),u=O(null),d=O(null),f=D(()=>{let t=a?.getStart(`left`);return e===`left`&&typeof t==`number`?`${t}px`:void 0},[e,a]),p=D(()=>{let t=a?.getAfter(`right`);return e===`right`&&typeof t==`number`?`${t}px`:void 0},[e,a]),m=D(()=>`calc(var(--col-${r}-size) * 1px)`,[r]),h=D(()=>a?.columnDef.minSize?`calc(var(--col-${r}-minSize) * 1px)`:void 0,[r,a]),g=D(()=>a?.columnDef.maxSize?`calc(var(--col-${r}-maxSize) * 1px)`:void 0,[r,a]),_=D(()=>F(a?.columnDef.cell,o()),[a,o]);return E(()=>{u.current=document.querySelector(`table[id="${c}"]`)},[c]),E(()=>{if(!d.current)return;let e=d.current.scrollWidth,t=a?.getSize();t!=null&&e>t&&u.current instanceof HTMLTableElement&&typeof r==`string`&&a?.columnDef.meta?.fitContent&&l.setColumnSizing(t=>({...t,[r]:e+32}))},[r,a,l]),N(`td`,{slot:`table-body-cell`,"data-pinned":e,"data-lastcell":n||void 0,"data-firstcell":t||void 0,style:{left:f,right:p,width:m,minWidth:h,maxWidth:g},className:ve({isPinned:e||void 0,isLastCell:n,isFirstCell:t}),...s,children:N(`div`,{ref:d,slot:`table-body-cell-inner`,className:ye({position:i}),children:_})})});Te.displayName=`UITableCell`;const Ee=C(({column:e,getContext:t,className:n,...r})=>{let i=D(()=>F(e?.columnDef.cell,t()),[e,t]);return N(`td`,{"data-col":`actions`,className:_e(),...r,children:i})});Ee.displayName=`UITableCellActions`;const De=C(({isPinned:e,isSelected:n=!1,className:r,onToggleRowSelected:i,...a})=>{let o=T(e=>{i?.(!!e)},[i]);return N(`td`,{slot:`table-body-cell`,"data-pinned":!0,style:{left:0,zIndex:20,width:60,maxWidth:60},className:A(ge({isPinned:e}),r),...a,children:N(`div`,{"data-slot":`table-cell-inner`,className:`flex! w-full! items-center justify-center bg-transparent text-center align-middle`,onClick:e=>{e.preventDefault(),e.stopPropagation()},children:N(t,{"aria-label":`Select Row`,checked:n,onCheckedChange:o})})})});De.displayName=`UITableCellSelect`;const Oe=C(()=>{let{table:e,isFetching:t,isRefetching:n,loadingDisplayRow:r=3}=W();return!t&&!n?null:N(`tbody`,{className:A(Q(),`pointer-events-none`),children:Array.from({length:r}).map((t,n)=>N(`tr`,{"data-slot":`table-row`,"data-index":n,className:A(he(),`animate-pulse relative!`),children:e.getAllColumns().map((t,r)=>{let i=t.getIsPinned(),a=t.getStart(`left`),o=t.getAfter(`right`);return t.id===`actions`?N(`td`,{"data-slot":`table-body-cell`,"data-col":t.id,"data-cell":r,style:{width:60},className:_e(),children:N(`div`,{className:`w-full h-4 bg-muted-muted rounded-full`})},`${t.id}-${r}`):t.id===`select`?N(`td`,{"data-slot":`table-body-cell`,"data-col":t.id,"data-cell":r,"data-pinned":!0,style:{left:0,zIndex:20,width:60,maxWidth:60},className:ge({isPinned:`left`}),children:N(`div`,{className:`w-full flex justify-center`,children:N(`div`,{className:`size-4 bg-muted-muted rounded-full`})})},`${t.id}-${n}`):N(`td`,{"data-col":t.id,"data-cell":r,"data-selected":void 0,"data-lastcell":t.id===e.getAllColumns()[e.getAllColumns().length-1].id||void 0,"data-firstcell":t.id===e.getAllColumns()[0].id||void 0,style:{zIndex:i?20:0,left:i===`left`&&typeof a==`number`?`${a}px`:void 0,right:i===`right`&&typeof o==`number`?`${o}px`:void 0,width:`calc(var(--col-${t.id}-size) * 1px)`,minWidth:t.columnDef.minSize?`calc(var(--col-${t.id}-minSize) * 1px)`:void 0,maxWidth:t.columnDef.maxSize?`calc(var(--col-${t.id}-maxSize) * 1px)`:void 0},className:ve({isPinned:t.getIsPinned(),isFirstCell:t.id===e.getRightHeaderGroups()[0]?.headers[0]?.id,isLastCell:t.id===e.getLeftHeaderGroups()[0]?.headers[e.getLeftHeaderGroups()[0].headers.length-1]?.id}),children:N(`div`,{className:ye({position:t.columnDef.meta?.position??`start`}),children:N(`div`,{className:`w-full h-4 bg-muted-muted rounded-full`})})},`${t.id}-${r}`)})},n))})}),ke=C(()=>{let{isEmpty:e,emptyDisplayHeight:t}=W();return e?N(M,{children:e&&N(`div`,{className:q(),style:{minHeight:t??`24rem`},children:P(`div`,{className:`flex flex-col items-center gap-1`,children:[N(p,{strokeWidth:1,size:48}),N(`p`,{children:`Không có dữ liệu`})]})})}):null});ke.displayName=`UITableEmptyDisplay`;const Ae=C(({className:e,children:t,...n})=>N(`div`,{slot:`table-footer`,className:A(be(),e),...n,children:t}));Ae.displayName=`UITableFooter`;function je(e,t,n){switch(n){case`count`:return e;case`sum`:return t.reduce((e,t)=>e+t,0);case`avg`:return t.length===0?0:t.reduce((e,t)=>e+t,0)/t.length;case`min`:return t.length===0?0:Math.min(...t);case`max`:return t.length===0?0:Math.max(...t)}}function Me(e,t){return e.map(e=>{let n=e.getValue(t);return typeof n==`string`?Number(n):typeof n==`number`?n:NaN}).filter(e=>!Number.isNaN(e))}const Ne=C(()=>{let{table:t}=W(),{rowSelectionState:n}=H(),r=D(()=>t.getHeaderGroups()[0]?.headers??[],[t.getHeaderGroups()]),i=D(()=>r.some(e=>e.column.columnDef.meta?.aggregation),[r]),a=D(()=>t.getSelectedRowModel().flatRows,[t,n]),o=D(()=>t.getRowModel().rows,[t]),s=a.length>0?a:o,c=D(()=>{let e={};for(let t of r){let n=t.column.columnDef.meta?.aggregation;if(!n)continue;let r=Me(s,t.id);e[t.id]=je(s.length,r,n.type)}return e},[r,s]),l=t.getState().columnPinning,u=l.left??[],d=l.right??[],f=r.find(e=>d.includes(e.id))?.id,p=[...r].reverse().find(e=>u.includes(e.id))?.id;if(!i)return null;let m=a.length>0?`${a.length}`:`${o.length}`;return N(`div`,{slot:`table-footer-row`,className:xe(),children:r.map(t=>{let n=t.id,r=u.includes(n)?`left`:d.includes(n)?`right`:!1,i=n===f,a=n===p,o=r===`left`?`${t.column.getStart(`left`)}px`:void 0,s=r===`right`?`${t.column.getAfter(`right`)}px`:void 0;if(n===`select`)return N(`div`,{slot:`table-footer-select`,"data-pinned":`left`,style:{left:`0px`,width:`60px`},className:A(Se({isPinned:`left`,isFirstCell:!1,isLastCell:!1}),`justify-center`),children:N(`span`,{className:`truncate text-[11px] items-center text-text-positive-weak`,children:m})},n);if(n===`actions`)return N(`div`,{slot:`table-footer-actions`,style:{width:`calc(var(--col-${n}-size) * 1px)`,right:`0px`},className:Se({isPinned:!1,isFirstCell:!1,isLastCell:!1})},n);let l=t.column.columnDef.meta?.aggregation,h=c[n]??null;return N(`div`,{slot:`table-footer-cell`,"data-pinned":r,style:{left:o,right:s,width:`calc(var(--col-${n}-size) * 1px)`},className:Se({isPinned:r||`left`,isFirstCell:i,isLastCell:a}),children:l&&h!==null?N(e,{value:h,prefix:l.prefix,suffix:l.suffix,precision:l.precision,size:`sm`}):N(`span`,{className:`text-text-positive-weak`,children:`—`})},n)})})});Ne.displayName=`UITableFooterRow`;const Pe=C(({className:e,children:t,...n})=>N(`thead`,{slot:`table-head`,className:A(X(),e),...n,children:t}));Pe.displayName=`UITableHead`;const Fe=C(({isPinned:e,onLeftPin:t,onRightPin:c,onUnpin:l,className:u})=>{let d=T(()=>{t?.(`left`)},[t]),f=T(()=>{c?.(`right`)},[c]),p=T(()=>{l?.(!1)},[l]);return P(n,{children:[N(s,{asChild:!0,children:N(`button`,{type:`button`,className:A(fe(),u),children:N(h,{})})}),N(r,{align:`end`,className:`w-64 p-4`,children:P(i,{className:`*:data-[slot=dropdown-menu-item]:rounded-xs *:data-[slot=dropdown-menu-item]:p-2`,children:[N(b,{mode:e?`visible`:`hidden`,children:P(a,{onClick:p,children:[!!e&&`Bỏ ghim`,N(o,{children:N(y,{className:`size-4`})})]})}),P(b,{mode:e?`hidden`:`visible`,children:[P(a,{onClick:d,children:[e?`Bỏ ghim`:`Ghim trái`,N(o,{children:N(_,{className:`size-4`})})]}),P(a,{onClick:f,children:[e?`Bỏ ghim`:`Ghim phải`,N(o,{children:N(v,{className:`size-4`})})]})]})]})})]})});Fe.displayName=`UITableHeadCellOption`;const Ie=C(({isVisible:e=!0,isPinned:t=!1,isFirstCell:n=!1,isLastCell:r=!1,isOptionsVisible:i=!0,headerId:a,headerColumn:o,className:s,children:c,onColumnPin:l,onToggleVisibility:u,...d})=>{let f=o?.columnDef.meta?.position;return P(`th`,{slot:`table-head-cell`,"data-pinned":t,"data-header":a,style:{zIndex:D(()=>t?20:void 0,[t]),left:D(()=>{let e=o?.getStart?.(`left`);return t===`left`&&typeof e==`number`?`${e}px`:void 0},[t,o]),right:D(()=>{let e=o?.getAfter?.(`right`);return t===`right`&&typeof e==`number`?`${e}px`:void 0},[t,o]),width:D(()=>`calc(var(--header-${a}-size) * 1px)`,[a]),minWidth:D(()=>o?.columnDef.minSize?`calc(var(--col-${a}-minSize) * 1px)`:void 0,[a,o]),maxWidth:D(()=>o?.columnDef.maxSize?`calc(var(--col-${a}-maxSize) * 1px)`:void 0,[a,o])},className:A(me({isPinned:t||`false`,isActions:a===`actions`,isLastCell:r,isFirstCell:n,position:f}),s),...d,children:[N(`div`,{className:`truncate px-4`,children:c}),i&&N(Fe,{isPinned:t,isVisible:e,onLeftPin:l,onRightPin:l,onUnpin:l})]})});Ie.displayName=`UITableHeadCell`;const Le=C(({isPinned:e,isAllRowsSelected:n,style:r,onToggleAllRowsSelected:i,...a})=>{let o=T(e=>{i?.(!!e)},[i]);return N(`th`,{slot:`table-header-cell`,"data-pinned":!0,style:{left:0,zIndex:40,width:60,maxWidth:60},className:ge({isPinned:e}),...a,children:N(`div`,{className:`absolute inset-0 flex items-center justify-center`,onClick:e=>{e.preventDefault(),e.stopPropagation()},children:N(t,{"aria-label":`Select All Rows`,checked:n,onCheckedChange:o})})})});Le.displayName=`UITableHeadCellSelect`;const Re=C(({headerGroup:e,className:t,...n})=>{let{isAllRowsSelected:r,columnPinningState:i,leftPinnedHeaders:a,rightPinnedHeaders:o,onToggleAllRowsSelected:s}=se(),c=o[0]?.id,l=a[a.length-1]?.id;return N(`tr`,{slot:`table-head-row`,className:A(Z(),t),...n,children:e.headers.map((e,t)=>{let n=e.column.getIsVisible(),a=i.left?.includes(e.id)?`left`:i.right?.includes(e.id)?`right`:!1;return e.id===`select`?N(Le,{isPinned:a,isAllRowsSelected:r,onToggleAllRowsSelected:s},e.id):N(Ie,{isVisible:n,isPinned:a,isFirstCell:e.id===c,isLastCell:e.id===l,isOptionsVisible:![`select`,`actions`].includes(e.id),headerId:e.id,headerColumn:e.column,colSpan:e.colSpan,onColumnPin:e.column.pin,onToggleVisibility:e.column.toggleVisibility,children:F(e.column.columnDef.header,e.getContext())},`${e.id}-${t}`)})})});Re.displayName=`UITableHeadRow`;const ze=C(({children:e,...t})=>{let{table:n,innerTableId:r,totalSize:i}=z(),a=O(null);return E(()=>{if(!a.current)return;let e=n.getFlatHeaders(),t,r=new ResizeObserver(r=>{t!==void 0&&cancelAnimationFrame(t),t=requestAnimationFrame(()=>{let t=r[0];if(!t)return;let i=t.target;if(!(i instanceof HTMLTableElement))return;let a=t.contentRect.width,{left:o=[],right:s=[]}=n.getState().columnPinning,c=0,l=0,u=0,d=e.map(e=>{let{id:t}=e,n=t===`select`||t===`actions`,r=o.includes(t)||s.includes(t),i=e.getSize(),a=e.column.columnDef.maxSize;return n?(c+=60,{id:t,isFlex:!1,width:60}):r?(c+=i,{id:t,isFlex:!1,width:i}):e.column.columnDef.size||i!==150?(u+=i,{id:t,isFlex:!1,width:i}):(l++,{id:t,isFlex:!0,maxSize:a})}),f=a-c-u,p=l>0?Math.max(0,Math.floor(f/l)):0,m=i.closest(`[data-slot="table-scroll-host"]`);d.forEach(e=>{if(e.isFlex){let t=e.maxSize?Math.min(p,e.maxSize):p;i.style.setProperty(`--header-${e.id}-size`,`${t}`),i.style.setProperty(`--col-${e.id}-size`,`${t}`),m?.style.setProperty(`--col-${e.id}-size`,`${t}`),e.maxSize&&i.style.setProperty(`--col-${e.id}-maxSize`,`${e.maxSize}`)}else i.style.setProperty(`--header-${e.id}-size`,`${e.width}`),i.style.setProperty(`--col-${e.id}-size`,`${e.width}`),m?.style.setProperty(`--col-${e.id}-size`,`${e.width}`)})})});return r.observe(a.current),()=>{t!==void 0&&cancelAnimationFrame(t),r.disconnect()}},[n.getState().columnSizingInfo,n.getState().columnSizing,n.getState().columnPinning]),N(`table`,{id:r,ref:a,slot:`table-inner-table`,className:Y(),style:{minWidth:i},...t,children:e})});ze.displayName=`UITableInnerTable`;const Be=C(({children:e,...t})=>{let{innerWrapperId:n}=L();return N(`div`,{id:n,slot:`table-inner-wrapper`,className:pe(),...t,children:e})});Be.displayName=`UITableInnerWrapper`;const Ve=C(({fetchMoreData:e})=>{let{innerWrapperId:t}=L(),[n,r]=k(`idle`),[i,a]=k(0),o=T(async()=>{try{r(`fetching`),await e?.(),r(`idle`)}catch(e){console.error(`Error fetching more data:`,e),r(`error`)}},[e]);return E(()=>{let e=document.querySelector(`div[id="${t}"]`);if(!e)return;let n=new ResizeObserver(e=>{a(e[0].contentRect.width)});return n.observe(e),()=>n.disconnect()},[t]),e?N(`tr`,{className:`sticky! left-0 h-10`,style:{width:i},children:N(`td`,{className:`absolute left-0 flex w-full items-center justify-center text-xs`,children:P(`button`,{type:`button`,disabled:n===`fetching`,className:Ce({state:n}),onClick:o,children:[n===`idle`&&N(m,{className:`size-4`}),n===`fetching`&&N(c,{className:`size-4 animate-spin`}),n===`error`&&N(f,{className:`size-4 text-danger`}),n===`idle`&&`Tải thêm`,n===`fetching`&&`Đang tải...`,n===`error`&&`Lỗi! Thử lại?`]})})}):null});Ve.displayName=`UITableLoadMore`;const He=C(({row:e,isSelected:t,rowIndex:n,children:r,...i})=>{let{keyOfClickRow:a,isAllRowsSelected:o,columnPinningState:s,leftPinnedHeaders:c,rightPinnedHeaders:l,onClickRow:u}=ce(),d=D(()=>s.left??[],[s]),f=D(()=>s.right??[],[s]),p=D(()=>l?.[0]?.id,[l]),m=D(()=>c?.[c.length-1]?.id,[c]),h=D(()=>e.getVisibleCells().some(e=>e.column.id===`select`),[e]),g=T(t=>{if(u){let t=a?e.original?.[a]:void 0;u(n,typeof t==`string`||typeof t==`number`?t:void 0)}else h&&e.toggleSelected();t.preventDefault(),t.stopPropagation()},[a,u,e,n,h]);return N(`tr`,{slot:`table-row`,"data-index":n,className:he(),onClick:g,...i,children:e.getVisibleCells().map((e,r)=>{let i=d.includes(e.column.id),a=f.includes(e.column.id),s=i?`left`:a?`right`:!1;return e.column.id===`actions`?N(Ee,{"data-col":e.column.id,"data-cell":n,"data-selected":t||void 0,column:e.column,getContext:e.getContext},`${e.id}-${r}`):e.column.id===`select`?N(De,{"data-col":e.column.id,"data-cell":n,"data-selected":t||void 0,isPinned:s,isSelected:o||t,onToggleRowSelected:e.row.toggleSelected},`${e.id}-${r}`):N(Te,{"data-col":e.column.id,"data-cell":n,"data-selected":t||void 0,isPinned:s,isFirstCell:e.column.id===p,isLastCell:e.column.id===m,colId:e.column.id,position:e.column.columnDef.meta?.position??`start`,column:e.column,getContext:e.getContext},`${e.id}-${r}`)})})});He.displayName=`UITableRow`;const Ue=C(({className:e,children:t,...n})=>N(`div`,{slot:`table-wrapper`,className:A(J(),e),...n,children:t}));Ue.displayName=`UITableWrapper`;const We=({children:e})=>{let{table:t,fetchMoreData:n}=W(),{rowSelectionState:r}=H(),{rows:i}=t.getRowModel();return P(d,{direction:`horizontal`,style:{direction:t.options.columnResizeDirection},className:`relative flex w-full max-w-full flex-1 gap-1 overflow-auto border-t border-t-border border-r border-r-border p-0 text-sm`,children:[N(u,{"data-slot":`table-scroll-host`,className:`relative flex flex-col`,children:P(Be,{children:[P(ze,{children:[N(Pe,{children:t.getHeaderGroups().map(e=>N(Re,{headerGroup:e},e.id))}),P(we,{children:[i.map((e,t)=>N(He,{row:e,isSelected:r[e.id]===!0,rowIndex:t},e.id)),n&&N(Ve,{fetchMoreData:n})]}),N(Oe,{})]}),N(ke,{})]})}),e&&P(M,{children:[N(l,{}),e]})]})};function Ge(e){switch(e){case`tag`:return{type:`tag`,values:[]};case`single-tag`:return{type:`single-tag`,value:null};case`date-range`:return{type:`date-range`};case`number`:return{type:`number`,operator:`eq`};case`text`:return{type:`text`,operator:`contains`,value:``};case`boolean`:return{type:`boolean`,value:null}}}const Ke=C(({innerWrapperId:e,children:t})=>{let n=D(()=>({innerWrapperId:e}),[e]);return N(I.Provider,{value:n,children:t})});Ke.displayName=`UITableInnerWrapperProvider`;const qe=C(({table:e,innerTableId:t,totalSize:n,children:r})=>{let i=D(()=>({table:e,innerTableId:t,totalSize:n}),[e,t,n]);return N(R.Provider,{value:i,children:r})});qe.displayName=`UITableInnerTableProvider`;const Je=C(({isAllRowsSelected:e,columnPinningState:t,leftPinnedHeaders:n,rightPinnedHeaders:r,onToggleAllRowsSelected:i,children:a})=>{let o=D(()=>({isAllRowsSelected:e,columnPinningState:t,leftPinnedHeaders:n,rightPinnedHeaders:r,onToggleAllRowsSelected:i}),[e,t,n,r,i]);return N(B.Provider,{value:o,children:a})});Je.displayName=`UITableHeadRowProvider`;const Ye=C(({isFetching:e,isRefetching:t,isEmpty:n,rowSelectionState:r,children:i})=>{let a=D(()=>({isFetching:e,isRefetching:t,isEmpty:n,rowSelectionState:r}),[e,t,n,r]);return N(V.Provider,{value:a,children:i})});Ye.displayName=`UITableBodyProvider`;const Xe=C(({keyOfClickRow:e,isAllRowsSelected:t,columnPinningState:n,leftPinnedHeaders:r,rightPinnedHeaders:i,onClickRow:a,children:o})=>{let s=D(()=>({keyOfClickRow:e,isAllRowsSelected:t,columnPinningState:n,leftPinnedHeaders:r,rightPinnedHeaders:i,onClickRow:a}),[e,t,n,r,i,a]);return N(U.Provider,{value:s,children:o})});Xe.displayName=`UITableRowProvider`;const Ze=({title:e,isFetching:t=!1,isRefetching:n=!1,isLoading:r=!1,loadingDisplayRow:i=3,data:a,columns:o,totalRows:s,leftPinnedColumns:c=[],rightPinnedColumns:l=[],keyOfClickRow:u,onClickRow:d,onRowSelection:f,onColumnPinning:p,fetchMoreData:m,emptyDisplayHeight:h,csvData:g,csvFileName:_,filterDefinitions:v=[],onFilterChange:y,summary:b=[],onSummaryItemClick:ee,showAnalysisPanel:x=!1,description:S,headerActions:C,children:w})=>{let E=te(),O=te(),[A,j]=k(!1),[M,P]=k({}),[F,oe]=k({right:l,left:[`select`,...c]}),[I,L]=k({}),[R,z]=k([]),B=T(e=>(P(e),f?.(e instanceof Function?e(M):e),e),[M,f]),se=T(e=>{oe(e),p?.(e instanceof Function?e(F):e)},[F,p]),V=T(e=>{let t=v.find(t=>t.id===e);if(!t)return;let n={id:`${e}-${crypto.randomUUID()}`,definitionId:e,value:Ge(t.type)};z(e=>{let t=[...e,n];return y?.(t),t})},[v,y]),H=T(e=>{z(t=>{let n=t.filter(t=>t.id!==e);return y?.(n),n})},[y]),U=T((e,t)=>{z(n=>{let r=n.map(n=>n.id===e?{...n,value:t}:n);return y?.(r),r})},[y]),ce=D(()=>({filterDefinitions:v,activeFilters:R,addFilter:V,removeFilter:H,updateFilter:U}),[v,R,V,H,U]),W=ae({data:a,columns:o,state:{rowSelection:M,columnPinning:F,expanded:I},defaultColumn:{enableResizing:!1,size:void 0,minSize:void 0,maxSize:void 0},columnResizeMode:`onChange`,columnResizeDirection:`ltr`,enableColumnPinning:!0,enableRowSelection:!0,enableColumnResizing:!0,enableMultiRowSelection:!0,autoResetAll:!1,autoResetExpanded:!1,autoResetPageIndex:!1,getSubRows:e=>e.subRows,getCoreRowModel:ne(),getGroupedRowModel:ie(),getExpandedRowModel:re(),onRowSelectionChange:B,onColumnPinningChange:se,onExpandedChange:L}),G=D(()=>{let{rows:e}=W.getRowModel();return e},[W.getRowModel().rows,W.getState().columnPinning]),K=D(()=>!t&&!n&&G.length===0,[G,t,n]),fe=D(()=>({title:e,table:W,isEmpty:K,isFetching:t,isRefetching:n,isLoading:r,loadingDisplayRow:i,totalRows:s,fetchMoreData:m,emptyDisplayHeight:h,csvData:g,csvFileName:_,summary:b,onSummaryItemClick:ee,showAnalysisPanel:x,description:S,headerActions:C}),[e,W,K,n,t,r,i,s,m,h,W.getState().columnPinning,W.getState().expanded,g,_,b,ee,x,S,C]),q=D(()=>W.getState(),[W.getState()]),J=D(()=>W.getIsAllRowsSelected(),[W.getIsAllRowsSelected()]),pe=D(()=>q.rowSelection,[q.rowSelection]),Y=D(()=>q.columnPinning,[q.columnPinning]),X=D(()=>W.getLeftHeaderGroups()[0]?.headers||[],[W.getState().columnPinning]),Z=D(()=>W.getRightHeaderGroups()[0]?.headers||[],[W.getState().columnPinning]),me=D(()=>W.getTotalSize(),[W.getTotalSize()]),Q=T(()=>j(e=>!e),[]),he=D(()=>({isOpen:A,toggle:Q}),[A,Q]);return N(de.Provider,{value:he,children:N(ue.Provider,{value:ce,children:N(le.Provider,{value:fe,children:N(Ke,{innerWrapperId:E,children:N(qe,{table:W,innerTableId:O,totalSize:me,children:N(Je,{isAllRowsSelected:J,columnPinningState:Y,leftPinnedHeaders:X,rightPinnedHeaders:Z,onToggleAllRowsSelected:W.toggleAllRowsSelected,children:N(Ye,{isFetching:t,isRefetching:n,isEmpty:K,rowSelectionState:pe,children:N(Xe,{keyOfClickRow:u,isAllRowsSelected:J,columnPinningState:Y,leftPinnedHeaders:X,rightPinnedHeaders:Z,onClickRow:d,children:w})})})})})})})})};function $(e){let t=S(e);return e=>N(ee,{fallback:null,children:N(t,{...e})})}const Qe=$(()=>import(`./avatar-name-display-BrpnTqa_.mjs`).then(e=>({default:e.UITableAvatarNameDisplay}))),$e=$(()=>import(`./badge-display-Dg5XM66P.mjs`).then(e=>({default:e.UITableBadgeDisplay}))),et=$(()=>import(`./boolean-display-DVn3UGuZ.mjs`).then(e=>({default:e.UITableBooleanDisplay}))),tt=$(()=>import(`./currency-display-CKLQ_lxN.mjs`).then(e=>({default:e.UITableCurrencyDisplay}))),nt=$(()=>import(`./date-display-BrCdJkmq.mjs`).then(e=>({default:e.UITableDateDisplay}))),rt=$(()=>import(`./description-display-BQFLzI2g.mjs`).then(e=>({default:e.UITableDescriptionDisplay}))),it=$(()=>import(`./edit-button-DmMFMzG0.mjs`).then(e=>({default:e.UITableEditButton}))),at=$(()=>import(`./email-display-m745lUts.mjs`).then(e=>({default:e.UITableEmailDisplay}))),ot=$(()=>import(`./list-display-8Jx6G5nk.mjs`).then(e=>({default:e.UITableListDisplay}))),st=$(()=>import(`./more-button-BKBcXz6E.mjs`).then(e=>({default:e.UITableMoreButton}))),ct=$(()=>import(`./name-display-BBJoNnRG.mjs`).then(e=>({default:e.UITableNameDisplay}))),lt=$(()=>import(`./permalink-CZ3g9daG.mjs`).then(e=>({default:e.UITablePermalink}))),ut=$(()=>import(`./phone-number-C43z68gT.mjs`).then(e=>({default:e.UITablePhoneNumberDisplay}))),dt=$(()=>import(`./progress-display-DvV-YhkE.mjs`).then(e=>({default:e.UITableProgressDisplay}))),ft=$(()=>import(`./remove-button-Db5oSj4h.mjs`).then(e=>({default:e.UITableRemoveButton}))),pt=$(()=>import(`./statistic-DwiUKz02.mjs`).then(e=>({default:e.UITableStatisticDisplay}))),mt=$(()=>import(`./status-display-BKe0EupF.mjs`).then(e=>({default:e.UITableStatusDisplay}))),ht=$(()=>import(`./toggle-button-DNLtfjJC.mjs`).then(e=>({default:e.UITableToggleButton}))),gt=$(()=>import(`./user-BymzvsYp.mjs`).then(e=>({default:e.UITableUserDataDisplay}))),_t=$(()=>import(`./filter-CG6wQHRd.mjs`).then(e=>({default:e.UITableFilter}))),vt=$(()=>import(`./analysis-panel-BD2QvOth.mjs`).then(e=>({default:e.UITableAnalysisPanel}))),yt=$(()=>import(`./summary-bar-ByYm7uWR.mjs`).then(e=>({default:e.UITableSummaryBar}))),bt=$(()=>import(`./tooltip-lvpW5dMi.mjs`).then(e=>({default:e.UITableTooltip}))),xt=$(()=>import(`./tooltip-lvpW5dMi.mjs`).then(e=>({default:e.UITableTooltipFilter}))),St=$(()=>import(`./tooltip-lvpW5dMi.mjs`).then(e=>({default:e.UITableTooltipActions})));export{Ve as A,ke as B,St as C,We as D,Ze as E,Ie as F,K as G,Ee as H,Fe as I,G as J,H as K,Pe as L,ze as M,Re as N,Ue as O,Le as P,Ne as R,bt as S,gt as T,Te as U,De as V,we as W,oe as Y,ft as _,tt as a,yt as b,it as c,ot as d,st as f,dt as g,ut as h,et as i,Be as j,He as k,at as l,lt as m,Qe as n,nt as o,ct as p,W as q,$e as r,rt as s,vt as t,_t as u,pt as v,xt as w,ht as x,mt as y,Ae as z};
2
- //# sourceMappingURL=tables-9d53sH9E.mjs.map