@etus/ui 0.4.0-beta.2 → 0.4.0-beta.4

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 (821) hide show
  1. package/dist/chunk-23BHD62H.js +288 -0
  2. package/dist/chunk-23BHD62H.js.map +1 -0
  3. package/dist/chunk-2D6OFVPN.js +145 -0
  4. package/dist/chunk-2D6OFVPN.js.map +1 -0
  5. package/dist/chunk-2HM5Z2YP.js +834 -0
  6. package/dist/chunk-2HM5Z2YP.js.map +1 -0
  7. package/dist/chunk-2IFYXJ3H.js +107 -0
  8. package/dist/chunk-2IFYXJ3H.js.map +1 -0
  9. package/dist/chunk-2UGDLAYC.js +71 -0
  10. package/dist/chunk-2UGDLAYC.js.map +1 -0
  11. package/dist/chunk-2VHARFMD.js +670 -0
  12. package/dist/chunk-2VHARFMD.js.map +1 -0
  13. package/dist/chunk-2XJWE2XR.js +36 -0
  14. package/dist/chunk-2XJWE2XR.js.map +1 -0
  15. package/dist/chunk-2Y7PQ6ZL.js +96 -0
  16. package/dist/chunk-2Y7PQ6ZL.js.map +1 -0
  17. package/dist/chunk-32IJQOUV.js +226 -0
  18. package/dist/chunk-32IJQOUV.js.map +1 -0
  19. package/dist/chunk-33JGPMUW.js +170 -0
  20. package/dist/chunk-33JGPMUW.js.map +1 -0
  21. package/dist/chunk-36XTKR3B.js +544 -0
  22. package/dist/chunk-36XTKR3B.js.map +1 -0
  23. package/dist/chunk-3L5G7VI2.js +203 -0
  24. package/dist/chunk-3L5G7VI2.js.map +1 -0
  25. package/dist/chunk-3MJNJKAF.js +264 -0
  26. package/dist/chunk-3MJNJKAF.js.map +1 -0
  27. package/dist/chunk-3NFQXZHO.js +199 -0
  28. package/dist/chunk-3NFQXZHO.js.map +1 -0
  29. package/dist/chunk-3RJEA2MM.js +560 -0
  30. package/dist/chunk-3RJEA2MM.js.map +1 -0
  31. package/dist/chunk-3WOGOTOV.js +152 -0
  32. package/dist/chunk-3WOGOTOV.js.map +1 -0
  33. package/dist/chunk-46ESMCEQ.js +80 -0
  34. package/dist/chunk-46ESMCEQ.js.map +1 -0
  35. package/dist/chunk-4GQN76L7.js +228 -0
  36. package/dist/chunk-4GQN76L7.js.map +1 -0
  37. package/dist/chunk-4MQNDQ4O.js +62 -0
  38. package/dist/chunk-4MQNDQ4O.js.map +1 -0
  39. package/dist/chunk-4RSHPKHB.js +268 -0
  40. package/dist/chunk-4RSHPKHB.js.map +1 -0
  41. package/dist/chunk-4Y72SPNL.js +283 -0
  42. package/dist/chunk-4Y72SPNL.js.map +1 -0
  43. package/dist/chunk-57KTYE5H.js +273 -0
  44. package/dist/chunk-57KTYE5H.js.map +1 -0
  45. package/dist/chunk-5J5OL4IV.js +529 -0
  46. package/dist/chunk-5J5OL4IV.js.map +1 -0
  47. package/dist/chunk-5KTMPLDK.js +251 -0
  48. package/dist/chunk-5KTMPLDK.js.map +1 -0
  49. package/dist/chunk-5XQIH6WM.js +204 -0
  50. package/dist/chunk-5XQIH6WM.js.map +1 -0
  51. package/dist/chunk-5YDFC74M.js +310 -0
  52. package/dist/chunk-5YDFC74M.js.map +1 -0
  53. package/dist/chunk-5ZEYTBTU.js +288 -0
  54. package/dist/chunk-5ZEYTBTU.js.map +1 -0
  55. package/dist/chunk-5ZKKXLPF.js +177 -0
  56. package/dist/chunk-5ZKKXLPF.js.map +1 -0
  57. package/dist/chunk-5ZWFIDO2.js +3 -0
  58. package/dist/chunk-5ZWFIDO2.js.map +1 -0
  59. package/dist/chunk-65YSTUD2.js +206 -0
  60. package/dist/chunk-65YSTUD2.js.map +1 -0
  61. package/dist/chunk-6GWO7JNP.js +438 -0
  62. package/dist/chunk-6GWO7JNP.js.map +1 -0
  63. package/dist/chunk-6SHOL6WR.js +163 -0
  64. package/dist/chunk-6SHOL6WR.js.map +1 -0
  65. package/dist/chunk-6SZRWNPT.js +67 -0
  66. package/dist/chunk-6SZRWNPT.js.map +1 -0
  67. package/dist/chunk-6VCJU6XD.js +19 -0
  68. package/dist/chunk-6VCJU6XD.js.map +1 -0
  69. package/dist/chunk-6XY7QYVR.js +812 -0
  70. package/dist/chunk-6XY7QYVR.js.map +1 -0
  71. package/dist/chunk-6Z73ZQOP.js +3 -0
  72. package/dist/chunk-6Z73ZQOP.js.map +1 -0
  73. package/dist/chunk-6ZAMTPGN.js +309 -0
  74. package/dist/chunk-6ZAMTPGN.js.map +1 -0
  75. package/dist/chunk-7I6KK6QE.js +411 -0
  76. package/dist/chunk-7I6KK6QE.js.map +1 -0
  77. package/dist/chunk-7RTHGI6E.js +154 -0
  78. package/dist/chunk-7RTHGI6E.js.map +1 -0
  79. package/dist/chunk-7Y2UQMX6.js +524 -0
  80. package/dist/chunk-7Y2UQMX6.js.map +1 -0
  81. package/dist/chunk-7ZJ32KRQ.js +100 -0
  82. package/dist/chunk-7ZJ32KRQ.js.map +1 -0
  83. package/dist/chunk-AB3S55W5.js +1208 -0
  84. package/dist/chunk-AB3S55W5.js.map +1 -0
  85. package/dist/chunk-AEE5GDNA.js +220 -0
  86. package/dist/chunk-AEE5GDNA.js.map +1 -0
  87. package/dist/chunk-AEHYYTFW.js +70 -0
  88. package/dist/chunk-AEHYYTFW.js.map +1 -0
  89. package/dist/chunk-AFCSDND5.js +58 -0
  90. package/dist/chunk-AFCSDND5.js.map +1 -0
  91. package/dist/chunk-AR3OXNPL.js +70 -0
  92. package/dist/chunk-AR3OXNPL.js.map +1 -0
  93. package/dist/chunk-ARNVOHVW.js +103 -0
  94. package/dist/chunk-ARNVOHVW.js.map +1 -0
  95. package/dist/chunk-ATIEGLR2.js +3 -0
  96. package/dist/chunk-ATIEGLR2.js.map +1 -0
  97. package/dist/chunk-AUCDXPWH.js +853 -0
  98. package/dist/chunk-AUCDXPWH.js.map +1 -0
  99. package/dist/chunk-AWYOWR5N.js +928 -0
  100. package/dist/chunk-AWYOWR5N.js.map +1 -0
  101. package/dist/chunk-AZANPNLR.js +134 -0
  102. package/dist/chunk-AZANPNLR.js.map +1 -0
  103. package/dist/chunk-B3BDIM4H.js +137 -0
  104. package/dist/chunk-B3BDIM4H.js.map +1 -0
  105. package/dist/chunk-B4ETIQOO.js +101 -0
  106. package/dist/chunk-B4ETIQOO.js.map +1 -0
  107. package/dist/chunk-B6KQKQ4S.js +774 -0
  108. package/dist/chunk-B6KQKQ4S.js.map +1 -0
  109. package/dist/chunk-B7ZLPQSO.js +181 -0
  110. package/dist/chunk-B7ZLPQSO.js.map +1 -0
  111. package/dist/chunk-BECPEVUL.js +115 -0
  112. package/dist/chunk-BECPEVUL.js.map +1 -0
  113. package/dist/chunk-BFBGESUI.js +217 -0
  114. package/dist/chunk-BFBGESUI.js.map +1 -0
  115. package/dist/chunk-BITATKTH.js +3 -0
  116. package/dist/chunk-BITATKTH.js.map +1 -0
  117. package/dist/chunk-BIUVOZQG.js +370 -0
  118. package/dist/chunk-BIUVOZQG.js.map +1 -0
  119. package/dist/chunk-BQMQULAC.js +37 -0
  120. package/dist/chunk-BQMQULAC.js.map +1 -0
  121. package/dist/chunk-BWGZKU3I.js +3 -0
  122. package/dist/chunk-BWGZKU3I.js.map +1 -0
  123. package/dist/chunk-CKD4UBV6.js +138 -0
  124. package/dist/chunk-CKD4UBV6.js.map +1 -0
  125. package/dist/chunk-CNRV2IGH.js +111 -0
  126. package/dist/chunk-CNRV2IGH.js.map +1 -0
  127. package/dist/chunk-CP2PEDG2.js +383 -0
  128. package/dist/chunk-CP2PEDG2.js.map +1 -0
  129. package/dist/chunk-CSXT7SKR.js +139 -0
  130. package/dist/chunk-CSXT7SKR.js.map +1 -0
  131. package/dist/chunk-CYIFWQ5Y.js +197 -0
  132. package/dist/chunk-CYIFWQ5Y.js.map +1 -0
  133. package/dist/chunk-D2V2HKLX.js +249 -0
  134. package/dist/chunk-D2V2HKLX.js.map +1 -0
  135. package/dist/chunk-D6TH3EGA.js +204 -0
  136. package/dist/chunk-D6TH3EGA.js.map +1 -0
  137. package/dist/chunk-DDM2I5C6.js +199 -0
  138. package/dist/chunk-DDM2I5C6.js.map +1 -0
  139. package/dist/chunk-DDR24GOP.js +182 -0
  140. package/dist/chunk-DDR24GOP.js.map +1 -0
  141. package/dist/chunk-DL7D5F7B.js +63 -0
  142. package/dist/chunk-DL7D5F7B.js.map +1 -0
  143. package/dist/chunk-DNAGXK2C.js +91 -0
  144. package/dist/chunk-DNAGXK2C.js.map +1 -0
  145. package/dist/chunk-DYDXGWH2.js +109 -0
  146. package/dist/chunk-DYDXGWH2.js.map +1 -0
  147. package/dist/chunk-E27SQ54A.js +122 -0
  148. package/dist/chunk-E27SQ54A.js.map +1 -0
  149. package/dist/chunk-EGYWK2XX.js +316 -0
  150. package/dist/chunk-EGYWK2XX.js.map +1 -0
  151. package/dist/chunk-ESLSPRYA.js +875 -0
  152. package/dist/chunk-ESLSPRYA.js.map +1 -0
  153. package/dist/chunk-EVUHEBWX.js +35 -0
  154. package/dist/chunk-EVUHEBWX.js.map +1 -0
  155. package/dist/chunk-F6ZKBK5B.js +265 -0
  156. package/dist/chunk-F6ZKBK5B.js.map +1 -0
  157. package/dist/chunk-F7XARQUW.js +82 -0
  158. package/dist/chunk-F7XARQUW.js.map +1 -0
  159. package/dist/chunk-FCSYPOHF.js +77 -0
  160. package/dist/chunk-FCSYPOHF.js.map +1 -0
  161. package/dist/chunk-FDES5YDF.js +159 -0
  162. package/dist/chunk-FDES5YDF.js.map +1 -0
  163. package/dist/chunk-FPCRGFNY.js +776 -0
  164. package/dist/chunk-FPCRGFNY.js.map +1 -0
  165. package/dist/chunk-FRDYXDAE.js +69 -0
  166. package/dist/chunk-FRDYXDAE.js.map +1 -0
  167. package/dist/chunk-FSMHI7DW.js +291 -0
  168. package/dist/chunk-FSMHI7DW.js.map +1 -0
  169. package/dist/chunk-FYJHWYPM.js +539 -0
  170. package/dist/chunk-FYJHWYPM.js.map +1 -0
  171. package/dist/chunk-G2V7D7VC.js +371 -0
  172. package/dist/chunk-G2V7D7VC.js.map +1 -0
  173. package/dist/chunk-G5TWK7L3.js +667 -0
  174. package/dist/chunk-G5TWK7L3.js.map +1 -0
  175. package/dist/chunk-G6SIIN2B.js +3 -0
  176. package/dist/chunk-G6SIIN2B.js.map +1 -0
  177. package/dist/chunk-GAP3OZR7.js +223 -0
  178. package/dist/chunk-GAP3OZR7.js.map +1 -0
  179. package/dist/chunk-GKMR5SVC.js +97 -0
  180. package/dist/chunk-GKMR5SVC.js.map +1 -0
  181. package/dist/chunk-GL56KIFL.js +79 -0
  182. package/dist/chunk-GL56KIFL.js.map +1 -0
  183. package/dist/chunk-GPW57XOW.js +80 -0
  184. package/dist/chunk-GPW57XOW.js.map +1 -0
  185. package/dist/chunk-H4ANCFZG.js +233 -0
  186. package/dist/chunk-H4ANCFZG.js.map +1 -0
  187. package/dist/chunk-HAEZLC7V.js +122 -0
  188. package/dist/chunk-HAEZLC7V.js.map +1 -0
  189. package/dist/chunk-HKXQLWGR.js +335 -0
  190. package/dist/chunk-HKXQLWGR.js.map +1 -0
  191. package/dist/chunk-HRNDJU7D.js +5 -5
  192. package/dist/chunk-HRNDJU7D.js.map +1 -1
  193. package/dist/chunk-HXHB2CK5.js +108 -0
  194. package/dist/chunk-HXHB2CK5.js.map +1 -0
  195. package/dist/chunk-I7ZLEC7Y.js +128 -0
  196. package/dist/chunk-I7ZLEC7Y.js.map +1 -0
  197. package/dist/chunk-IBVCSZCH.js +142 -0
  198. package/dist/chunk-IBVCSZCH.js.map +1 -0
  199. package/dist/chunk-ICAQYWCX.js +153 -0
  200. package/dist/chunk-ICAQYWCX.js.map +1 -0
  201. package/dist/chunk-ICM45N2K.js +225 -0
  202. package/dist/chunk-ICM45N2K.js.map +1 -0
  203. package/dist/chunk-IFHF4UES.js +387 -0
  204. package/dist/chunk-IFHF4UES.js.map +1 -0
  205. package/dist/chunk-ILAV2AZ4.js +226 -0
  206. package/dist/chunk-ILAV2AZ4.js.map +1 -0
  207. package/dist/chunk-IRIIK3BU.js +215 -0
  208. package/dist/chunk-IRIIK3BU.js.map +1 -0
  209. package/dist/chunk-IRKDMISK.js +62 -0
  210. package/dist/chunk-IRKDMISK.js.map +1 -0
  211. package/dist/chunk-IXJHHR3Y.js +3 -0
  212. package/dist/chunk-IXJHHR3Y.js.map +1 -0
  213. package/dist/chunk-J62TFQHR.js +174 -0
  214. package/dist/chunk-J62TFQHR.js.map +1 -0
  215. package/dist/chunk-JDTAG7KZ.js +33 -0
  216. package/dist/chunk-JDTAG7KZ.js.map +1 -0
  217. package/dist/chunk-JKYB5QAP.js +1070 -0
  218. package/dist/chunk-JKYB5QAP.js.map +1 -0
  219. package/dist/chunk-JMZ4CO6R.js +159 -0
  220. package/dist/chunk-JMZ4CO6R.js.map +1 -0
  221. package/dist/chunk-JPA2VQRW.js +119 -0
  222. package/dist/chunk-JPA2VQRW.js.map +1 -0
  223. package/dist/chunk-JWXK4TMX.js +106 -0
  224. package/dist/chunk-JWXK4TMX.js.map +1 -0
  225. package/dist/chunk-K45MMHLA.js +258 -0
  226. package/dist/chunk-K45MMHLA.js.map +1 -0
  227. package/dist/chunk-KC6CHPT3.js +995 -0
  228. package/dist/chunk-KC6CHPT3.js.map +1 -0
  229. package/dist/chunk-KPNNSUXM.js +130 -0
  230. package/dist/chunk-KPNNSUXM.js.map +1 -0
  231. package/dist/chunk-KR3IVNQH.js +402 -0
  232. package/dist/chunk-KR3IVNQH.js.map +1 -0
  233. package/dist/chunk-KRHL3YH2.js +3 -0
  234. package/dist/chunk-KRHL3YH2.js.map +1 -0
  235. package/dist/chunk-L2XR5IFJ.js +103 -0
  236. package/dist/chunk-L2XR5IFJ.js.map +1 -0
  237. package/dist/chunk-LATTRPLQ.js +286 -0
  238. package/dist/chunk-LATTRPLQ.js.map +1 -0
  239. package/dist/chunk-LFN7UHDT.js +122 -0
  240. package/dist/chunk-LFN7UHDT.js.map +1 -0
  241. package/dist/chunk-LNY2EXOV.js +349 -0
  242. package/dist/chunk-LNY2EXOV.js.map +1 -0
  243. package/dist/chunk-LQVQ7SHG.js +226 -0
  244. package/dist/chunk-LQVQ7SHG.js.map +1 -0
  245. package/dist/chunk-MK6ID2HI.js +532 -0
  246. package/dist/chunk-MK6ID2HI.js.map +1 -0
  247. package/dist/chunk-MQ2446N7.js +216 -0
  248. package/dist/chunk-MQ2446N7.js.map +1 -0
  249. package/dist/chunk-MVOENLOZ.js +3 -0
  250. package/dist/chunk-MVOENLOZ.js.map +1 -0
  251. package/dist/chunk-N23L6UDK.js +108 -0
  252. package/dist/chunk-N23L6UDK.js.map +1 -0
  253. package/dist/chunk-N3I6GA4I.js +137 -0
  254. package/dist/chunk-N3I6GA4I.js.map +1 -0
  255. package/dist/chunk-N4UTBJRY.js +72 -0
  256. package/dist/chunk-N4UTBJRY.js.map +1 -0
  257. package/dist/chunk-NCLOPI6U.js +347 -0
  258. package/dist/chunk-NCLOPI6U.js.map +1 -0
  259. package/dist/chunk-NGR4HFVA.js +136 -0
  260. package/dist/chunk-NGR4HFVA.js.map +1 -0
  261. package/dist/chunk-NK5Q2YRM.js +70 -0
  262. package/dist/chunk-NK5Q2YRM.js.map +1 -0
  263. package/dist/chunk-NWVYQYKK.js +75 -0
  264. package/dist/chunk-NWVYQYKK.js.map +1 -0
  265. package/dist/chunk-NXQ25PKF.js +318 -0
  266. package/dist/chunk-NXQ25PKF.js.map +1 -0
  267. package/dist/chunk-OEXQ2MOY.js +338 -0
  268. package/dist/chunk-OEXQ2MOY.js.map +1 -0
  269. package/dist/chunk-ONQCNOLU.js +233 -0
  270. package/dist/chunk-ONQCNOLU.js.map +1 -0
  271. package/dist/chunk-ONTUN5XH.js +57 -0
  272. package/dist/chunk-ONTUN5XH.js.map +1 -0
  273. package/dist/chunk-OQCGQG47.js +83 -0
  274. package/dist/chunk-OQCGQG47.js.map +1 -0
  275. package/dist/chunk-OWIFNJXZ.js +167 -0
  276. package/dist/chunk-OWIFNJXZ.js.map +1 -0
  277. package/dist/chunk-OWOVCGUZ.js +1062 -0
  278. package/dist/chunk-OWOVCGUZ.js.map +1 -0
  279. package/dist/chunk-PFVT27B5.js +92 -0
  280. package/dist/chunk-PFVT27B5.js.map +1 -0
  281. package/dist/chunk-PK5O62XD.js +58 -0
  282. package/dist/chunk-PK5O62XD.js.map +1 -0
  283. package/dist/chunk-PLLJNHWU.js +175 -0
  284. package/dist/chunk-PLLJNHWU.js.map +1 -0
  285. package/dist/chunk-PWCMCMDN.js +67 -0
  286. package/dist/chunk-PWCMCMDN.js.map +1 -0
  287. package/dist/chunk-Q43KJP5A.js +294 -0
  288. package/dist/chunk-Q43KJP5A.js.map +1 -0
  289. package/dist/chunk-QHKOBGLW.js +119 -0
  290. package/dist/chunk-QHKOBGLW.js.map +1 -0
  291. package/dist/chunk-QIETN4UU.js +924 -0
  292. package/dist/chunk-QIETN4UU.js.map +1 -0
  293. package/dist/chunk-QUENPT24.js +100 -0
  294. package/dist/chunk-QUENPT24.js.map +1 -0
  295. package/dist/chunk-QZWKXUZP.js +147 -0
  296. package/dist/chunk-QZWKXUZP.js.map +1 -0
  297. package/dist/chunk-R4UOT76L.js +342 -0
  298. package/dist/chunk-R4UOT76L.js.map +1 -0
  299. package/dist/chunk-RVUO7SDG.js +460 -0
  300. package/dist/chunk-RVUO7SDG.js.map +1 -0
  301. package/dist/chunk-S6ORCWM2.js +205 -0
  302. package/dist/chunk-S6ORCWM2.js.map +1 -0
  303. package/dist/chunk-SCGKQ5RE.js +55 -0
  304. package/dist/chunk-SCGKQ5RE.js.map +1 -0
  305. package/dist/chunk-SHS6EGWS.js +226 -0
  306. package/dist/chunk-SHS6EGWS.js.map +1 -0
  307. package/dist/chunk-SJSYKUCL.js +297 -0
  308. package/dist/chunk-SJSYKUCL.js.map +1 -0
  309. package/dist/chunk-SM4AZOEP.js +222 -0
  310. package/dist/chunk-SM4AZOEP.js.map +1 -0
  311. package/dist/chunk-SXJMERQL.js +40 -0
  312. package/dist/chunk-SXJMERQL.js.map +1 -0
  313. package/dist/chunk-TAZPML2P.js +198 -0
  314. package/dist/chunk-TAZPML2P.js.map +1 -0
  315. package/dist/chunk-TNROOKX3.js +352 -0
  316. package/dist/chunk-TNROOKX3.js.map +1 -0
  317. package/dist/chunk-TQBUBD3E.js +100 -0
  318. package/dist/chunk-TQBUBD3E.js.map +1 -0
  319. package/dist/chunk-U4H3XHSI.js +305 -0
  320. package/dist/chunk-U4H3XHSI.js.map +1 -0
  321. package/dist/chunk-U6EOAIPK.js +67 -0
  322. package/dist/chunk-U6EOAIPK.js.map +1 -0
  323. package/dist/chunk-U74PNG4S.js +167 -0
  324. package/dist/chunk-U74PNG4S.js.map +1 -0
  325. package/dist/chunk-U77MCUVE.js +3 -0
  326. package/dist/chunk-U77MCUVE.js.map +1 -0
  327. package/dist/chunk-UA3OQAHJ.js +140 -0
  328. package/dist/chunk-UA3OQAHJ.js.map +1 -0
  329. package/dist/chunk-UFRMZ3M6.js +284 -0
  330. package/dist/chunk-UFRMZ3M6.js.map +1 -0
  331. package/dist/chunk-UOHVT5KN.js +3 -0
  332. package/dist/chunk-UOHVT5KN.js.map +1 -0
  333. package/dist/chunk-UP2VWCW5.js +2 -7
  334. package/dist/chunk-UP2VWCW5.js.map +1 -1
  335. package/dist/chunk-V7WEN4SD.js +444 -0
  336. package/dist/chunk-V7WEN4SD.js.map +1 -0
  337. package/dist/chunk-V7XHE25E.js +354 -0
  338. package/dist/chunk-V7XHE25E.js.map +1 -0
  339. package/dist/chunk-VFALJSXB.js +373 -0
  340. package/dist/chunk-VFALJSXB.js.map +1 -0
  341. package/dist/chunk-VKDN66VL.js +129 -0
  342. package/dist/chunk-VKDN66VL.js.map +1 -0
  343. package/dist/chunk-VT4IMHGE.js +292 -0
  344. package/dist/chunk-VT4IMHGE.js.map +1 -0
  345. package/dist/chunk-VWW3DJKI.js +53 -0
  346. package/dist/chunk-VWW3DJKI.js.map +1 -0
  347. package/dist/chunk-VZZ3HP7G.js +230 -0
  348. package/dist/chunk-VZZ3HP7G.js.map +1 -0
  349. package/dist/chunk-W3QUVCRK.js +54 -0
  350. package/dist/chunk-W3QUVCRK.js.map +1 -0
  351. package/dist/chunk-W4NC5CU5.js +175 -0
  352. package/dist/chunk-W4NC5CU5.js.map +1 -0
  353. package/dist/chunk-WBE6VQOO.js +235 -0
  354. package/dist/chunk-WBE6VQOO.js.map +1 -0
  355. package/dist/chunk-WG5IYG7X.js +3 -0
  356. package/dist/chunk-WG5IYG7X.js.map +1 -0
  357. package/dist/chunk-WH7Y2MAY.js +24 -0
  358. package/dist/chunk-WH7Y2MAY.js.map +1 -0
  359. package/dist/chunk-X4YUWX7H.js +146 -0
  360. package/dist/chunk-X4YUWX7H.js.map +1 -0
  361. package/dist/chunk-XETKCF73.js +74 -0
  362. package/dist/chunk-XETKCF73.js.map +1 -0
  363. package/dist/chunk-XLTSCY22.js +93 -0
  364. package/dist/chunk-XLTSCY22.js.map +1 -0
  365. package/dist/chunk-XOGMDABS.js +152 -0
  366. package/dist/chunk-XOGMDABS.js.map +1 -0
  367. package/dist/chunk-XRMKL43Y.js +90 -0
  368. package/dist/chunk-XRMKL43Y.js.map +1 -0
  369. package/dist/chunk-XV6NXXXP.js +206 -0
  370. package/dist/chunk-XV6NXXXP.js.map +1 -0
  371. package/dist/chunk-XXFKDEFH.js +143 -0
  372. package/dist/chunk-XXFKDEFH.js.map +1 -0
  373. package/dist/chunk-Y3BOERVB.js +482 -0
  374. package/dist/chunk-Y3BOERVB.js.map +1 -0
  375. package/dist/chunk-Y555RCRZ.js +26 -0
  376. package/dist/chunk-Y555RCRZ.js.map +1 -0
  377. package/dist/chunk-Y5GO2F6P.js +188 -0
  378. package/dist/chunk-Y5GO2F6P.js.map +1 -0
  379. package/dist/chunk-Y7UFBSAD.js +515 -0
  380. package/dist/chunk-Y7UFBSAD.js.map +1 -0
  381. package/dist/chunk-YCZ6M6EF.js +912 -0
  382. package/dist/chunk-YCZ6M6EF.js.map +1 -0
  383. package/dist/chunk-YMYXWHDU.js +96 -0
  384. package/dist/chunk-YMYXWHDU.js.map +1 -0
  385. package/dist/chunk-YP2ATSXP.js +452 -0
  386. package/dist/chunk-YP2ATSXP.js.map +1 -0
  387. package/dist/chunk-YZY35OHQ.js +279 -0
  388. package/dist/chunk-YZY35OHQ.js.map +1 -0
  389. package/dist/chunk-Z3FL7LEK.js +401 -0
  390. package/dist/chunk-Z3FL7LEK.js.map +1 -0
  391. package/dist/chunk-ZARZYMBM.js +95 -0
  392. package/dist/chunk-ZARZYMBM.js.map +1 -0
  393. package/dist/chunk-ZKK7L7H7.js +78 -0
  394. package/dist/chunk-ZKK7L7H7.js.map +1 -0
  395. package/dist/chunk-ZO2EKJZM.js +4505 -0
  396. package/dist/chunk-ZO2EKJZM.js.map +1 -0
  397. package/dist/chunk-ZPCELVWJ.js +127 -0
  398. package/dist/chunk-ZPCELVWJ.js.map +1 -0
  399. package/dist/chunk-ZS2WS5NJ.js +655 -0
  400. package/dist/chunk-ZS2WS5NJ.js.map +1 -0
  401. package/dist/chunk-ZUFM33AV.js +113 -0
  402. package/dist/chunk-ZUFM33AV.js.map +1 -0
  403. package/dist/components/advanced/AssetManager/index.js +5 -0
  404. package/dist/components/advanced/AssetManager/index.js.map +1 -0
  405. package/dist/components/advanced/Calendar/index.js +10 -0
  406. package/dist/components/advanced/Calendar/index.js.map +1 -0
  407. package/dist/components/advanced/Command/index.js +6 -0
  408. package/dist/components/advanced/Command/index.js.map +1 -0
  409. package/dist/components/advanced/DragAndDrop/index.js +5 -0
  410. package/dist/components/advanced/DragAndDrop/index.js.map +1 -0
  411. package/dist/components/advanced/ErrorBoundary/index.js +5 -0
  412. package/dist/components/advanced/ErrorBoundary/index.js.map +1 -0
  413. package/dist/components/advanced/EventCalendar/index.js +10 -0
  414. package/dist/components/advanced/EventCalendar/index.js.map +1 -0
  415. package/dist/components/advanced/FileDropzone/index.js +5 -0
  416. package/dist/components/advanced/FileDropzone/index.js.map +1 -0
  417. package/dist/components/advanced/FilePreview/index.js +5 -0
  418. package/dist/components/advanced/FilePreview/index.js.map +1 -0
  419. package/dist/components/advanced/FileUpload/index.js +5 -0
  420. package/dist/components/advanced/FileUpload/index.js.map +1 -0
  421. package/dist/components/advanced/FilterBuilder/index.js +13 -0
  422. package/dist/components/advanced/FilterBuilder/index.js.map +1 -0
  423. package/dist/components/advanced/MarkdownEditor/index.js +9 -0
  424. package/dist/components/advanced/MarkdownEditor/index.js.map +1 -0
  425. package/dist/components/advanced/Portal/index.js +4 -0
  426. package/dist/components/advanced/Portal/index.js.map +1 -0
  427. package/dist/components/advanced/ReportBuilder/index.js +11 -0
  428. package/dist/components/advanced/ReportBuilder/index.js.map +1 -0
  429. package/dist/components/advanced/RichTextEditor/index.js +7 -0
  430. package/dist/components/advanced/RichTextEditor/index.js.map +1 -0
  431. package/dist/components/advanced/Search/index.js +5 -0
  432. package/dist/components/advanced/Search/index.js.map +1 -0
  433. package/dist/components/advanced/SortableList/index.js +5 -0
  434. package/dist/components/advanced/SortableList/index.js.map +1 -0
  435. package/dist/components/advanced/VersionControl/index.js +5 -0
  436. package/dist/components/advanced/VersionControl/index.js.map +1 -0
  437. package/dist/components/advanced/index.js +36 -0
  438. package/dist/components/advanced/index.js.map +1 -0
  439. package/dist/components/data-display/Accordion/index.js +5 -0
  440. package/dist/components/data-display/Accordion/index.js.map +1 -0
  441. package/dist/components/data-display/AreaChart/index.js +6 -0
  442. package/dist/components/data-display/AreaChart/index.js.map +1 -0
  443. package/dist/components/data-display/Banner/index.js +5 -0
  444. package/dist/components/data-display/Banner/index.js.map +1 -0
  445. package/dist/components/data-display/BarChart/index.js +6 -0
  446. package/dist/components/data-display/BarChart/index.js.map +1 -0
  447. package/dist/components/data-display/BarList/index.js +5 -0
  448. package/dist/components/data-display/BarList/index.js.map +1 -0
  449. package/dist/components/data-display/Callout/index.js +5 -0
  450. package/dist/components/data-display/Callout/index.js.map +1 -0
  451. package/dist/components/data-display/Carousel/index.js +10 -0
  452. package/dist/components/data-display/Carousel/index.js.map +1 -0
  453. package/dist/components/data-display/CategoryBar/index.js +6 -0
  454. package/dist/components/data-display/CategoryBar/index.js.map +1 -0
  455. package/dist/components/data-display/Chart/index.js +5 -0
  456. package/dist/components/data-display/Chart/index.js.map +1 -0
  457. package/dist/components/data-display/ChartCard/index.js +11 -0
  458. package/dist/components/data-display/ChartCard/index.js.map +1 -0
  459. package/dist/components/data-display/ChartLegend/index.js +6 -0
  460. package/dist/components/data-display/ChartLegend/index.js.map +1 -0
  461. package/dist/components/data-display/ComboChart/index.js +6 -0
  462. package/dist/components/data-display/ComboChart/index.js.map +1 -0
  463. package/dist/components/data-display/DashboardCard/index.js +6 -0
  464. package/dist/components/data-display/DashboardCard/index.js.map +1 -0
  465. package/dist/components/data-display/DashboardFilterbar/index.js +111 -0
  466. package/dist/components/data-display/DashboardFilterbar/index.js.map +1 -0
  467. package/dist/components/data-display/DataTable/FilterBuilder/index.js +13 -0
  468. package/dist/components/data-display/DataTable/FilterBuilder/index.js.map +1 -0
  469. package/dist/components/data-display/DataTable/index.js +22 -0
  470. package/dist/components/data-display/DataTable/index.js.map +1 -0
  471. package/dist/components/data-display/DeltaBar/index.js +6 -0
  472. package/dist/components/data-display/DeltaBar/index.js.map +1 -0
  473. package/dist/components/data-display/EmptyState/index.js +5 -0
  474. package/dist/components/data-display/EmptyState/index.js.map +1 -0
  475. package/dist/components/data-display/Feed/index.js +5 -0
  476. package/dist/components/data-display/Feed/index.js.map +1 -0
  477. package/dist/components/data-display/FunnelChart/index.js +6 -0
  478. package/dist/components/data-display/FunnelChart/index.js.map +1 -0
  479. package/dist/components/data-display/GaugeChart/index.js +5 -0
  480. package/dist/components/data-display/GaugeChart/index.js.map +1 -0
  481. package/dist/components/data-display/Heatmap/index.js +6 -0
  482. package/dist/components/data-display/Heatmap/index.js.map +1 -0
  483. package/dist/components/data-display/HoverCard/index.js +5 -0
  484. package/dist/components/data-display/HoverCard/index.js.map +1 -0
  485. package/dist/components/data-display/ImageGallery/index.js +6 -0
  486. package/dist/components/data-display/ImageGallery/index.js.map +1 -0
  487. package/dist/components/data-display/Item/index.js +6 -0
  488. package/dist/components/data-display/Item/index.js.map +1 -0
  489. package/dist/components/data-display/KPICard/index.js +12 -0
  490. package/dist/components/data-display/KPICard/index.js.map +1 -0
  491. package/dist/components/data-display/Lightbox/index.js +5 -0
  492. package/dist/components/data-display/Lightbox/index.js.map +1 -0
  493. package/dist/components/data-display/LineChart/index.js +6 -0
  494. package/dist/components/data-display/LineChart/index.js.map +1 -0
  495. package/dist/components/data-display/List/index.js +10 -0
  496. package/dist/components/data-display/List/index.js.map +1 -0
  497. package/dist/components/data-display/MarkerBar/index.js +6 -0
  498. package/dist/components/data-display/MarkerBar/index.js.map +1 -0
  499. package/dist/components/data-display/PieChart/index.js +6 -0
  500. package/dist/components/data-display/PieChart/index.js.map +1 -0
  501. package/dist/components/data-display/RadarChart/index.js +6 -0
  502. package/dist/components/data-display/RadarChart/index.js.map +1 -0
  503. package/dist/components/data-display/RadialChart/index.js +6 -0
  504. package/dist/components/data-display/RadialChart/index.js.map +1 -0
  505. package/dist/components/data-display/ScatterChart/index.js +6 -0
  506. package/dist/components/data-display/ScatterChart/index.js.map +1 -0
  507. package/dist/components/data-display/SingleStat/index.js +6 -0
  508. package/dist/components/data-display/SingleStat/index.js.map +1 -0
  509. package/dist/components/data-display/Sparkline/index.js +5 -0
  510. package/dist/components/data-display/Sparkline/index.js.map +1 -0
  511. package/dist/components/data-display/Table/index.js +5 -0
  512. package/dist/components/data-display/Table/index.js.map +1 -0
  513. package/dist/components/data-display/Timeline/index.js +5 -0
  514. package/dist/components/data-display/Timeline/index.js.map +1 -0
  515. package/dist/components/data-display/Tracker/index.js +6 -0
  516. package/dist/components/data-display/Tracker/index.js.map +1 -0
  517. package/dist/components/data-display/VirtualTable/index.js +8 -0
  518. package/dist/components/data-display/VirtualTable/index.js.map +1 -0
  519. package/dist/components/data-display/index.js +63 -0
  520. package/dist/components/data-display/index.js.map +1 -0
  521. package/dist/components/feedback/Alert/index.js +5 -0
  522. package/dist/components/feedback/Alert/index.js.map +1 -0
  523. package/dist/components/feedback/AlertDialog/index.js +10 -0
  524. package/dist/components/feedback/AlertDialog/index.js.map +1 -0
  525. package/dist/components/feedback/ConfirmModal/index.js +11 -0
  526. package/dist/components/feedback/ConfirmModal/index.js.map +1 -0
  527. package/dist/components/feedback/Dialog/index.js +5 -0
  528. package/dist/components/feedback/Dialog/index.js.map +1 -0
  529. package/dist/components/feedback/ErrorPage/index.js +5 -0
  530. package/dist/components/feedback/ErrorPage/index.js.map +1 -0
  531. package/dist/components/feedback/FocusTrap/index.js +5 -0
  532. package/dist/components/feedback/FocusTrap/index.js.map +1 -0
  533. package/dist/components/feedback/Message/index.js +5 -0
  534. package/dist/components/feedback/Message/index.js.map +1 -0
  535. package/dist/components/feedback/Modal/index.js +5 -0
  536. package/dist/components/feedback/Modal/index.js.map +1 -0
  537. package/dist/components/feedback/Notification/index.js +7 -0
  538. package/dist/components/feedback/Notification/index.js.map +1 -0
  539. package/dist/components/feedback/Popover/index.js +5 -0
  540. package/dist/components/feedback/Popover/index.js.map +1 -0
  541. package/dist/components/feedback/Toast/index.js +4 -0
  542. package/dist/components/feedback/Toast/index.js.map +1 -0
  543. package/dist/components/feedback/Tooltip/index.js +5 -0
  544. package/dist/components/feedback/Tooltip/index.js.map +1 -0
  545. package/dist/components/feedback/UpdatesWidget/index.js +5 -0
  546. package/dist/components/feedback/UpdatesWidget/index.js.map +1 -0
  547. package/dist/components/feedback/index.js +23 -0
  548. package/dist/components/feedback/index.js.map +1 -0
  549. package/dist/components/forms/Autocomplete/index.js +5 -0
  550. package/dist/components/forms/Autocomplete/index.js.map +1 -0
  551. package/dist/components/forms/Checkbox/index.js +5 -0
  552. package/dist/components/forms/Checkbox/index.js.map +1 -0
  553. package/dist/components/forms/CheckboxGroup/index.js +6 -0
  554. package/dist/components/forms/CheckboxGroup/index.js.map +1 -0
  555. package/dist/components/forms/ColorPicker/index.js +6 -0
  556. package/dist/components/forms/ColorPicker/index.js.map +1 -0
  557. package/dist/components/forms/Combobox/index.js +5 -0
  558. package/dist/components/forms/Combobox/index.js.map +1 -0
  559. package/dist/components/forms/DatePicker/index.js +13 -0
  560. package/dist/components/forms/DatePicker/index.js.map +1 -0
  561. package/dist/components/forms/DateRangePicker/index.js +13 -0
  562. package/dist/components/forms/DateRangePicker/index.js.map +1 -0
  563. package/dist/components/forms/EmailInput/index.js +7 -0
  564. package/dist/components/forms/EmailInput/index.js.map +1 -0
  565. package/dist/components/forms/ErrorMessage/index.js +5 -0
  566. package/dist/components/forms/ErrorMessage/index.js.map +1 -0
  567. package/dist/components/forms/Field/index.js +7 -0
  568. package/dist/components/forms/Field/index.js.map +1 -0
  569. package/dist/components/forms/FloatLabel/index.js +5 -0
  570. package/dist/components/forms/FloatLabel/index.js.map +1 -0
  571. package/dist/components/forms/Form/index.js +6 -0
  572. package/dist/components/forms/Form/index.js.map +1 -0
  573. package/dist/components/forms/FormValidation/index.js +5 -0
  574. package/dist/components/forms/FormValidation/index.js.map +1 -0
  575. package/dist/components/forms/HelpText/index.js +5 -0
  576. package/dist/components/forms/HelpText/index.js.map +1 -0
  577. package/dist/components/forms/IftaLabel/index.js +5 -0
  578. package/dist/components/forms/IftaLabel/index.js.map +1 -0
  579. package/dist/components/forms/InputGroup/index.js +13 -0
  580. package/dist/components/forms/InputGroup/index.js.map +1 -0
  581. package/dist/components/forms/InputOTP/index.js +5 -0
  582. package/dist/components/forms/InputOTP/index.js.map +1 -0
  583. package/dist/components/forms/InputOTPField/index.js +9 -0
  584. package/dist/components/forms/InputOTPField/index.js.map +1 -0
  585. package/dist/components/forms/MultiSelect/index.js +5 -0
  586. package/dist/components/forms/MultiSelect/index.js.map +1 -0
  587. package/dist/components/forms/NativeSelect/index.js +5 -0
  588. package/dist/components/forms/NativeSelect/index.js.map +1 -0
  589. package/dist/components/forms/NumberInput/index.js +6 -0
  590. package/dist/components/forms/NumberInput/index.js.map +1 -0
  591. package/dist/components/forms/PasswordInput/index.js +7 -0
  592. package/dist/components/forms/PasswordInput/index.js.map +1 -0
  593. package/dist/components/forms/PaymentInput/index.js +5 -0
  594. package/dist/components/forms/PaymentInput/index.js.map +1 -0
  595. package/dist/components/forms/PhoneInput/index.js +5 -0
  596. package/dist/components/forms/PhoneInput/index.js.map +1 -0
  597. package/dist/components/forms/RadioButton/index.js +6 -0
  598. package/dist/components/forms/RadioButton/index.js.map +1 -0
  599. package/dist/components/forms/RadioCardGroup/index.js +5 -0
  600. package/dist/components/forms/RadioCardGroup/index.js.map +1 -0
  601. package/dist/components/forms/RadioGroup/index.js +6 -0
  602. package/dist/components/forms/RadioGroup/index.js.map +1 -0
  603. package/dist/components/forms/Rating/index.js +5 -0
  604. package/dist/components/forms/Rating/index.js.map +1 -0
  605. package/dist/components/forms/SearchInput/index.js +7 -0
  606. package/dist/components/forms/SearchInput/index.js.map +1 -0
  607. package/dist/components/forms/Select/index.js +5 -0
  608. package/dist/components/forms/Select/index.js.map +1 -0
  609. package/dist/components/forms/Slider/index.js +5 -0
  610. package/dist/components/forms/Slider/index.js.map +1 -0
  611. package/dist/components/forms/SuccessMessage/index.js +5 -0
  612. package/dist/components/forms/SuccessMessage/index.js.map +1 -0
  613. package/dist/components/forms/Switch/index.js +5 -0
  614. package/dist/components/forms/Switch/index.js.map +1 -0
  615. package/dist/components/forms/TagsInput/index.js +8 -0
  616. package/dist/components/forms/TagsInput/index.js.map +1 -0
  617. package/dist/components/forms/TextInput/index.js +6 -0
  618. package/dist/components/forms/TextInput/index.js.map +1 -0
  619. package/dist/components/forms/Textarea/index.js +5 -0
  620. package/dist/components/forms/Textarea/index.js.map +1 -0
  621. package/dist/components/forms/TextareaField/index.js +9 -0
  622. package/dist/components/forms/TextareaField/index.js.map +1 -0
  623. package/dist/components/forms/TimePicker/index.js +7 -0
  624. package/dist/components/forms/TimePicker/index.js.map +1 -0
  625. package/dist/components/forms/ToggleGroup/index.js +6 -0
  626. package/dist/components/forms/ToggleGroup/index.js.map +1 -0
  627. package/dist/components/forms/URLInput/index.js +7 -0
  628. package/dist/components/forms/URLInput/index.js.map +1 -0
  629. package/dist/components/forms/index.js +58 -0
  630. package/dist/components/forms/index.js.map +1 -0
  631. package/dist/components/index.js +201 -0
  632. package/dist/components/index.js.map +1 -0
  633. package/dist/components/layout/Card/index.js +5 -0
  634. package/dist/components/layout/Card/index.js.map +1 -0
  635. package/dist/components/layout/Collapsible/index.js +5 -0
  636. package/dist/components/layout/Collapsible/index.js.map +1 -0
  637. package/dist/components/layout/Container/index.js +5 -0
  638. package/dist/components/layout/Container/index.js.map +1 -0
  639. package/dist/components/layout/Flex/index.js +5 -0
  640. package/dist/components/layout/Flex/index.js.map +1 -0
  641. package/dist/components/layout/Grid/index.js +5 -0
  642. package/dist/components/layout/Grid/index.js.map +1 -0
  643. package/dist/components/layout/Panel/index.js +5 -0
  644. package/dist/components/layout/Panel/index.js.map +1 -0
  645. package/dist/components/layout/ResizablePanels/index.js +5 -0
  646. package/dist/components/layout/ResizablePanels/index.js.map +1 -0
  647. package/dist/components/layout/ResponsiveContainer/index.js +5 -0
  648. package/dist/components/layout/ResponsiveContainer/index.js.map +1 -0
  649. package/dist/components/layout/ScrollArea/index.js +5 -0
  650. package/dist/components/layout/ScrollArea/index.js.map +1 -0
  651. package/dist/components/layout/Section/index.js +5 -0
  652. package/dist/components/layout/Section/index.js.map +1 -0
  653. package/dist/components/layout/Sheet/index.js +5 -0
  654. package/dist/components/layout/Sheet/index.js.map +1 -0
  655. package/dist/components/layout/Stack/index.js +5 -0
  656. package/dist/components/layout/Stack/index.js.map +1 -0
  657. package/dist/components/layout/index.js +17 -0
  658. package/dist/components/layout/index.js.map +1 -0
  659. package/dist/components/navigation/AccountSwitch/index.js +10 -0
  660. package/dist/components/navigation/AccountSwitch/index.js.map +1 -0
  661. package/dist/components/navigation/Breadcrumb/index.js +5 -0
  662. package/dist/components/navigation/Breadcrumb/index.js.map +1 -0
  663. package/dist/components/navigation/ContextMenu/index.js +5 -0
  664. package/dist/components/navigation/ContextMenu/index.js.map +1 -0
  665. package/dist/components/navigation/Drawer/index.js +5 -0
  666. package/dist/components/navigation/Drawer/index.js.map +1 -0
  667. package/dist/components/navigation/DropdownMenu/index.js +5 -0
  668. package/dist/components/navigation/DropdownMenu/index.js.map +1 -0
  669. package/dist/components/navigation/FileTree/index.js +5 -0
  670. package/dist/components/navigation/FileTree/index.js.map +1 -0
  671. package/dist/components/navigation/Header/index.js +5 -0
  672. package/dist/components/navigation/Header/index.js.map +1 -0
  673. package/dist/components/navigation/Menu/index.js +5 -0
  674. package/dist/components/navigation/Menu/index.js.map +1 -0
  675. package/dist/components/navigation/Menubar/index.js +5 -0
  676. package/dist/components/navigation/Menubar/index.js.map +1 -0
  677. package/dist/components/navigation/MobileSidebar/index.js +190 -0
  678. package/dist/components/navigation/MobileSidebar/index.js.map +1 -0
  679. package/dist/components/navigation/Navbar/index.js +5 -0
  680. package/dist/components/navigation/Navbar/index.js.map +1 -0
  681. package/dist/components/navigation/NavigationMenu/index.js +5 -0
  682. package/dist/components/navigation/NavigationMenu/index.js.map +1 -0
  683. package/dist/components/navigation/Pagination/index.js +10 -0
  684. package/dist/components/navigation/Pagination/index.js.map +1 -0
  685. package/dist/components/navigation/Sidebar/index.js +16 -0
  686. package/dist/components/navigation/Sidebar/index.js.map +1 -0
  687. package/dist/components/navigation/SkipLinks/index.js +5 -0
  688. package/dist/components/navigation/SkipLinks/index.js.map +1 -0
  689. package/dist/components/navigation/SpeedDial/index.js +6 -0
  690. package/dist/components/navigation/SpeedDial/index.js.map +1 -0
  691. package/dist/components/navigation/TabNavigation/index.js +5 -0
  692. package/dist/components/navigation/TabNavigation/index.js.map +1 -0
  693. package/dist/components/navigation/TabPanel/index.js +5 -0
  694. package/dist/components/navigation/TabPanel/index.js.map +1 -0
  695. package/dist/components/navigation/Tabs/index.js +5 -0
  696. package/dist/components/navigation/Tabs/index.js.map +1 -0
  697. package/dist/components/navigation/Toolbar/index.js +5 -0
  698. package/dist/components/navigation/Toolbar/index.js.map +1 -0
  699. package/dist/components/navigation/Topbar/index.js +5 -0
  700. package/dist/components/navigation/Topbar/index.js.map +1 -0
  701. package/dist/components/navigation/UserProfileDropdown/index.js +224 -0
  702. package/dist/components/navigation/UserProfileDropdown/index.js.map +1 -0
  703. package/dist/components/navigation/WorkspaceDropdown/index.js +192 -0
  704. package/dist/components/navigation/WorkspaceDropdown/index.js.map +1 -0
  705. package/dist/components/navigation/index.js +37 -0
  706. package/dist/components/navigation/index.js.map +1 -0
  707. package/dist/components/primitives/ArrowAnimated/index.js +92 -0
  708. package/dist/components/primitives/ArrowAnimated/index.js.map +1 -0
  709. package/dist/components/primitives/AspectRatio/index.js +4 -0
  710. package/dist/components/primitives/AspectRatio/index.js.map +1 -0
  711. package/dist/components/primitives/Avatar/index.js +6 -0
  712. package/dist/components/primitives/Avatar/index.js.map +1 -0
  713. package/dist/components/primitives/Badge/index.js +7 -0
  714. package/dist/components/primitives/Badge/index.js.map +1 -0
  715. package/dist/components/primitives/Button/index.js +9 -0
  716. package/dist/components/primitives/Button/index.js.map +1 -0
  717. package/dist/components/primitives/ButtonGroup/index.js +7 -0
  718. package/dist/components/primitives/ButtonGroup/index.js.map +1 -0
  719. package/dist/components/primitives/ConfirmButton/index.js +11 -0
  720. package/dist/components/primitives/ConfirmButton/index.js.map +1 -0
  721. package/dist/components/primitives/Divider/index.js +5 -0
  722. package/dist/components/primitives/Divider/index.js.map +1 -0
  723. package/dist/components/primitives/FeatureItem/index.js +5 -0
  724. package/dist/components/primitives/FeatureItem/index.js.map +1 -0
  725. package/dist/components/primitives/FeaturedIcon/index.js +5 -0
  726. package/dist/components/primitives/FeaturedIcon/index.js.map +1 -0
  727. package/dist/components/primitives/FolderStack/index.js +5 -0
  728. package/dist/components/primitives/FolderStack/index.js.map +1 -0
  729. package/dist/components/primitives/Heading/index.js +5 -0
  730. package/dist/components/primitives/Heading/index.js.map +1 -0
  731. package/dist/components/primitives/Icon/index.js +5 -0
  732. package/dist/components/primitives/Icon/index.js.map +1 -0
  733. package/dist/components/primitives/Image/index.js +5 -0
  734. package/dist/components/primitives/Image/index.js.map +1 -0
  735. package/dist/components/primitives/Kbd/index.js +5 -0
  736. package/dist/components/primitives/Kbd/index.js.map +1 -0
  737. package/dist/components/primitives/Label/index.js +5 -0
  738. package/dist/components/primitives/Label/index.js.map +1 -0
  739. package/dist/components/primitives/Link/index.js +5 -0
  740. package/dist/components/primitives/Link/index.js.map +1 -0
  741. package/dist/components/primitives/Paragraph/index.js +5 -0
  742. package/dist/components/primitives/Paragraph/index.js.map +1 -0
  743. package/dist/components/primitives/ProgressBar/index.js +6 -0
  744. package/dist/components/primitives/ProgressBar/index.js.map +1 -0
  745. package/dist/components/primitives/ProgressCircle/index.js +6 -0
  746. package/dist/components/primitives/ProgressCircle/index.js.map +1 -0
  747. package/dist/components/primitives/SkeletonLoader/index.js +5 -0
  748. package/dist/components/primitives/SkeletonLoader/index.js.map +1 -0
  749. package/dist/components/primitives/Spacer/index.js +5 -0
  750. package/dist/components/primitives/Spacer/index.js.map +1 -0
  751. package/dist/components/primitives/Spinner/index.js +5 -0
  752. package/dist/components/primitives/Spinner/index.js.map +1 -0
  753. package/dist/components/primitives/SplitButton/index.js +6 -0
  754. package/dist/components/primitives/SplitButton/index.js.map +1 -0
  755. package/dist/components/primitives/StatusIndicator/index.js +5 -0
  756. package/dist/components/primitives/StatusIndicator/index.js.map +1 -0
  757. package/dist/components/primitives/Tag/index.js +5 -0
  758. package/dist/components/primitives/Tag/index.js.map +1 -0
  759. package/dist/components/primitives/Text/index.js +5 -0
  760. package/dist/components/primitives/Text/index.js.map +1 -0
  761. package/dist/components/primitives/Thumbnail/index.js +6 -0
  762. package/dist/components/primitives/Thumbnail/index.js.map +1 -0
  763. package/dist/components/primitives/Toggle/index.js +5 -0
  764. package/dist/components/primitives/Toggle/index.js.map +1 -0
  765. package/dist/components/primitives/index.js +38 -0
  766. package/dist/components/primitives/index.js.map +1 -0
  767. package/dist/components/workflow/ApprovalFlow/index.js +11 -0
  768. package/dist/components/workflow/ApprovalFlow/index.js.map +1 -0
  769. package/dist/components/workflow/ApprovalStatus/index.js +5 -0
  770. package/dist/components/workflow/ApprovalStatus/index.js.map +1 -0
  771. package/dist/components/workflow/CommentSystem/index.js +12 -0
  772. package/dist/components/workflow/CommentSystem/index.js.map +1 -0
  773. package/dist/components/workflow/Dashboard/index.js +10 -0
  774. package/dist/components/workflow/Dashboard/index.js.map +1 -0
  775. package/dist/components/workflow/DashboardBuilder/index.js +13 -0
  776. package/dist/components/workflow/DashboardBuilder/index.js.map +1 -0
  777. package/dist/components/workflow/KanbanBoard/index.js +13 -0
  778. package/dist/components/workflow/KanbanBoard/index.js.map +1 -0
  779. package/dist/components/workflow/ProgressSteps/index.js +5 -0
  780. package/dist/components/workflow/ProgressSteps/index.js.map +1 -0
  781. package/dist/components/workflow/ReportGenerator/index.js +12 -0
  782. package/dist/components/workflow/ReportGenerator/index.js.map +1 -0
  783. package/dist/components/workflow/Stepper/index.js +5 -0
  784. package/dist/components/workflow/Stepper/index.js.map +1 -0
  785. package/dist/components/workflow/TaskCard/index.js +5 -0
  786. package/dist/components/workflow/TaskCard/index.js.map +1 -0
  787. package/dist/components/workflow/TaskList/index.js +5 -0
  788. package/dist/components/workflow/TaskList/index.js.map +1 -0
  789. package/dist/components/workflow/TaskStatus/index.js +6 -0
  790. package/dist/components/workflow/TaskStatus/index.js.map +1 -0
  791. package/dist/components/workflow/Wizard/index.js +11 -0
  792. package/dist/components/workflow/Wizard/index.js.map +1 -0
  793. package/dist/components/workflow/index.js +32 -0
  794. package/dist/components/workflow/index.js.map +1 -0
  795. package/dist/fonts/inter-OFL.txt +92 -0
  796. package/dist/fonts/inter-latin-400-normal.woff2 +0 -0
  797. package/dist/fonts/inter-latin-500-normal.woff2 +0 -0
  798. package/dist/fonts/inter-latin-600-normal.woff2 +0 -0
  799. package/dist/fonts/inter-latin-700-normal.woff2 +0 -0
  800. package/dist/fonts/jetbrains-mono-OFL.txt +93 -0
  801. package/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  802. package/dist/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  803. package/dist/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  804. package/dist/hooks/index.js +6 -0
  805. package/dist/hooks/index.js.map +1 -0
  806. package/dist/index.d.ts +114 -27
  807. package/dist/index.js +202 -52453
  808. package/dist/index.js.map +1 -1
  809. package/dist/jspdf.node.min-CTWP225M.js +372 -656
  810. package/dist/jspdf.node.min-CTWP225M.js.map +1 -1
  811. package/dist/jspdf.plugin.autotable-AAE7PZKA.js +4 -14
  812. package/dist/jspdf.plugin.autotable-AAE7PZKA.js.map +1 -1
  813. package/dist/lib/chart-colors.js +4 -0
  814. package/dist/lib/chart-colors.js.map +1 -0
  815. package/dist/lib/utils.js +3 -7
  816. package/dist/lib/utils.js.map +1 -1
  817. package/dist/styles.css +5542 -0
  818. package/dist/xlsx-PWHBQ6NK.js +206 -366
  819. package/dist/xlsx-PWHBQ6NK.js.map +1 -1
  820. package/package.json +9 -6
  821. package/styles.css +0 -62
@@ -0,0 +1,4505 @@
1
+ import { FilterBuilder, isFilterGroup, isFilterCondition } from './chunk-Y3BOERVB.js';
2
+ import { Table, TableRow, TableHeader, TableHead, TableBody, TableCell, TableFooter } from './chunk-65YSTUD2.js';
3
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuSeparator, ContextMenuItem } from './chunk-4Y72SPNL.js';
4
+ import { SkeletonLoader } from './chunk-QHKOBGLW.js';
5
+ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuItem } from './chunk-FSMHI7DW.js';
6
+ import { useMediaQuery } from './chunk-Y555RCRZ.js';
7
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-WBE6VQOO.js';
8
+ import { Checkbox } from './chunk-XETKCF73.js';
9
+ import { TextInput } from './chunk-PWCMCMDN.js';
10
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-AFCSDND5.js';
11
+ import { Button } from './chunk-ONQCNOLU.js';
12
+ import { Badge } from './chunk-TNROOKX3.js';
13
+ import { cn } from './chunk-HRNDJU7D.js';
14
+ import * as React14 from 'react';
15
+ import { cva } from 'class-variance-authority';
16
+ import { useReactTable, getFacetedUniqueValues, getFacetedRowModel, getExpandedRowModel, getPaginationRowModel, getGroupedRowModel, getFilteredRowModel, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
17
+ import { Star, Check, X, Search, Columns3, GripHorizontal, StretchHorizontal, AlignJustify, Download, FileText, FileSpreadsheet, Printer, ChevronUp, ChevronDown, ChevronRight, GripVertical, Plus, ChevronsLeft, ChevronLeft, ChevronsRight, ArrowUp, ArrowDown, ArrowUpDown, Group, MoreVertical, PinIcon, PinOff, Ruler, RotateCcw, EyeOff, ChevronsUpDown } from 'lucide-react';
18
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
19
+ import { useSensors, useSensor, PointerSensor, DndContext, closestCenter } from '@dnd-kit/core';
20
+ import { arrayMove, SortableContext, horizontalListSortingStrategy, useSortable } from '@dnd-kit/sortable';
21
+ import { CSS } from '@dnd-kit/utilities';
22
+ import { useVirtualizer } from '@tanstack/react-virtual';
23
+
24
+ var dataTableVariants = cva(
25
+ // Base styles (always applied)
26
+ "space-y-4",
27
+ {
28
+ variants: {
29
+ density: {
30
+ compact: "[&_td]:py-[var(--datatable-row-padding-y-compact)] [&_th]:py-[var(--datatable-header-padding-y-compact)]",
31
+ default: "[&_td]:py-[var(--datatable-row-padding-y-default)] [&_th]:py-[var(--datatable-header-padding-y-default)]",
32
+ comfortable: "[&_td]:py-[var(--datatable-row-padding-y-comfortable)] [&_th]:py-[var(--datatable-header-padding-y-comfortable)]"
33
+ }
34
+ },
35
+ defaultVariants: {
36
+ density: "default"
37
+ }
38
+ }
39
+ );
40
+ var dataTableRowVariants = cva(
41
+ // Base styles (always applied)
42
+ "transition-colors",
43
+ {
44
+ variants: {
45
+ state: {
46
+ default: "",
47
+ selected: "bg-[color:var(--datatable-row-bg-selected)]",
48
+ highlighted: "bg-[color:var(--datatable-row-bg-highlighted)]/5"
49
+ },
50
+ interactive: {
51
+ true: "cursor-pointer hover:bg-[color:var(--datatable-row-bg-hover)]/50",
52
+ false: ""
53
+ }
54
+ },
55
+ defaultVariants: {
56
+ state: "default",
57
+ interactive: false
58
+ }
59
+ }
60
+ );
61
+ var dataTableHeaderVariants = cva(
62
+ // Base styles (always applied)
63
+ "text-muted-foreground",
64
+ {
65
+ variants: {
66
+ sortable: {
67
+ true: "cursor-pointer select-none hover:text-foreground",
68
+ false: ""
69
+ },
70
+ sorted: {
71
+ asc: "text-foreground",
72
+ desc: "text-foreground",
73
+ none: ""
74
+ }
75
+ },
76
+ defaultVariants: {
77
+ sortable: false,
78
+ sorted: "none"
79
+ }
80
+ }
81
+ );
82
+ var dataTableResizeHandleVariants = cva(
83
+ // Base styles (always applied)
84
+ [
85
+ "absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none",
86
+ "bg-transparent hover:bg-[color:var(--border-default)]",
87
+ "transition-colors duration-150"
88
+ ],
89
+ {
90
+ variants: {
91
+ isResizing: {
92
+ true: "bg-[color:var(--primary)] w-0.5",
93
+ false: ""
94
+ }
95
+ },
96
+ defaultVariants: {
97
+ isResizing: false
98
+ }
99
+ }
100
+ );
101
+
102
+ // src/components/data-display/DataTable/DataTable.types.ts
103
+ function isEditableColumnMeta(meta) {
104
+ return meta !== null && typeof meta === "object" && "editable" in meta;
105
+ }
106
+ function isSpanColumnMeta(meta) {
107
+ return meta !== null && typeof meta === "object" && ("colSpan" in meta || "rowSpan" in meta);
108
+ }
109
+ function highlightText(text, query) {
110
+ if (!query || !text) return text;
111
+ const escapedQuery = query.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
112
+ const regex = new RegExp(`(${escapedQuery})`, "gi");
113
+ const parts = text.split(regex);
114
+ if (parts.length === 1) return text;
115
+ return parts.map(
116
+ (part, index) => regex.test(part) ? /* @__PURE__ */ jsx("mark", { className: "bg-yellow-200 text-inherit dark:bg-yellow-800", children: part }, `hl-${String(index)}`) : part
117
+ );
118
+ }
119
+ function DataTableCellInner({
120
+ cancelEdit,
121
+ cell,
122
+ cellClassName,
123
+ colIndex,
124
+ colSpan,
125
+ editTrigger,
126
+ editValue,
127
+ editError,
128
+ editingCell,
129
+ enableColumnPinning,
130
+ enableEditing,
131
+ enableKeyboardNavigation,
132
+ enableSearchHighlight,
133
+ focusedCell,
134
+ globalFilter,
135
+ getPinnedAttribute,
136
+ getPinnedStyles,
137
+ handleCellFocus,
138
+ row,
139
+ rowSpan,
140
+ setEditInputRef,
141
+ setEditValue,
142
+ startEdit,
143
+ submitEdit
144
+ }) {
145
+ const rowIndex = row.index;
146
+ const isFocused = enableKeyboardNavigation && focusedCell !== null && focusedCell.row === rowIndex && focusedCell.col === colIndex;
147
+ const isEditing = editingCell !== null && editingCell.rowId === row.id && editingCell.columnId === cell.column.id;
148
+ const meta = isEditableColumnMeta(cell.column.columnDef.meta) ? cell.column.columnDef.meta : void 0;
149
+ const isEditable = enableEditing && meta?.editable;
150
+ const cellValue = cell.getValue();
151
+ const handleEditTrigger = () => {
152
+ if (isEditable) {
153
+ startEdit(row.id, cell.column.id, cellValue, cell.column);
154
+ }
155
+ };
156
+ const renderEditInput = () => {
157
+ const editType = meta?.editType ?? "text";
158
+ const editOptions = meta?.editOptions ?? [];
159
+ const handleKeyDown = (e) => {
160
+ if (e.key === "Enter") {
161
+ e.preventDefault();
162
+ void submitEdit(row, cell.column, cellValue);
163
+ } else if (e.key === "Escape") {
164
+ e.preventDefault();
165
+ cancelEdit(row, cell.column, cellValue);
166
+ }
167
+ };
168
+ if (editType === "select") {
169
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
170
+ /* @__PURE__ */ jsx(
171
+ "select",
172
+ {
173
+ ref: setEditInputRef,
174
+ "aria-label": "Edit cell",
175
+ className: "h-8 w-full rounded-md border border-input bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
176
+ value: String(editValue),
177
+ onBlur: () => {
178
+ void submitEdit(row, cell.column, cellValue);
179
+ },
180
+ onChange: (e) => {
181
+ setEditValue(e.target.value);
182
+ },
183
+ onKeyDown: handleKeyDown,
184
+ children: editOptions.map((option) => /* @__PURE__ */ jsx("option", { value: option, children: option }, option))
185
+ }
186
+ ),
187
+ editError && /* @__PURE__ */ jsx("span", { className: "text-xs text-[color:var(--input-border-error)]", children: editError })
188
+ ] });
189
+ }
190
+ if (editType === "checkbox") {
191
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
192
+ /* @__PURE__ */ jsx(
193
+ "input",
194
+ {
195
+ ref: setEditInputRef,
196
+ "aria-label": "Edit cell",
197
+ checked: Boolean(editValue),
198
+ className: "size-4 rounded border border-input",
199
+ type: "checkbox",
200
+ onChange: (e) => {
201
+ setEditValue(e.target.checked);
202
+ void submitEdit(row, cell.column, cellValue);
203
+ },
204
+ onKeyDown: handleKeyDown
205
+ }
206
+ ),
207
+ editError && /* @__PURE__ */ jsx("span", { className: "text-xs text-[color:var(--input-border-error)]", children: editError })
208
+ ] });
209
+ }
210
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
211
+ /* @__PURE__ */ jsx(
212
+ "input",
213
+ {
214
+ ref: setEditInputRef,
215
+ "aria-label": "Edit cell",
216
+ className: "h-8 w-full rounded-md border border-input bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
217
+ type: editType === "number" ? "number" : editType === "date" ? "date" : "text",
218
+ value: editType === "number" ? editValue : typeof editValue === "string" || typeof editValue === "number" ? String(editValue) : "",
219
+ onBlur: () => {
220
+ void submitEdit(row, cell.column, cellValue);
221
+ },
222
+ onChange: (e) => {
223
+ setEditValue(editType === "number" ? e.target.valueAsNumber : e.target.value);
224
+ },
225
+ onKeyDown: handleKeyDown
226
+ }
227
+ ),
228
+ editError && /* @__PURE__ */ jsx("span", { className: "text-xs text-[color:var(--input-border-error)]", children: editError })
229
+ ] });
230
+ };
231
+ return /* @__PURE__ */ jsx(
232
+ TableCell,
233
+ {
234
+ className: cn(
235
+ enableColumnPinning && cell.column.getIsPinned() && "sticky",
236
+ isEditable && "cursor-pointer",
237
+ cellClassName?.(cell.column.id, row)
238
+ ),
239
+ colSpan,
240
+ "data-col": enableKeyboardNavigation ? colIndex : void 0,
241
+ "data-column-id": cell.column.id,
242
+ "data-pinned": getPinnedAttribute(cell.column),
243
+ "data-row": enableKeyboardNavigation ? rowIndex : void 0,
244
+ role: enableKeyboardNavigation ? "gridcell" : void 0,
245
+ rowSpan,
246
+ style: getPinnedStyles(cell.column),
247
+ tabIndex: enableKeyboardNavigation ? isFocused ? 0 : -1 : void 0,
248
+ onClick: editTrigger === "click" && isEditable && !isEditing ? (e) => {
249
+ e.stopPropagation();
250
+ handleEditTrigger();
251
+ } : void 0,
252
+ onDoubleClick: editTrigger === "dblclick" && isEditable && !isEditing ? (e) => {
253
+ e.stopPropagation();
254
+ handleEditTrigger();
255
+ } : void 0,
256
+ onFocus: enableKeyboardNavigation ? () => {
257
+ handleCellFocus(rowIndex, colIndex);
258
+ } : void 0,
259
+ children: isEditing ? renderEditInput() : enableSearchHighlight && globalFilter && !cell.column.columnDef.cell && (typeof cellValue === "string" || typeof cellValue === "number") ? highlightText(String(cellValue), globalFilter) : flexRender(cell.column.columnDef.cell, cell.getContext())
260
+ },
261
+ cell.id
262
+ );
263
+ }
264
+ var DataTableCell = DataTableCellInner;
265
+ function DataTableBodyInner({
266
+ cancelEdit,
267
+ cellClassName,
268
+ columnVirtualizer,
269
+ contextMenuItems,
270
+ dragHandleProps,
271
+ editTrigger,
272
+ editValue,
273
+ editError,
274
+ editingCell,
275
+ enableColumnPinning,
276
+ enableEditing,
277
+ enableGrouping,
278
+ enableKeyboardNavigation,
279
+ enableRowAnimation,
280
+ enableRowColumnSpanning,
281
+ enableRowReordering,
282
+ enableSearchHighlight,
283
+ enableStriping,
284
+ enableVirtualization,
285
+ containerRef,
286
+ focusedCell,
287
+ globalFilter,
288
+ getPinnedAttribute,
289
+ getPinnedStyles,
290
+ handleCellFocus,
291
+ hasFooter,
292
+ onRowClick,
293
+ renderSubComponent,
294
+ rowClassName,
295
+ rowVirtualizer,
296
+ setEditInputRef,
297
+ setEditValue,
298
+ startEdit,
299
+ submitEdit,
300
+ table,
301
+ tableColumns
302
+ }) {
303
+ const rows = table.getRowModel().rows;
304
+ const virtualItems = rowVirtualizer?.getVirtualItems();
305
+ const isVirtual = enableVirtualization && rowVirtualizer && virtualItems;
306
+ const ROW_ANIMATION_DURATION = 300;
307
+ const rowPositionsRef = React14.useRef(/* @__PURE__ */ new Map());
308
+ const isFirstRenderRef = React14.useRef(true);
309
+ React14.useLayoutEffect(() => {
310
+ if (!enableRowAnimation) return;
311
+ const container = containerRef?.current;
312
+ const tbody = container ? container.querySelector("tbody") : document.querySelector('[data-slot="data-table"] tbody');
313
+ if (!tbody) return;
314
+ const trs = tbody.querySelectorAll("tr[data-row-id]");
315
+ if (isFirstRenderRef.current) {
316
+ isFirstRenderRef.current = false;
317
+ for (const tr of trs) {
318
+ const rowId = tr.dataset["rowId"];
319
+ if (rowId) rowPositionsRef.current.set(rowId, tr.getBoundingClientRect().top);
320
+ }
321
+ return;
322
+ }
323
+ const cleanupFns = [];
324
+ for (const tr of trs) {
325
+ const rowId = tr.dataset["rowId"];
326
+ if (!rowId) continue;
327
+ const previousTop = rowPositionsRef.current.get(rowId);
328
+ if (previousTop === void 0) continue;
329
+ const currentTop = tr.getBoundingClientRect().top;
330
+ const delta = previousTop - currentTop;
331
+ if (Math.abs(delta) < 1) continue;
332
+ tr.style.transform = `translateY(${String(delta)}px)`;
333
+ tr.style.transition = "none";
334
+ tr.offsetHeight;
335
+ tr.style.transition = `transform ${String(ROW_ANIMATION_DURATION)}ms ease-out`;
336
+ tr.style.transform = "";
337
+ const onEnd = () => {
338
+ tr.style.transition = "";
339
+ tr.style.transform = "";
340
+ tr.removeEventListener("transitionend", onEnd);
341
+ };
342
+ tr.addEventListener("transitionend", onEnd);
343
+ cleanupFns.push(() => {
344
+ tr.removeEventListener("transitionend", onEnd);
345
+ });
346
+ }
347
+ const newPositions = /* @__PURE__ */ new Map();
348
+ for (const tr of trs) {
349
+ const rowId = tr.dataset["rowId"];
350
+ if (rowId) newPositions.set(rowId, tr.getBoundingClientRect().top);
351
+ }
352
+ rowPositionsRef.current = newPositions;
353
+ return () => {
354
+ for (const fn of cleanupFns) fn();
355
+ };
356
+ }, [rows, enableRowAnimation, containerRef]);
357
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
358
+ /* @__PURE__ */ jsx(
359
+ TableBody,
360
+ {
361
+ style: isVirtual ? {
362
+ height: `${String(rowVirtualizer.getTotalSize())}px`,
363
+ position: "relative"
364
+ } : void 0,
365
+ children: rows.length ? (
366
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- row rendering with grouping, virtualization, and context menu
367
+ (isVirtual ? virtualItems : rows).map((itemOrRow) => {
368
+ const row = isVirtual ? rows[itemOrRow.index] : itemOrRow;
369
+ const virtualRow = isVirtual ? itemOrRow : null;
370
+ const virtualRowStyle = virtualRow ? {
371
+ position: "absolute",
372
+ top: 0,
373
+ left: 0,
374
+ width: "100%",
375
+ height: `${String(virtualRow.size)}px`,
376
+ transform: `translateY(${String(virtualRow.start)}px)`
377
+ } : void 0;
378
+ if (enableGrouping && row.getIsGrouped()) {
379
+ return /* @__PURE__ */ jsxs(React14.Fragment, { children: [
380
+ /* @__PURE__ */ jsx(
381
+ TableRow,
382
+ {
383
+ ref: virtualRow && rowVirtualizer ? rowVirtualizer.measureElement : void 0,
384
+ className: cn(
385
+ "bg-muted/30 font-medium",
386
+ typeof rowClassName === "function" ? rowClassName(row) : rowClassName
387
+ ),
388
+ "data-index": virtualRow?.index,
389
+ style: virtualRowStyle,
390
+ children: row.getVisibleCells().map((cell) => {
391
+ const isGroupedCell = cell.getIsGrouped();
392
+ const isAggregated = cell.getIsAggregated();
393
+ const isPlaceholder = cell.getIsPlaceholder();
394
+ return /* @__PURE__ */ jsx(
395
+ TableCell,
396
+ {
397
+ className: cn(
398
+ enableColumnPinning && cell.column.getIsPinned() && "sticky",
399
+ cellClassName?.(cell.column.id, row)
400
+ ),
401
+ "data-column-id": cell.column.id,
402
+ "data-pinned": getPinnedAttribute(cell.column),
403
+ style: getPinnedStyles(cell.column),
404
+ children: isGroupedCell ? /* @__PURE__ */ jsxs(
405
+ "button",
406
+ {
407
+ className: "flex items-center gap-1.5 text-left",
408
+ type: "button",
409
+ onClick: (e) => {
410
+ e.stopPropagation();
411
+ row.toggleExpanded();
412
+ },
413
+ children: [
414
+ row.getIsExpanded() ? /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 shrink-0" }),
415
+ /* @__PURE__ */ jsx("span", { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }),
416
+ /* @__PURE__ */ jsxs("span", { className: "ml-1 text-xs text-muted-foreground", children: [
417
+ "(",
418
+ row.subRows.length,
419
+ ")"
420
+ ] })
421
+ ]
422
+ }
423
+ ) : isAggregated ? flexRender(
424
+ cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell,
425
+ cell.getContext()
426
+ ) : isPlaceholder ? null : flexRender(cell.column.columnDef.cell, cell.getContext())
427
+ },
428
+ cell.id
429
+ );
430
+ })
431
+ }
432
+ ),
433
+ row.getIsExpanded() && row.subRows.map((subRow) => {
434
+ const subTableRow = /* @__PURE__ */ jsx(
435
+ TableRow,
436
+ {
437
+ className: cn(
438
+ dataTableRowVariants({
439
+ state: subRow.getIsSelected() ? "selected" : "default",
440
+ interactive: !!onRowClick
441
+ }),
442
+ enableStriping && subRow.index % 2 === 1 && "bg-muted/50",
443
+ typeof rowClassName === "function" ? rowClassName(subRow) : rowClassName
444
+ ),
445
+ "data-state": subRow.getIsSelected() ? "selected" : void 0,
446
+ onClick: onRowClick ? () => {
447
+ onRowClick(subRow.original);
448
+ } : void 0,
449
+ children: subRow.getVisibleCells().map((cell, colIndex) => /* @__PURE__ */ jsx(
450
+ DataTableCell,
451
+ {
452
+ cancelEdit,
453
+ cell,
454
+ cellClassName,
455
+ colIndex,
456
+ editError,
457
+ editingCell,
458
+ editTrigger,
459
+ editValue,
460
+ enableColumnPinning,
461
+ enableEditing,
462
+ enableKeyboardNavigation,
463
+ enableSearchHighlight,
464
+ focusedCell,
465
+ getPinnedAttribute,
466
+ getPinnedStyles,
467
+ globalFilter,
468
+ handleCellFocus,
469
+ row: subRow,
470
+ setEditInputRef,
471
+ setEditValue,
472
+ startEdit,
473
+ submitEdit
474
+ },
475
+ cell.id
476
+ ))
477
+ },
478
+ subRow.id
479
+ );
480
+ return /* @__PURE__ */ jsx(React14.Fragment, { children: contextMenuItems && contextMenuItems.length > 0 ? /* @__PURE__ */ jsxs(ContextMenu, { children: [
481
+ /* @__PURE__ */ jsx(ContextMenuTrigger, { asChild: true, children: subTableRow }),
482
+ /* @__PURE__ */ jsx(ContextMenuContent, { className: "w-48", children: contextMenuItems.map((item) => /* @__PURE__ */ jsxs(React14.Fragment, { children: [
483
+ item.separator && /* @__PURE__ */ jsx(ContextMenuSeparator, {}),
484
+ /* @__PURE__ */ jsxs(
485
+ ContextMenuItem,
486
+ {
487
+ className: item.variant === "destructive" ? "text-destructive" : void 0,
488
+ onClick: () => {
489
+ item.onClick(subRow.original);
490
+ },
491
+ children: [
492
+ item.icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: item.icon }),
493
+ item.label
494
+ ]
495
+ }
496
+ )
497
+ ] }, item.label)) })
498
+ ] }) : subTableRow }, subRow.id);
499
+ })
500
+ ] }, virtualRow ? virtualRow.key : row.id);
501
+ }
502
+ const tableRow = /* @__PURE__ */ jsxs(
503
+ TableRow,
504
+ {
505
+ ref: virtualRow && rowVirtualizer ? rowVirtualizer.measureElement : void 0,
506
+ className: cn(
507
+ dataTableRowVariants({
508
+ state: row.getIsSelected() ? "selected" : "default",
509
+ interactive: !!onRowClick
510
+ }),
511
+ enableStriping && row.index % 2 === 1 && "bg-muted/50",
512
+ typeof rowClassName === "function" ? rowClassName(row) : rowClassName,
513
+ enableRowReordering && "group/row"
514
+ ),
515
+ "data-index": virtualRow?.index,
516
+ "data-row-id": enableRowAnimation ? row.id : void 0,
517
+ "data-state": row.getIsSelected() ? "selected" : void 0,
518
+ style: virtualRowStyle,
519
+ onClick: onRowClick ? () => {
520
+ onRowClick(row.original);
521
+ } : void 0,
522
+ ...enableRowReordering ? dragHandleProps?.(row.index) : void 0,
523
+ children: [
524
+ enableRowReordering && /* @__PURE__ */ jsx(TableCell, { className: "w-8 px-1", children: /* @__PURE__ */ jsx(GripVertical, { className: "text-muted-foreground size-4 cursor-grab opacity-0 transition-opacity group-hover/row:opacity-100" }) }),
525
+ (() => {
526
+ const visibleCells = row.getVisibleCells();
527
+ const virtualColItems = columnVirtualizer?.getVirtualItems();
528
+ const cellItems = virtualColItems ? virtualColItems.filter((virtualCol) => visibleCells[virtualCol.index] != null).map((virtualCol) => ({
529
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- filtered above
530
+ cell: visibleCells[virtualCol.index],
531
+ colIndex: virtualCol.index
532
+ })) : visibleCells.map((cell, index) => ({ cell, colIndex: index }));
533
+ return cellItems.map(({ cell, colIndex }) => {
534
+ let colSpan;
535
+ let rowSpan;
536
+ if (enableRowColumnSpanning) {
537
+ const spanMeta = isSpanColumnMeta(cell.column.columnDef.meta) ? cell.column.columnDef.meta : void 0;
538
+ if (spanMeta) {
539
+ colSpan = spanMeta.colSpan?.(row);
540
+ rowSpan = spanMeta.rowSpan?.(row);
541
+ if (colSpan === 0 || rowSpan === 0) return null;
542
+ }
543
+ }
544
+ return /* @__PURE__ */ jsx(
545
+ DataTableCell,
546
+ {
547
+ cancelEdit,
548
+ cell,
549
+ cellClassName,
550
+ colIndex,
551
+ colSpan,
552
+ editError,
553
+ editingCell,
554
+ editTrigger,
555
+ editValue,
556
+ enableColumnPinning,
557
+ enableEditing,
558
+ enableKeyboardNavigation,
559
+ enableSearchHighlight,
560
+ focusedCell,
561
+ getPinnedAttribute,
562
+ getPinnedStyles,
563
+ globalFilter,
564
+ handleCellFocus,
565
+ row,
566
+ rowSpan,
567
+ setEditInputRef,
568
+ setEditValue,
569
+ startEdit,
570
+ submitEdit
571
+ },
572
+ cell.id
573
+ );
574
+ });
575
+ })()
576
+ ]
577
+ }
578
+ );
579
+ return /* @__PURE__ */ jsxs(React14.Fragment, { children: [
580
+ contextMenuItems && contextMenuItems.length > 0 ? /* @__PURE__ */ jsxs(ContextMenu, { children: [
581
+ /* @__PURE__ */ jsx(ContextMenuTrigger, { asChild: true, children: tableRow }),
582
+ /* @__PURE__ */ jsx(ContextMenuContent, { className: "w-48", children: contextMenuItems.map((item) => /* @__PURE__ */ jsxs(React14.Fragment, { children: [
583
+ item.separator && /* @__PURE__ */ jsx(ContextMenuSeparator, {}),
584
+ /* @__PURE__ */ jsxs(
585
+ ContextMenuItem,
586
+ {
587
+ className: item.variant === "destructive" ? "text-destructive" : void 0,
588
+ onClick: () => {
589
+ item.onClick(row.original);
590
+ },
591
+ children: [
592
+ item.icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: item.icon }),
593
+ item.label
594
+ ]
595
+ }
596
+ )
597
+ ] }, item.label)) })
598
+ ] }) : tableRow,
599
+ row.getIsExpanded() && renderSubComponent && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: row.getVisibleCells().length, children: renderSubComponent({ row }) }) })
600
+ ] }, virtualRow ? virtualRow.key : row.id);
601
+ })
602
+ ) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(
603
+ TableCell,
604
+ {
605
+ className: "h-24 text-center",
606
+ colSpan: tableColumns.length,
607
+ children: "No results."
608
+ }
609
+ ) })
610
+ }
611
+ ),
612
+ hasFooter && /* @__PURE__ */ jsx(TableFooter, { children: table.getFooterGroups().map((footerGroup) => /* @__PURE__ */ jsx(TableRow, { children: footerGroup.headers.map((header) => /* @__PURE__ */ jsx(TableCell, { children: header.isPlaceholder ? null : flexRender(
613
+ header.column.columnDef.footer,
614
+ header.getContext()
615
+ ) }, header.id)) }, footerGroup.id)) })
616
+ ] });
617
+ }
618
+ var DataTableBody = DataTableBodyInner;
619
+ function DataTableBulkActionsInner({
620
+ actions,
621
+ table
622
+ }) {
623
+ const selectedRows = table.getFilteredSelectedRowModel().flatRows;
624
+ if (selectedRows.length === 0) return null;
625
+ const selectedData = selectedRows.map((row) => row.original);
626
+ return /* @__PURE__ */ jsxs(
627
+ "div",
628
+ {
629
+ className: "flex items-center gap-2 rounded-lg border bg-muted/50 px-4 py-2",
630
+ "data-slot": "data-table-bulk-actions",
631
+ children: [
632
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium", children: [
633
+ selectedRows.length,
634
+ " selected"
635
+ ] }),
636
+ /* @__PURE__ */ jsx("div", { className: "ml-2 flex items-center gap-2", children: actions.map((action) => /* @__PURE__ */ jsxs(
637
+ Button,
638
+ {
639
+ size: "sm",
640
+ variant: action.variant ?? "outline",
641
+ onClick: () => {
642
+ action.onClick(selectedData);
643
+ },
644
+ children: [
645
+ action.icon,
646
+ action.label
647
+ ]
648
+ },
649
+ action.label
650
+ )) })
651
+ ]
652
+ }
653
+ );
654
+ }
655
+ var DataTableBulkActions = DataTableBulkActionsInner;
656
+ var UTILITY_COLUMN_IDS = /* @__PURE__ */ new Set(["select", "_row_number"]);
657
+ function DataTableCardViewInner({
658
+ onRowClick,
659
+ rowClassName,
660
+ table
661
+ }) {
662
+ const rows = table.getRowModel().rows;
663
+ if (rows.length === 0) {
664
+ return /* @__PURE__ */ jsx(
665
+ "div",
666
+ {
667
+ className: "flex flex-col items-center justify-center py-12 text-center",
668
+ "data-slot": "data-table-card-view-empty",
669
+ children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: "No results." })
670
+ }
671
+ );
672
+ }
673
+ return /* @__PURE__ */ jsx("div", { className: "space-y-3", "data-slot": "data-table-card-view", children: rows.map((row) => {
674
+ const visibleCells = row.getVisibleCells().filter(
675
+ (cell) => !UTILITY_COLUMN_IDS.has(cell.column.id)
676
+ );
677
+ return /* @__PURE__ */ jsx(
678
+ "div",
679
+ {
680
+ className: cn(
681
+ "rounded-lg border p-4",
682
+ "bg-[color:var(--surface-default)]",
683
+ onRowClick && "cursor-pointer hover:bg-[color:var(--surface-hover)]",
684
+ typeof rowClassName === "function" ? rowClassName(row) : rowClassName
685
+ ),
686
+ role: onRowClick ? "button" : void 0,
687
+ tabIndex: onRowClick ? 0 : void 0,
688
+ onClick: onRowClick ? () => {
689
+ onRowClick(row.original);
690
+ } : void 0,
691
+ onKeyDown: onRowClick ? (e) => {
692
+ if (e.key === "Enter" || e.key === " ") {
693
+ e.preventDefault();
694
+ onRowClick(row.original);
695
+ }
696
+ } : void 0,
697
+ children: /* @__PURE__ */ jsx("div", { className: "space-y-2", children: visibleCells.map((cell) => {
698
+ const headerDef = cell.column.columnDef.header;
699
+ const label = typeof headerDef === "string" ? headerDef : cell.column.id;
700
+ return /* @__PURE__ */ jsxs(
701
+ "div",
702
+ {
703
+ className: "flex items-start justify-between gap-4",
704
+ "data-column-id": cell.column.id,
705
+ children: [
706
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-sm font-medium shrink-0", children: label }),
707
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-right", children: flexRender(cell.column.columnDef.cell, cell.getContext()) })
708
+ ]
709
+ },
710
+ cell.id
711
+ );
712
+ }) })
713
+ },
714
+ row.id
715
+ );
716
+ }) });
717
+ }
718
+ var DataTableCardView = DataTableCardViewInner;
719
+ var SKELETON_KEYS = ["skeleton-row-1", "skeleton-row-2", "skeleton-row-3", "skeleton-row-4", "skeleton-row-5"];
720
+ function DataTableEmptyState({
721
+ className,
722
+ emptyState,
723
+ error,
724
+ errorState,
725
+ loading,
726
+ loadingComponent
727
+ }) {
728
+ if (loading) {
729
+ return /* @__PURE__ */ jsx("div", { className: cn("space-y-4", className), "data-slot": "data-table", children: loadingComponent ?? /* @__PURE__ */ jsx("div", { className: "space-y-2", "data-slot": "data-table-loading", children: SKELETON_KEYS.map((key) => /* @__PURE__ */ jsx(SkeletonLoader, { className: "h-12 w-full" }, key)) }) });
730
+ }
731
+ if (error) {
732
+ return /* @__PURE__ */ jsx("div", { className: cn("space-y-4", className), "data-slot": "data-table", children: errorState ?? /* @__PURE__ */ jsx(
733
+ "div",
734
+ {
735
+ className: "flex flex-col items-center justify-center py-12 text-center",
736
+ "data-slot": "data-table-error",
737
+ children: /* @__PURE__ */ jsx("p", { className: "text-destructive text-sm", children: "An error occurred while loading data" })
738
+ }
739
+ ) });
740
+ }
741
+ return /* @__PURE__ */ jsx("div", { className: cn("space-y-4", className), "data-slot": "data-table", children: emptyState ?? /* @__PURE__ */ jsx(
742
+ "div",
743
+ {
744
+ className: "flex flex-col items-center justify-center py-12 text-center",
745
+ "data-slot": "data-table-empty",
746
+ children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: "No data available" })
747
+ }
748
+ ) });
749
+ }
750
+ function getCellSelector(row, col) {
751
+ return '[data-row="' + String(row) + '"][data-col="' + String(col) + '"]';
752
+ }
753
+ function DataTableFillHandle({
754
+ onFill,
755
+ position,
756
+ tableRef
757
+ }) {
758
+ const isDraggingRef = React14.useRef(false);
759
+ const dragStartRef = React14.useRef(null);
760
+ const currentTargetRef = React14.useRef(null);
761
+ const getCellElement = React14.useCallback(
762
+ (row, col) => {
763
+ if (!tableRef.current) return null;
764
+ return tableRef.current.querySelector(getCellSelector(row, col));
765
+ },
766
+ [tableRef]
767
+ );
768
+ const clearFillTargets = React14.useCallback(() => {
769
+ if (!tableRef.current) return;
770
+ const targeted = tableRef.current.querySelectorAll(
771
+ "[data-fill-target='true']"
772
+ );
773
+ for (const el of targeted) {
774
+ el.removeAttribute("data-fill-target");
775
+ }
776
+ }, [tableRef]);
777
+ const markFillTargets = React14.useCallback(
778
+ (source, target) => {
779
+ clearFillTargets();
780
+ const rowDiff = target.row - source.row;
781
+ const colDiff = target.col - source.col;
782
+ if (Math.abs(rowDiff) >= Math.abs(colDiff)) {
783
+ const startRow = Math.min(source.row + 1, target.row);
784
+ const endRow = Math.max(source.row + 1, target.row);
785
+ for (let r = startRow; r <= endRow; r++) {
786
+ const cell = getCellElement(r, source.col);
787
+ if (cell) {
788
+ cell.setAttribute("data-fill-target", "true");
789
+ }
790
+ }
791
+ } else {
792
+ const startCol = Math.min(source.col + 1, target.col);
793
+ const endCol = Math.max(source.col + 1, target.col);
794
+ for (let c = startCol; c <= endCol; c++) {
795
+ const cell = getCellElement(source.row, c);
796
+ if (cell) {
797
+ cell.setAttribute("data-fill-target", "true");
798
+ }
799
+ }
800
+ }
801
+ },
802
+ [clearFillTargets, getCellElement]
803
+ );
804
+ const handleMouseUp = React14.useCallback(() => {
805
+ if (!isDraggingRef.current || !dragStartRef.current || !currentTargetRef.current) {
806
+ isDraggingRef.current = false;
807
+ clearFillTargets();
808
+ return;
809
+ }
810
+ const source = dragStartRef.current;
811
+ const target = currentTargetRef.current;
812
+ const rowDiff = target.row - source.row;
813
+ const colDiff = target.col - source.col;
814
+ if (rowDiff !== 0 || colDiff !== 0) {
815
+ if (Math.abs(rowDiff) >= Math.abs(colDiff)) {
816
+ const startRow = Math.min(source.row + 1, target.row);
817
+ const endRow = Math.max(source.row + 1, target.row);
818
+ onFill({
819
+ direction: "down",
820
+ sourceCell: { col: source.col, row: source.row },
821
+ targetRange: {
822
+ endCol: source.col,
823
+ endRow,
824
+ startCol: source.col,
825
+ startRow
826
+ }
827
+ });
828
+ } else {
829
+ const startCol = Math.min(source.col + 1, target.col);
830
+ const endCol = Math.max(source.col + 1, target.col);
831
+ onFill({
832
+ direction: "right",
833
+ sourceCell: { col: source.col, row: source.row },
834
+ targetRange: {
835
+ endCol,
836
+ endRow: source.row,
837
+ startCol,
838
+ startRow: source.row
839
+ }
840
+ });
841
+ }
842
+ }
843
+ isDraggingRef.current = false;
844
+ dragStartRef.current = null;
845
+ currentTargetRef.current = null;
846
+ clearFillTargets();
847
+ }, [clearFillTargets, onFill]);
848
+ const handleMouseMove = React14.useCallback(
849
+ (e) => {
850
+ if (!isDraggingRef.current || !dragStartRef.current || !tableRef.current) return;
851
+ const target = document.elementFromPoint(e.clientX, e.clientY);
852
+ if (!target) return;
853
+ const cell = target.closest("[data-row][data-col]");
854
+ if (!cell) return;
855
+ const row = Number(cell.dataset["row"]);
856
+ const col = Number(cell.dataset["col"]);
857
+ if (Number.isNaN(row) || Number.isNaN(col)) return;
858
+ currentTargetRef.current = { col, row };
859
+ markFillTargets(dragStartRef.current, { col, row });
860
+ },
861
+ [markFillTargets, tableRef]
862
+ );
863
+ const handleMouseDown = React14.useCallback(
864
+ (e) => {
865
+ if (!position) return;
866
+ e.preventDefault();
867
+ e.stopPropagation();
868
+ isDraggingRef.current = true;
869
+ dragStartRef.current = { col: position.col, row: position.row };
870
+ currentTargetRef.current = { col: position.col, row: position.row };
871
+ },
872
+ [position]
873
+ );
874
+ React14.useEffect(() => {
875
+ document.addEventListener("mousemove", handleMouseMove);
876
+ document.addEventListener("mouseup", handleMouseUp);
877
+ return () => {
878
+ document.removeEventListener("mousemove", handleMouseMove);
879
+ document.removeEventListener("mouseup", handleMouseUp);
880
+ };
881
+ }, [handleMouseMove, handleMouseUp]);
882
+ const [handleStyle, setHandleStyle] = React14.useState({});
883
+ React14.useEffect(() => {
884
+ if (!position) {
885
+ setHandleStyle({});
886
+ return;
887
+ }
888
+ const table = tableRef.current;
889
+ if (!table) {
890
+ setHandleStyle({});
891
+ return;
892
+ }
893
+ const cell = table.querySelector(
894
+ getCellSelector(position.row, position.col)
895
+ );
896
+ if (!cell) {
897
+ setHandleStyle({});
898
+ return;
899
+ }
900
+ const tableRect = table.getBoundingClientRect();
901
+ const cellRect = cell.getBoundingClientRect();
902
+ setHandleStyle({
903
+ left: cellRect.right - tableRect.left - 3,
904
+ top: cellRect.bottom - tableRect.top - 3
905
+ });
906
+ }, [position, tableRef]);
907
+ if (!position) return null;
908
+ return /* @__PURE__ */ jsx(
909
+ "div",
910
+ {
911
+ className: cn(
912
+ "absolute z-10 size-1.5 cursor-crosshair rounded-sm bg-primary"
913
+ ),
914
+ "data-slot": "data-table-fill-handle",
915
+ role: "presentation",
916
+ style: handleStyle,
917
+ onMouseDown: handleMouseDown
918
+ }
919
+ );
920
+ }
921
+ function DataTableFilterChipsInner({
922
+ table
923
+ }) {
924
+ const columnFilters = table.getState().columnFilters;
925
+ const globalFilter = table.getState().globalFilter;
926
+ const hasFilters = columnFilters.length > 0 || globalFilter && globalFilter.length > 0;
927
+ if (!hasFilters) return null;
928
+ return /* @__PURE__ */ jsxs(
929
+ "div",
930
+ {
931
+ className: "flex flex-wrap items-center gap-2",
932
+ "data-slot": "data-table-filter-chips",
933
+ children: [
934
+ globalFilter && globalFilter.length > 0 && /* @__PURE__ */ jsxs(Badge, { className: "gap-1 pr-1", color: "muted", type: "pill-color", children: [
935
+ "Search: ",
936
+ globalFilter,
937
+ /* @__PURE__ */ jsx(
938
+ "button",
939
+ {
940
+ "aria-label": "Clear search filter",
941
+ className: "ml-1 rounded-full p-0.5 hover:bg-muted",
942
+ type: "button",
943
+ onClick: () => {
944
+ table.setGlobalFilter("");
945
+ },
946
+ children: /* @__PURE__ */ jsx(X, { className: "size-3" })
947
+ }
948
+ )
949
+ ] }),
950
+ columnFilters.map((filter) => {
951
+ const column = table.getColumn(filter.id);
952
+ const headerLabel = column && typeof column.columnDef.header === "string" ? column.columnDef.header : filter.id;
953
+ return /* @__PURE__ */ jsxs(Badge, { className: "gap-1 pr-1", color: "muted", type: "pill-color", children: [
954
+ headerLabel,
955
+ ": ",
956
+ String(filter.value),
957
+ /* @__PURE__ */ jsx(
958
+ "button",
959
+ {
960
+ "aria-label": `Clear ${headerLabel} filter`,
961
+ className: "ml-1 rounded-full p-0.5 hover:bg-muted",
962
+ type: "button",
963
+ onClick: () => {
964
+ column?.setFilterValue(void 0);
965
+ },
966
+ children: /* @__PURE__ */ jsx(X, { className: "size-3" })
967
+ }
968
+ )
969
+ ] }, filter.id);
970
+ }),
971
+ columnFilters.length + (globalFilter ? 1 : 0) >= 2 && /* @__PURE__ */ jsx(
972
+ Button,
973
+ {
974
+ className: "h-6 px-2 text-xs",
975
+ size: "sm",
976
+ variant: "ghost",
977
+ onClick: () => {
978
+ table.resetColumnFilters();
979
+ table.setGlobalFilter("");
980
+ },
981
+ children: "Clear all"
982
+ }
983
+ )
984
+ ]
985
+ }
986
+ );
987
+ }
988
+ var DataTableFilterChips = DataTableFilterChipsInner;
989
+ var FIND_MATCH_ATTR = "data-find-match";
990
+ var FIND_CURRENT_ATTR = "data-find-current";
991
+ function getCellTextContent(cell) {
992
+ const text = cell.textContent;
993
+ if (typeof text === "string") {
994
+ return text.toLowerCase();
995
+ }
996
+ return "";
997
+ }
998
+ function findMatchesInTable(tableEl, normalizedQuery) {
999
+ const result = [];
1000
+ const rows = tableEl.querySelectorAll("tbody tr");
1001
+ rows.forEach((row, rowIndex) => {
1002
+ const cells = row.querySelectorAll("td");
1003
+ cells.forEach((cell) => {
1004
+ if (cell instanceof HTMLTableCellElement) {
1005
+ const text = getCellTextContent(cell);
1006
+ if (text.includes(normalizedQuery)) {
1007
+ result.push({ cell, rowIndex });
1008
+ }
1009
+ }
1010
+ });
1011
+ });
1012
+ return result;
1013
+ }
1014
+ function DataTableFindBar({ onClose, open, tableRef }) {
1015
+ const [currentIndex, setCurrentIndex] = React14.useState(0);
1016
+ const [matches, setMatches] = React14.useState([]);
1017
+ const [query, setQuery] = React14.useState("");
1018
+ const inputRef = React14.useRef(null);
1019
+ React14.useEffect(() => {
1020
+ if (!open) {
1021
+ setQuery("");
1022
+ setCurrentIndex(0);
1023
+ setMatches([]);
1024
+ return;
1025
+ }
1026
+ const timer = setTimeout(() => {
1027
+ inputRef.current?.focus();
1028
+ }, 0);
1029
+ return () => {
1030
+ clearTimeout(timer);
1031
+ };
1032
+ }, [open]);
1033
+ React14.useEffect(() => {
1034
+ const table = tableRef.current;
1035
+ if (!table || !query.trim()) {
1036
+ setMatches([]);
1037
+ return;
1038
+ }
1039
+ const normalizedQuery = query.trim().toLowerCase();
1040
+ const found = findMatchesInTable(table, normalizedQuery);
1041
+ setMatches(found);
1042
+ }, [query, tableRef]);
1043
+ const safeIndex = matches.length > 0 ? Math.min(currentIndex, matches.length - 1) : 0;
1044
+ React14.useEffect(() => {
1045
+ const table = tableRef.current;
1046
+ if (!table) return;
1047
+ const previousMatches = table.querySelectorAll(`[${FIND_MATCH_ATTR}]`);
1048
+ previousMatches.forEach((el) => {
1049
+ el.removeAttribute(FIND_MATCH_ATTR);
1050
+ el.removeAttribute(FIND_CURRENT_ATTR);
1051
+ });
1052
+ matches.forEach((match, index) => {
1053
+ match.cell.setAttribute(FIND_MATCH_ATTR, "true");
1054
+ if (index === safeIndex) {
1055
+ match.cell.setAttribute(FIND_CURRENT_ATTR, "true");
1056
+ }
1057
+ });
1058
+ const currentMatch = matches[safeIndex];
1059
+ if (currentMatch) {
1060
+ currentMatch.cell.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
1061
+ }
1062
+ }, [matches, safeIndex, tableRef]);
1063
+ React14.useEffect(() => {
1064
+ if (open) return;
1065
+ const table = tableRef.current;
1066
+ if (!table) return;
1067
+ const marked = table.querySelectorAll(`[${FIND_MATCH_ATTR}]`);
1068
+ marked.forEach((el) => {
1069
+ el.removeAttribute(FIND_MATCH_ATTR);
1070
+ el.removeAttribute(FIND_CURRENT_ATTR);
1071
+ });
1072
+ }, [open, tableRef]);
1073
+ const handlePrev = React14.useCallback(() => {
1074
+ if (matches.length === 0) return;
1075
+ setCurrentIndex(
1076
+ (prev) => prev <= 0 ? matches.length - 1 : prev - 1
1077
+ );
1078
+ }, [matches.length]);
1079
+ const handleNext = React14.useCallback(() => {
1080
+ if (matches.length === 0) return;
1081
+ setCurrentIndex(
1082
+ (prev) => prev >= matches.length - 1 ? 0 : prev + 1
1083
+ );
1084
+ }, [matches.length]);
1085
+ const handleClose = React14.useCallback(() => {
1086
+ setQuery("");
1087
+ setCurrentIndex(0);
1088
+ setMatches([]);
1089
+ onClose();
1090
+ }, [onClose]);
1091
+ const handleKeyDown = React14.useCallback(
1092
+ (e) => {
1093
+ if (e.key === "Escape") {
1094
+ e.preventDefault();
1095
+ handleClose();
1096
+ } else if (e.key === "Enter") {
1097
+ e.preventDefault();
1098
+ if (e.shiftKey) {
1099
+ handlePrev();
1100
+ } else {
1101
+ handleNext();
1102
+ }
1103
+ }
1104
+ },
1105
+ [handleClose, handleNext, handlePrev]
1106
+ );
1107
+ if (!open) {
1108
+ return null;
1109
+ }
1110
+ const displayIndex = matches.length > 0 ? safeIndex + 1 : 0;
1111
+ return /* @__PURE__ */ jsxs(
1112
+ "div",
1113
+ {
1114
+ className: cn(
1115
+ "flex items-center gap-2 border-b px-4 py-2",
1116
+ "bg-background text-foreground"
1117
+ ),
1118
+ "data-slot": "data-table-find-bar",
1119
+ children: [
1120
+ /* @__PURE__ */ jsx(
1121
+ "input",
1122
+ {
1123
+ ref: inputRef,
1124
+ className: cn(
1125
+ "h-8 flex-1 rounded-md border bg-transparent px-3 text-sm",
1126
+ "placeholder:text-muted-foreground",
1127
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1128
+ ),
1129
+ "aria-label": "Find in table",
1130
+ placeholder: "Find in table...",
1131
+ type: "text",
1132
+ value: query,
1133
+ onChange: (e) => {
1134
+ setQuery(e.target.value);
1135
+ setCurrentIndex(0);
1136
+ },
1137
+ onKeyDown: handleKeyDown
1138
+ }
1139
+ ),
1140
+ /* @__PURE__ */ jsx("span", { className: "min-w-16 text-center text-xs text-muted-foreground", children: query.trim() ? `${String(displayIndex)} of ${String(matches.length)}` : "" }),
1141
+ /* @__PURE__ */ jsx(
1142
+ Button,
1143
+ {
1144
+ "aria-label": "Previous match",
1145
+ disabled: matches.length === 0,
1146
+ icon: /* @__PURE__ */ jsx(ChevronUp, { className: "size-4" }),
1147
+ size: "icon-sm",
1148
+ variant: "ghost",
1149
+ onClick: handlePrev
1150
+ }
1151
+ ),
1152
+ /* @__PURE__ */ jsx(
1153
+ Button,
1154
+ {
1155
+ "aria-label": "Next match",
1156
+ disabled: matches.length === 0,
1157
+ icon: /* @__PURE__ */ jsx(ChevronDown, { className: "size-4" }),
1158
+ size: "icon-sm",
1159
+ variant: "ghost",
1160
+ onClick: handleNext
1161
+ }
1162
+ ),
1163
+ /* @__PURE__ */ jsx(
1164
+ Button,
1165
+ {
1166
+ "aria-label": "Close find bar",
1167
+ icon: /* @__PURE__ */ jsx(X, { className: "size-4" }),
1168
+ size: "icon-sm",
1169
+ variant: "ghost",
1170
+ onClick: handleClose
1171
+ }
1172
+ )
1173
+ ]
1174
+ }
1175
+ );
1176
+ }
1177
+ function autoSizeColumn(table, columnId, containerEl) {
1178
+ const tableEl = document.querySelector(`[data-slot="data-table"] table`);
1179
+ if (!tableEl) return;
1180
+ const cells = tableEl.querySelectorAll(
1181
+ `[data-column-id="${columnId}"]`
1182
+ );
1183
+ let maxWidth = 0;
1184
+ cells.forEach((cell) => {
1185
+ maxWidth = Math.max(maxWidth, cell.scrollWidth + 2);
1186
+ });
1187
+ const headers = tableEl.querySelectorAll("th");
1188
+ headers.forEach((th) => {
1189
+ const headerContent = th.textContent.trim();
1190
+ const colDef = table.getColumn(columnId)?.columnDef;
1191
+ if (colDef && typeof colDef.header === "string" && colDef.header === headerContent) {
1192
+ maxWidth = Math.max(maxWidth, th.scrollWidth + 2);
1193
+ }
1194
+ });
1195
+ if (maxWidth > 0) {
1196
+ const min = table.getColumn(columnId)?.columnDef.minSize ?? 20;
1197
+ const max = table.getColumn(columnId)?.columnDef.maxSize ?? 1e3;
1198
+ const clampedWidth = Math.min(Math.max(maxWidth, min), max);
1199
+ table.setColumnSizing((prev) => ({
1200
+ ...prev,
1201
+ [columnId]: clampedWidth
1202
+ }));
1203
+ }
1204
+ }
1205
+ function DataTableColumnMenuInner({
1206
+ column,
1207
+ enableColumnFilters,
1208
+ enableColumnPinning,
1209
+ enableColumnResizing,
1210
+ enableColumnVisibility,
1211
+ enableGrouping,
1212
+ enableSorting,
1213
+ table
1214
+ }) {
1215
+ const canSort = enableSorting && column.getCanSort();
1216
+ const sorted = column.getIsSorted();
1217
+ const isPinned = column.getIsPinned();
1218
+ const canHide = enableColumnVisibility && column.getCanHide();
1219
+ const canFilter = enableColumnFilters && column.getCanFilter();
1220
+ const canResize = enableColumnResizing && column.getCanResize();
1221
+ const canGroup = enableGrouping && column.getCanGroup();
1222
+ const isGrouped = column.getIsGrouped();
1223
+ const hasAnyAction = canSort || enableColumnPinning || canResize || canHide || canFilter || canGroup;
1224
+ if (!hasAnyAction) return null;
1225
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
1226
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
1227
+ Button,
1228
+ {
1229
+ "aria-label": `Column menu for ${column.id}`,
1230
+ className: "size-6 opacity-0 transition-opacity group-hover/header:opacity-100 data-[state=open]:opacity-100",
1231
+ size: "icon-sm",
1232
+ type: "button",
1233
+ variant: "ghost",
1234
+ onClick: (e) => {
1235
+ e.stopPropagation();
1236
+ },
1237
+ children: /* @__PURE__ */ jsx(MoreVertical, { className: "size-3.5" })
1238
+ }
1239
+ ) }),
1240
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "start", className: "w-48", children: [
1241
+ canSort && /* @__PURE__ */ jsxs(Fragment, { children: [
1242
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Sort" }),
1243
+ /* @__PURE__ */ jsxs(
1244
+ DropdownMenuItem,
1245
+ {
1246
+ onClick: () => {
1247
+ column.toggleSorting(false);
1248
+ },
1249
+ children: [
1250
+ /* @__PURE__ */ jsx(ArrowUp, { className: "mr-2 size-4" }),
1251
+ "Sort ascending"
1252
+ ]
1253
+ }
1254
+ ),
1255
+ /* @__PURE__ */ jsxs(
1256
+ DropdownMenuItem,
1257
+ {
1258
+ onClick: () => {
1259
+ column.toggleSorting(true);
1260
+ },
1261
+ children: [
1262
+ /* @__PURE__ */ jsx(ArrowDown, { className: "mr-2 size-4" }),
1263
+ "Sort descending"
1264
+ ]
1265
+ }
1266
+ ),
1267
+ sorted && /* @__PURE__ */ jsxs(
1268
+ DropdownMenuItem,
1269
+ {
1270
+ onClick: () => {
1271
+ column.clearSorting();
1272
+ },
1273
+ children: [
1274
+ /* @__PURE__ */ jsx(ArrowUpDown, { className: "mr-2 size-4" }),
1275
+ "Clear sort"
1276
+ ]
1277
+ }
1278
+ ),
1279
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {})
1280
+ ] }),
1281
+ enableColumnPinning && /* @__PURE__ */ jsxs(Fragment, { children: [
1282
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Pin" }),
1283
+ isPinned !== "left" && /* @__PURE__ */ jsxs(
1284
+ DropdownMenuItem,
1285
+ {
1286
+ onClick: () => {
1287
+ column.pin("left");
1288
+ },
1289
+ children: [
1290
+ /* @__PURE__ */ jsx(PinIcon, { className: "mr-2 size-4" }),
1291
+ "Pin to left"
1292
+ ]
1293
+ }
1294
+ ),
1295
+ isPinned !== "right" && /* @__PURE__ */ jsxs(
1296
+ DropdownMenuItem,
1297
+ {
1298
+ onClick: () => {
1299
+ column.pin("right");
1300
+ },
1301
+ children: [
1302
+ /* @__PURE__ */ jsx(PinIcon, { className: "mr-2 size-4 rotate-90" }),
1303
+ "Pin to right"
1304
+ ]
1305
+ }
1306
+ ),
1307
+ isPinned && /* @__PURE__ */ jsxs(
1308
+ DropdownMenuItem,
1309
+ {
1310
+ onClick: () => {
1311
+ column.pin(false);
1312
+ },
1313
+ children: [
1314
+ /* @__PURE__ */ jsx(PinOff, { className: "mr-2 size-4" }),
1315
+ "Unpin"
1316
+ ]
1317
+ }
1318
+ ),
1319
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {})
1320
+ ] }),
1321
+ canResize && /* @__PURE__ */ jsxs(Fragment, { children: [
1322
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Size" }),
1323
+ /* @__PURE__ */ jsxs(
1324
+ DropdownMenuItem,
1325
+ {
1326
+ onClick: () => {
1327
+ autoSizeColumn(table, column.id);
1328
+ },
1329
+ children: [
1330
+ /* @__PURE__ */ jsx(Ruler, { className: "mr-2 size-4" }),
1331
+ "Auto-size column"
1332
+ ]
1333
+ }
1334
+ ),
1335
+ /* @__PURE__ */ jsxs(
1336
+ DropdownMenuItem,
1337
+ {
1338
+ onClick: () => {
1339
+ column.resetSize();
1340
+ },
1341
+ children: [
1342
+ /* @__PURE__ */ jsx(RotateCcw, { className: "mr-2 size-4" }),
1343
+ "Reset column size"
1344
+ ]
1345
+ }
1346
+ ),
1347
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {})
1348
+ ] }),
1349
+ canFilter && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
1350
+ DropdownMenuItem,
1351
+ {
1352
+ onClick: () => {
1353
+ const filterInput = document.querySelector(
1354
+ `input[aria-label="Filter ${typeof column.columnDef.header === "string" ? column.columnDef.header : column.id}"]`
1355
+ );
1356
+ filterInput?.focus();
1357
+ },
1358
+ children: [
1359
+ /* @__PURE__ */ jsx(GripHorizontal, { className: "mr-2 size-4" }),
1360
+ "Filter this column"
1361
+ ]
1362
+ }
1363
+ ) }),
1364
+ canGroup && /* @__PURE__ */ jsxs(Fragment, { children: [
1365
+ /* @__PURE__ */ jsxs(
1366
+ DropdownMenuItem,
1367
+ {
1368
+ onClick: () => {
1369
+ column.getToggleGroupingHandler()();
1370
+ },
1371
+ children: [
1372
+ /* @__PURE__ */ jsx(Group, { className: "mr-2 size-4" }),
1373
+ isGrouped ? "Remove grouping" : "Group by this column"
1374
+ ]
1375
+ }
1376
+ ),
1377
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {})
1378
+ ] }),
1379
+ canHide && /* @__PURE__ */ jsxs(
1380
+ DropdownMenuItem,
1381
+ {
1382
+ onClick: () => {
1383
+ column.toggleVisibility(false);
1384
+ },
1385
+ children: [
1386
+ /* @__PURE__ */ jsx(EyeOff, { className: "mr-2 size-4" }),
1387
+ "Hide column"
1388
+ ]
1389
+ }
1390
+ )
1391
+ ] })
1392
+ ] });
1393
+ }
1394
+ var DataTableColumnMenu = DataTableColumnMenuInner;
1395
+ function FacetedFilter({ column }) {
1396
+ const facetedValues = column.getFacetedUniqueValues();
1397
+ const filterValue = column.getFilterValue() ?? [];
1398
+ const [open, setOpen] = React14.useState(false);
1399
+ const sortedEntries = React14.useMemo(() => {
1400
+ return [...facetedValues.entries()].sort(
1401
+ (a, b) => String(a[0]).localeCompare(String(b[0]))
1402
+ );
1403
+ }, [facetedValues]);
1404
+ const handleToggle = (value) => {
1405
+ const next = filterValue.includes(value) ? filterValue.filter((v) => v !== value) : [...filterValue, value];
1406
+ column.setFilterValue(next.length > 0 ? next : void 0);
1407
+ };
1408
+ const columnLabel = typeof column.columnDef.header === "string" ? column.columnDef.header : column.id;
1409
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
1410
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
1411
+ "button",
1412
+ {
1413
+ className: cn(
1414
+ "flex h-7 w-full items-center justify-between rounded-md border px-2 text-xs",
1415
+ "border-[color:var(--border-default)] bg-transparent",
1416
+ "hover:bg-[color:var(--surface-hover)]",
1417
+ filterValue.length > 0 && "text-foreground"
1418
+ ),
1419
+ "aria-label": `Filter ${columnLabel}`,
1420
+ type: "button",
1421
+ children: [
1422
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: filterValue.length > 0 ? `${String(filterValue.length)} selected` : "All" }),
1423
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-1 size-3 shrink-0 opacity-50" })
1424
+ ]
1425
+ }
1426
+ ) }),
1427
+ /* @__PURE__ */ jsxs(PopoverContent, { align: "start", className: "w-52 p-2", children: [
1428
+ /* @__PURE__ */ jsx("div", { className: "max-h-48 overflow-y-auto", children: sortedEntries.map(([value, count]) => {
1429
+ const stringValue = String(value);
1430
+ const isChecked = filterValue.includes(stringValue);
1431
+ return /* @__PURE__ */ jsxs(
1432
+ "label",
1433
+ {
1434
+ className: "flex cursor-pointer items-center gap-2 rounded px-2 py-1 text-xs hover:bg-[color:var(--surface-hover)]",
1435
+ children: [
1436
+ /* @__PURE__ */ jsx(
1437
+ Checkbox,
1438
+ {
1439
+ checked: isChecked,
1440
+ size: "sm",
1441
+ onCheckedChange: () => {
1442
+ handleToggle(stringValue);
1443
+ }
1444
+ }
1445
+ ),
1446
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: stringValue }),
1447
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground tabular-nums", children: count })
1448
+ ]
1449
+ },
1450
+ stringValue
1451
+ );
1452
+ }) }),
1453
+ filterValue.length > 0 && /* @__PURE__ */ jsx(
1454
+ "button",
1455
+ {
1456
+ className: "mt-1 w-full rounded px-2 py-1 text-center text-xs text-muted-foreground hover:bg-[color:var(--surface-hover)]",
1457
+ type: "button",
1458
+ onClick: () => {
1459
+ column.setFilterValue(void 0);
1460
+ },
1461
+ children: "Clear"
1462
+ }
1463
+ )
1464
+ ] })
1465
+ ] });
1466
+ }
1467
+ function RangeFilter({ column }) {
1468
+ const filterValue = column.getFilterValue() ?? [void 0, void 0];
1469
+ const columnLabel = typeof column.columnDef.header === "string" ? column.columnDef.header : column.id;
1470
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
1471
+ /* @__PURE__ */ jsx(
1472
+ TextInput,
1473
+ {
1474
+ "aria-label": `${columnLabel} min`,
1475
+ className: "h-7 text-xs",
1476
+ placeholder: "Min",
1477
+ type: "number",
1478
+ value: filterValue[0] != null ? String(filterValue[0]) : "",
1479
+ onChange: (e) => {
1480
+ const val = e.target.value;
1481
+ column.setFilterValue((prev) => [
1482
+ val ? Number(val) : void 0,
1483
+ prev?.[1]
1484
+ ]);
1485
+ }
1486
+ }
1487
+ ),
1488
+ /* @__PURE__ */ jsx(
1489
+ TextInput,
1490
+ {
1491
+ "aria-label": `${columnLabel} max`,
1492
+ className: "h-7 text-xs",
1493
+ placeholder: "Max",
1494
+ type: "number",
1495
+ value: filterValue[1] != null ? String(filterValue[1]) : "",
1496
+ onChange: (e) => {
1497
+ const val = e.target.value;
1498
+ column.setFilterValue((prev) => [
1499
+ prev?.[0],
1500
+ val ? Number(val) : void 0
1501
+ ]);
1502
+ }
1503
+ }
1504
+ )
1505
+ ] });
1506
+ }
1507
+ function SelectFilter({ column }) {
1508
+ const meta = column.columnDef.meta;
1509
+ const options = meta?.filterOptions ?? [];
1510
+ const filterValue = column.getFilterValue() ?? "";
1511
+ const columnLabel = typeof column.columnDef.header === "string" ? column.columnDef.header : column.id;
1512
+ return /* @__PURE__ */ jsxs(
1513
+ "select",
1514
+ {
1515
+ className: cn(
1516
+ "h-7 w-full rounded-md border px-2 text-xs",
1517
+ "border-[color:var(--border-default)] bg-transparent",
1518
+ "focus:outline-none focus:ring-1 focus:ring-[color:var(--ring)]"
1519
+ ),
1520
+ "aria-label": `Filter ${columnLabel}`,
1521
+ value: filterValue,
1522
+ onChange: (e) => {
1523
+ column.setFilterValue(e.target.value || void 0);
1524
+ },
1525
+ children: [
1526
+ /* @__PURE__ */ jsx("option", { value: "", children: "All" }),
1527
+ options.map((opt) => /* @__PURE__ */ jsx("option", { value: opt, children: opt }, opt))
1528
+ ]
1529
+ }
1530
+ );
1531
+ }
1532
+ function DefaultColumnFilter({ column }) {
1533
+ const meta = column.columnDef.meta;
1534
+ const variant = meta?.filterVariant ?? "text";
1535
+ const columnLabel = typeof column.columnDef.header === "string" ? column.columnDef.header : column.id;
1536
+ switch (variant) {
1537
+ case "faceted":
1538
+ return /* @__PURE__ */ jsx(FacetedFilter, { column });
1539
+ case "range":
1540
+ return /* @__PURE__ */ jsx(RangeFilter, { column });
1541
+ case "select":
1542
+ return /* @__PURE__ */ jsx(SelectFilter, { column });
1543
+ case "text":
1544
+ default:
1545
+ return /* @__PURE__ */ jsx(
1546
+ TextInput,
1547
+ {
1548
+ "aria-label": `Filter ${columnLabel}`,
1549
+ className: "h-7 text-xs",
1550
+ placeholder: "Filter...",
1551
+ value: column.getFilterValue() ?? "",
1552
+ onChange: (e) => {
1553
+ column.setFilterValue(e.target.value || void 0);
1554
+ }
1555
+ }
1556
+ );
1557
+ }
1558
+ }
1559
+ function DataTableHeaderInner({
1560
+ columnVirtualizer,
1561
+ enableColumnFilters,
1562
+ enableColumnMenu,
1563
+ enableColumnOrdering,
1564
+ enableColumnPinning,
1565
+ enableColumnResizing,
1566
+ enableColumnVisibility,
1567
+ enableGrouping,
1568
+ enableSorting,
1569
+ enableStickyHeader,
1570
+ getPinnedAttribute,
1571
+ getPinnedStyles,
1572
+ renderColumnFilter,
1573
+ table
1574
+ }) {
1575
+ const sortedColumnCount = table.getState().sorting.length;
1576
+ const hasFilterableColumns = enableColumnFilters && table.getAllLeafColumns().some((col) => col.getCanFilter());
1577
+ const sensors = useSensors(
1578
+ useSensor(PointerSensor, {
1579
+ activationConstraint: {
1580
+ distance: 8
1581
+ }
1582
+ })
1583
+ );
1584
+ const handleDragEnd = React14.useCallback(
1585
+ (event) => {
1586
+ const { active, over } = event;
1587
+ if (!over || active.id === over.id) return;
1588
+ const currentOrder = table.getState().columnOrder.length > 0 ? table.getState().columnOrder : table.getAllLeafColumns().map((col) => col.id);
1589
+ const oldIndex = currentOrder.indexOf(String(active.id));
1590
+ const newIndex = currentOrder.indexOf(String(over.id));
1591
+ if (oldIndex === -1 || newIndex === -1) return;
1592
+ const newOrder = arrayMove(currentOrder, oldIndex, newIndex);
1593
+ table.setColumnOrder(newOrder);
1594
+ },
1595
+ [table]
1596
+ );
1597
+ const columnIds = React14.useMemo(() => {
1598
+ return table.getAllLeafColumns().map((col) => col.id);
1599
+ }, [table]);
1600
+ const headerContent = table.getHeaderGroups().map((headerGroup) => {
1601
+ const virtualColItems = columnVirtualizer?.getVirtualItems();
1602
+ const headersToRender = virtualColItems ? virtualColItems.filter((virtualCol) => headerGroup.headers[virtualCol.index] != null).map((virtualCol) => headerGroup.headers[virtualCol.index]) : headerGroup.headers;
1603
+ return /* @__PURE__ */ jsx(TableRow, { children: headersToRender.map((header) => enableColumnOrdering ? /* @__PURE__ */ jsx(
1604
+ SortableHeaderCell,
1605
+ {
1606
+ enableColumnFilters,
1607
+ enableColumnMenu,
1608
+ enableColumnPinning,
1609
+ enableColumnResizing,
1610
+ enableColumnVisibility,
1611
+ enableGrouping,
1612
+ enableSorting,
1613
+ enableStickyHeader,
1614
+ getPinnedAttribute,
1615
+ getPinnedStyles,
1616
+ header,
1617
+ showSortPriority: sortedColumnCount >= 2,
1618
+ table
1619
+ },
1620
+ header.id
1621
+ ) : /* @__PURE__ */ jsx(
1622
+ DataTableHeaderCell,
1623
+ {
1624
+ enableColumnFilters,
1625
+ enableColumnMenu,
1626
+ enableColumnPinning,
1627
+ enableColumnResizing,
1628
+ enableColumnVisibility,
1629
+ enableGrouping,
1630
+ enableSorting,
1631
+ enableStickyHeader,
1632
+ getPinnedAttribute,
1633
+ getPinnedStyles,
1634
+ header,
1635
+ showSortPriority: sortedColumnCount >= 2,
1636
+ table
1637
+ },
1638
+ header.id
1639
+ )) }, headerGroup.id);
1640
+ });
1641
+ return /* @__PURE__ */ jsxs(TableHeader, { children: [
1642
+ enableColumnOrdering ? /* @__PURE__ */ jsx(
1643
+ DndContext,
1644
+ {
1645
+ accessibility: {
1646
+ container: typeof document === "undefined" ? void 0 : document.body
1647
+ },
1648
+ collisionDetection: closestCenter,
1649
+ sensors,
1650
+ onDragEnd: handleDragEnd,
1651
+ children: /* @__PURE__ */ jsx(
1652
+ SortableContext,
1653
+ {
1654
+ items: columnIds,
1655
+ strategy: horizontalListSortingStrategy,
1656
+ children: headerContent
1657
+ }
1658
+ )
1659
+ }
1660
+ ) : headerContent,
1661
+ hasFilterableColumns && /* @__PURE__ */ jsx(TableRow, { children: (() => {
1662
+ const allLeafColumns = table.getAllLeafColumns();
1663
+ const virtualColItems = columnVirtualizer?.getVirtualItems();
1664
+ const columnsToRender = virtualColItems ? virtualColItems.filter((virtualCol) => allLeafColumns[virtualCol.index] != null).map((virtualCol) => allLeafColumns[virtualCol.index]) : allLeafColumns;
1665
+ return columnsToRender.map((column) => /* @__PURE__ */ jsx(TableHead, { className: "px-2 py-1.5", children: column.getCanFilter() ? renderColumnFilter ? renderColumnFilter({ column, table }) : /* @__PURE__ */ jsx(DefaultColumnFilter, { column, table }) : null }, column.id));
1666
+ })() })
1667
+ ] });
1668
+ }
1669
+ function SortableHeaderCell(props) {
1670
+ const { header } = props;
1671
+ const {
1672
+ attributes,
1673
+ isDragging,
1674
+ listeners,
1675
+ setNodeRef,
1676
+ transform,
1677
+ transition
1678
+ } = useSortable({
1679
+ id: header.column.id
1680
+ });
1681
+ const style = {
1682
+ transform: CSS.Translate.toString(transform),
1683
+ transition,
1684
+ opacity: isDragging ? 0.5 : 1,
1685
+ position: "relative",
1686
+ zIndex: isDragging ? 2 : void 0,
1687
+ cursor: "grab"
1688
+ };
1689
+ return /* @__PURE__ */ jsx(
1690
+ DataTableHeaderCell,
1691
+ {
1692
+ ...props,
1693
+ dragAttributes: attributes,
1694
+ dragListeners: listeners,
1695
+ dragStyle: style,
1696
+ setDragNodeRef: setNodeRef
1697
+ }
1698
+ );
1699
+ }
1700
+ function DataTableHeaderCell({
1701
+ dragAttributes,
1702
+ dragListeners,
1703
+ dragStyle,
1704
+ enableColumnFilters,
1705
+ enableColumnMenu,
1706
+ enableColumnPinning,
1707
+ enableColumnResizing,
1708
+ enableColumnVisibility,
1709
+ enableGrouping,
1710
+ enableSorting,
1711
+ enableStickyHeader,
1712
+ getPinnedAttribute,
1713
+ getPinnedStyles,
1714
+ header,
1715
+ setDragNodeRef,
1716
+ showSortPriority,
1717
+ table
1718
+ }) {
1719
+ const canSort = header.column.getCanSort();
1720
+ const sorted = header.column.getIsSorted();
1721
+ const sortIndex = header.column.getSortIndex();
1722
+ return /* @__PURE__ */ jsxs(
1723
+ TableHead,
1724
+ {
1725
+ ref: setDragNodeRef,
1726
+ "aria-sort": sorted ? sorted === "asc" ? "ascending" : "descending" : void 0,
1727
+ className: cn(
1728
+ "group/header",
1729
+ dataTableHeaderVariants({
1730
+ sortable: canSort,
1731
+ sorted: sorted ? sorted : "none"
1732
+ }),
1733
+ enableStickyHeader && "sticky top-0 z-10 bg-[color:var(--surface-default)]",
1734
+ enableColumnResizing && "relative",
1735
+ enableColumnPinning && header.column.getIsPinned() && "sticky",
1736
+ dragListeners && "cursor-grab"
1737
+ ),
1738
+ style: {
1739
+ width: enableColumnResizing ? header.getSize() : void 0,
1740
+ ...getPinnedStyles(header.column),
1741
+ ...dragStyle
1742
+ },
1743
+ colSpan: header.colSpan > 1 ? header.colSpan : void 0,
1744
+ "data-pinned": getPinnedAttribute(header.column),
1745
+ onClick: canSort ? header.column.getToggleSortingHandler() : void 0,
1746
+ ...dragAttributes,
1747
+ ...dragListeners,
1748
+ children: [
1749
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1750
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center gap-2", children: [
1751
+ header.isPlaceholder ? null : flexRender(
1752
+ header.column.columnDef.header,
1753
+ header.getContext()
1754
+ ),
1755
+ canSort && /* @__PURE__ */ jsxs("span", { className: "relative text-muted-foreground", children: [
1756
+ sorted === "asc" ? /* @__PURE__ */ jsx(ArrowUp, { className: "size-4" }) : sorted === "desc" ? /* @__PURE__ */ jsx(ArrowDown, { className: "size-4" }) : /* @__PURE__ */ jsx(ArrowUpDown, { className: "size-4" }),
1757
+ showSortPriority && sorted && sortIndex >= 0 && /* @__PURE__ */ jsx("span", { className: "absolute -right-1.5 -top-1.5 flex size-4 items-center justify-center rounded-full bg-[color:var(--primary)] text-xs font-bold leading-none text-[color:var(--primary-foreground)]", children: sortIndex + 1 })
1758
+ ] })
1759
+ ] }),
1760
+ enableGrouping && !header.isPlaceholder && header.column.getCanGroup() && /* @__PURE__ */ jsx(
1761
+ "button",
1762
+ {
1763
+ "aria-label": header.column.getIsGrouped() ? `Remove grouping by ${header.column.id}` : `Group by ${header.column.id}`,
1764
+ className: cn(
1765
+ "size-5 shrink-0 rounded p-0.5 transition-colors",
1766
+ header.column.getIsGrouped() ? "text-[color:var(--primary)] hover:text-[color:var(--primary)]/80" : "text-muted-foreground opacity-0 hover:text-foreground group-hover/header:opacity-100"
1767
+ ),
1768
+ type: "button",
1769
+ onClick: (e) => {
1770
+ e.stopPropagation();
1771
+ header.column.getToggleGroupingHandler()();
1772
+ },
1773
+ children: /* @__PURE__ */ jsx(Group, { className: "size-3.5" })
1774
+ }
1775
+ ),
1776
+ enableColumnMenu && !header.isPlaceholder && /* @__PURE__ */ jsx(
1777
+ DataTableColumnMenu,
1778
+ {
1779
+ column: header.column,
1780
+ enableColumnFilters,
1781
+ enableColumnPinning,
1782
+ enableColumnResizing,
1783
+ enableColumnVisibility,
1784
+ enableGrouping,
1785
+ enableSorting,
1786
+ table
1787
+ }
1788
+ )
1789
+ ] }),
1790
+ enableColumnResizing && !header.isPlaceholder && /* @__PURE__ */ jsx(
1791
+ "div",
1792
+ {
1793
+ className: dataTableResizeHandleVariants({
1794
+ isResizing: header.column.getIsResizing()
1795
+ }),
1796
+ "aria-label": `Resize ${header.column.id} column`,
1797
+ "aria-orientation": "vertical",
1798
+ "aria-valuemax": header.column.columnDef.maxSize ?? 1e3,
1799
+ "aria-valuemin": header.column.columnDef.minSize ?? 20,
1800
+ "aria-valuenow": header.column.getSize(),
1801
+ role: "separator",
1802
+ tabIndex: 0,
1803
+ onDoubleClick: () => {
1804
+ header.column.resetSize();
1805
+ },
1806
+ onKeyDown: (e) => {
1807
+ const step = e.shiftKey ? 20 : 4;
1808
+ const columnId = header.column.id;
1809
+ const currentSize = header.column.getSize();
1810
+ if (e.key === "ArrowRight") {
1811
+ e.preventDefault();
1812
+ const max = header.column.columnDef.maxSize ?? 1e3;
1813
+ table.setColumnSizing((prev) => ({
1814
+ ...prev,
1815
+ [columnId]: Math.min(currentSize + step, max)
1816
+ }));
1817
+ } else if (e.key === "ArrowLeft") {
1818
+ e.preventDefault();
1819
+ const min = header.column.columnDef.minSize ?? 20;
1820
+ table.setColumnSizing((prev) => ({
1821
+ ...prev,
1822
+ [columnId]: Math.max(currentSize - step, min)
1823
+ }));
1824
+ }
1825
+ },
1826
+ onMouseDown: header.getResizeHandler(),
1827
+ onTouchStart: header.getResizeHandler()
1828
+ }
1829
+ )
1830
+ ]
1831
+ }
1832
+ );
1833
+ }
1834
+ var DataTableHeader = DataTableHeaderInner;
1835
+ function DataTablePaginationInner({
1836
+ enableRowSelection,
1837
+ onPaginationChange,
1838
+ pageSizeOptions,
1839
+ pagination,
1840
+ setInternalPagination,
1841
+ table
1842
+ }) {
1843
+ return /* @__PURE__ */ jsxs(
1844
+ "div",
1845
+ {
1846
+ className: "flex w-full flex-col gap-4 px-[var(--datatable-pagination-padding-x)] py-4 sm:flex-row sm:items-center sm:justify-between",
1847
+ "data-slot": "data-table-pagination",
1848
+ children: [
1849
+ /* @__PURE__ */ jsx("div", { className: "flex-1 text-[color:var(--datatable-pagination-info-color)] text-[length:var(--datatable-pagination-info-size)]", children: enableRowSelection && table.getFilteredSelectedRowModel().rows.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
1850
+ table.getFilteredSelectedRowModel().rows.length,
1851
+ " of",
1852
+ " ",
1853
+ table.getFilteredRowModel().rows.length,
1854
+ " row(s) selected."
1855
+ ] }) : /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "\xA0" }) }),
1856
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between sm:justify-end gap-x-6 gap-y-4 lg:gap-8", children: [
1857
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1858
+ /* @__PURE__ */ jsx("p", { className: "text-[color:var(--datatable-pagination-info-color)] text-[length:var(--datatable-pagination-info-size)] font-medium", children: "Rows per page" }),
1859
+ /* @__PURE__ */ jsxs(
1860
+ Select,
1861
+ {
1862
+ value: String(pagination.pageSize),
1863
+ onValueChange: (value) => {
1864
+ const newSize = Number(value);
1865
+ if (onPaginationChange) {
1866
+ onPaginationChange({
1867
+ pageIndex: 0,
1868
+ pageSize: newSize
1869
+ });
1870
+ } else {
1871
+ setInternalPagination({
1872
+ pageIndex: 0,
1873
+ pageSize: newSize
1874
+ });
1875
+ }
1876
+ },
1877
+ children: [
1878
+ /* @__PURE__ */ jsx(SelectTrigger, { "aria-label": "Rows per page", className: "h-8 w-20 bg-background", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: String(pagination.pageSize) }) }),
1879
+ /* @__PURE__ */ jsx(SelectContent, { side: "top", children: pageSizeOptions.map((size) => /* @__PURE__ */ jsx(SelectItem, { value: String(size), children: size }, size)) })
1880
+ ]
1881
+ }
1882
+ )
1883
+ ] }),
1884
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 lg:gap-8", children: [
1885
+ /* @__PURE__ */ jsxs("div", { className: "flex w-24 items-center justify-center text-[color:var(--datatable-pagination-info-color)] text-[length:var(--datatable-pagination-info-size)] font-medium", children: [
1886
+ "Page ",
1887
+ pagination.pageIndex + 1,
1888
+ " of ",
1889
+ table.getPageCount() || 1
1890
+ ] }),
1891
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
1892
+ /* @__PURE__ */ jsx(
1893
+ Button,
1894
+ {
1895
+ "aria-label": "Go to first page",
1896
+ className: "hidden sm:flex",
1897
+ disabled: !table.getCanPreviousPage(),
1898
+ size: "icon-sm",
1899
+ variant: "outline",
1900
+ onClick: () => {
1901
+ table.setPageIndex(0);
1902
+ },
1903
+ children: /* @__PURE__ */ jsx(ChevronsLeft, { className: "size-4" })
1904
+ }
1905
+ ),
1906
+ /* @__PURE__ */ jsx(
1907
+ Button,
1908
+ {
1909
+ "aria-label": "Go to previous page",
1910
+ disabled: !table.getCanPreviousPage(),
1911
+ size: "icon-sm",
1912
+ variant: "outline",
1913
+ onClick: () => {
1914
+ table.previousPage();
1915
+ },
1916
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" })
1917
+ }
1918
+ ),
1919
+ /* @__PURE__ */ jsx(
1920
+ Button,
1921
+ {
1922
+ "aria-label": "Go to next page",
1923
+ disabled: !table.getCanNextPage(),
1924
+ size: "icon-sm",
1925
+ variant: "outline",
1926
+ onClick: () => {
1927
+ table.nextPage();
1928
+ },
1929
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
1930
+ }
1931
+ ),
1932
+ /* @__PURE__ */ jsx(
1933
+ Button,
1934
+ {
1935
+ "aria-label": "Go to last page",
1936
+ className: "hidden sm:flex",
1937
+ disabled: !table.getCanNextPage(),
1938
+ size: "icon-sm",
1939
+ variant: "outline",
1940
+ onClick: () => {
1941
+ table.setPageIndex(table.getPageCount() - 1);
1942
+ },
1943
+ children: /* @__PURE__ */ jsx(ChevronsRight, { className: "size-4" })
1944
+ }
1945
+ )
1946
+ ] })
1947
+ ] })
1948
+ ] })
1949
+ ]
1950
+ }
1951
+ );
1952
+ }
1953
+ var DataTablePagination = DataTablePaginationInner;
1954
+ function DataTableSidePanelInner({
1955
+ children,
1956
+ onClose,
1957
+ open,
1958
+ overlay = false,
1959
+ title = "Tools",
1960
+ width = 320
1961
+ }) {
1962
+ const panelRef = React14.useRef(null);
1963
+ const resolvedWidth = typeof width === "number" ? `${String(width)}px` : width;
1964
+ React14.useEffect(() => {
1965
+ if (!open) return;
1966
+ function handleKeyDown(e) {
1967
+ if (e.key === "Escape") {
1968
+ e.preventDefault();
1969
+ onClose();
1970
+ }
1971
+ }
1972
+ document.addEventListener("keydown", handleKeyDown);
1973
+ return () => {
1974
+ document.removeEventListener("keydown", handleKeyDown);
1975
+ };
1976
+ }, [open, onClose]);
1977
+ React14.useEffect(() => {
1978
+ if (!open) return;
1979
+ if (!panelRef.current) return;
1980
+ const timer = setTimeout(() => {
1981
+ panelRef.current?.focus();
1982
+ }, 0);
1983
+ return () => {
1984
+ clearTimeout(timer);
1985
+ };
1986
+ }, [open]);
1987
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1988
+ overlay && /* @__PURE__ */ jsx(
1989
+ "div",
1990
+ {
1991
+ className: cn(
1992
+ "fixed inset-0 z-40 bg-black/50 transition-opacity duration-300",
1993
+ open ? "opacity-100" : "pointer-events-none opacity-0"
1994
+ ),
1995
+ "aria-hidden": "true",
1996
+ "data-slot": "data-table-side-panel-overlay",
1997
+ onClick: onClose
1998
+ }
1999
+ ),
2000
+ /* @__PURE__ */ jsxs(
2001
+ "div",
2002
+ {
2003
+ ref: panelRef,
2004
+ className: cn(
2005
+ "absolute inset-y-0 right-0 z-50 flex flex-col",
2006
+ "border-l bg-background shadow-lg",
2007
+ "transition-transform duration-300 ease-in-out",
2008
+ open ? "translate-x-0" : "translate-x-full"
2009
+ ),
2010
+ "aria-label": title,
2011
+ "data-slot": "data-table-side-panel",
2012
+ "data-state": open ? "open" : "closed",
2013
+ role: "complementary",
2014
+ style: { width: resolvedWidth },
2015
+ tabIndex: -1,
2016
+ children: [
2017
+ /* @__PURE__ */ jsxs(
2018
+ "div",
2019
+ {
2020
+ className: "flex items-center justify-between border-b px-4 py-3",
2021
+ "data-slot": "data-table-side-panel-header",
2022
+ children: [
2023
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: title }),
2024
+ /* @__PURE__ */ jsx(
2025
+ Button,
2026
+ {
2027
+ "aria-label": "Close panel",
2028
+ icon: /* @__PURE__ */ jsx(X, { className: "size-4" }),
2029
+ size: "icon-sm",
2030
+ variant: "ghost",
2031
+ onClick: onClose
2032
+ }
2033
+ )
2034
+ ]
2035
+ }
2036
+ ),
2037
+ /* @__PURE__ */ jsx(
2038
+ "div",
2039
+ {
2040
+ className: "flex-1 overflow-y-auto p-4",
2041
+ "data-slot": "data-table-side-panel-content",
2042
+ children
2043
+ }
2044
+ )
2045
+ ]
2046
+ }
2047
+ )
2048
+ ] });
2049
+ }
2050
+ var DataTableSidePanel = DataTableSidePanelInner;
2051
+ function DataTableStatusBarInner({
2052
+ enableRowSelection,
2053
+ items,
2054
+ table
2055
+ }) {
2056
+ const totalRows = table.getCoreRowModel().rows.length;
2057
+ const filteredRows = table.getFilteredRowModel().rows.length;
2058
+ const selectedRows = enableRowSelection ? table.getFilteredSelectedRowModel().rows.length : 0;
2059
+ const isFiltered = filteredRows < totalRows;
2060
+ return /* @__PURE__ */ jsxs(
2061
+ "div",
2062
+ {
2063
+ className: "flex items-center gap-4 border-t px-4 py-2 text-xs text-muted-foreground",
2064
+ "data-slot": "data-table-status-bar",
2065
+ children: [
2066
+ /* @__PURE__ */ jsx("span", { children: isFiltered ? `${String(filteredRows)} of ${String(totalRows)} rows` : `${String(totalRows)} rows` }),
2067
+ enableRowSelection && selectedRows > 0 && /* @__PURE__ */ jsxs("span", { children: [
2068
+ selectedRows,
2069
+ " selected"
2070
+ ] }),
2071
+ items?.map((item) => /* @__PURE__ */ jsxs("span", { children: [
2072
+ item.label,
2073
+ ": ",
2074
+ item.value(table)
2075
+ ] }, item.id))
2076
+ ]
2077
+ }
2078
+ );
2079
+ }
2080
+ var DataTableStatusBar = DataTableStatusBarInner;
2081
+ function DataTableToolbar({
2082
+ advancedFilterColumns,
2083
+ columns,
2084
+ currentAdvancedFilter,
2085
+ debouncedFilterUpdate,
2086
+ density = "default",
2087
+ enableAdvancedFilter,
2088
+ enableColumnVisibility,
2089
+ enableDensityToggle,
2090
+ enableExport,
2091
+ enableFiltering,
2092
+ enablePrint,
2093
+ enableSearch,
2094
+ exportFormats,
2095
+ filterPresets,
2096
+ onAdvancedFilterChange,
2097
+ onDeleteFilterPreset,
2098
+ onDensityChange,
2099
+ onExport,
2100
+ onPrint,
2101
+ onSaveFilterPreset,
2102
+ searchDisplayValue,
2103
+ searchPlaceholder,
2104
+ setSearchDisplayValue
2105
+ }) {
2106
+ const hideableColumns = enableColumnVisibility && columns ? columns.filter((col) => col.getCanHide()) : [];
2107
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2108
+ enableFiltering && enableSearch || enableExport || enableColumnVisibility || enableDensityToggle || enablePrint ? /* @__PURE__ */ jsxs(
2109
+ "div",
2110
+ {
2111
+ className: "flex items-center justify-between gap-[var(--datatable-toolbar-gap)]",
2112
+ "data-slot": "data-table-toolbar",
2113
+ children: [
2114
+ enableFiltering && enableSearch ? /* @__PURE__ */ jsxs("div", { className: "relative max-w-sm flex-1", children: [
2115
+ /* @__PURE__ */ jsx(Search, { className: "text-[color:var(--datatable-toolbar-search-icon-color)] absolute top-[var(--datatable-toolbar-search-icon-top)] left-[var(--datatable-toolbar-search-icon-left)] size-[var(--datatable-toolbar-search-icon-size)] -translate-y-1/2" }),
2116
+ /* @__PURE__ */ jsx(
2117
+ TextInput,
2118
+ {
2119
+ "aria-label": "Search table",
2120
+ className: "pl-[var(--datatable-toolbar-search-input-padding-left)]",
2121
+ placeholder: searchPlaceholder,
2122
+ value: searchDisplayValue,
2123
+ onChange: (e) => {
2124
+ const value = e.target.value;
2125
+ setSearchDisplayValue(value);
2126
+ debouncedFilterUpdate(value);
2127
+ }
2128
+ }
2129
+ )
2130
+ ] }) : /* @__PURE__ */ jsx("div", { className: "flex-1" }),
2131
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
2132
+ enableColumnVisibility && hideableColumns.length > 0 && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
2133
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
2134
+ Button,
2135
+ {
2136
+ "aria-label": "Toggle columns",
2137
+ size: "sm",
2138
+ variant: "outline",
2139
+ children: [
2140
+ /* @__PURE__ */ jsx(Columns3, { className: "mr-2 size-4" }),
2141
+ "Columns"
2142
+ ]
2143
+ }
2144
+ ) }),
2145
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", children: [
2146
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Toggle columns" }),
2147
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
2148
+ hideableColumns.map((column) => /* @__PURE__ */ jsx(
2149
+ DropdownMenuCheckboxItem,
2150
+ {
2151
+ checked: column.getIsVisible(),
2152
+ onCheckedChange: (value) => {
2153
+ column.toggleVisibility(value);
2154
+ },
2155
+ children: typeof column.columnDef.header === "string" ? column.columnDef.header : column.id
2156
+ },
2157
+ column.id
2158
+ ))
2159
+ ] })
2160
+ ] }),
2161
+ enableDensityToggle && onDensityChange && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
2162
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
2163
+ Button,
2164
+ {
2165
+ "aria-label": "Change density",
2166
+ size: "sm",
2167
+ variant: "outline",
2168
+ children: [
2169
+ density === "compact" ? /* @__PURE__ */ jsx(GripHorizontal, { className: "mr-2 size-4" }) : density === "comfortable" ? /* @__PURE__ */ jsx(StretchHorizontal, { className: "mr-2 size-4" }) : /* @__PURE__ */ jsx(AlignJustify, { className: "mr-2 size-4" }),
2170
+ "Density"
2171
+ ]
2172
+ }
2173
+ ) }),
2174
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", children: [
2175
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Row density" }),
2176
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
2177
+ /* @__PURE__ */ jsxs(
2178
+ DropdownMenuRadioGroup,
2179
+ {
2180
+ value: density,
2181
+ onValueChange: (value) => {
2182
+ onDensityChange(value);
2183
+ },
2184
+ children: [
2185
+ /* @__PURE__ */ jsxs(DropdownMenuRadioItem, { value: "compact", children: [
2186
+ /* @__PURE__ */ jsx(GripHorizontal, { className: "mr-2 size-4" }),
2187
+ "Compact"
2188
+ ] }),
2189
+ /* @__PURE__ */ jsxs(DropdownMenuRadioItem, { value: "default", children: [
2190
+ /* @__PURE__ */ jsx(AlignJustify, { className: "mr-2 size-4" }),
2191
+ "Default"
2192
+ ] }),
2193
+ /* @__PURE__ */ jsxs(DropdownMenuRadioItem, { value: "comfortable", children: [
2194
+ /* @__PURE__ */ jsx(StretchHorizontal, { className: "mr-2 size-4" }),
2195
+ "Comfortable"
2196
+ ] })
2197
+ ]
2198
+ }
2199
+ )
2200
+ ] })
2201
+ ] }),
2202
+ enableExport && exportFormats.length === 1 && /* @__PURE__ */ jsxs(
2203
+ Button,
2204
+ {
2205
+ "aria-label": "Export",
2206
+ size: "sm",
2207
+ variant: "outline",
2208
+ onClick: () => {
2209
+ const format = exportFormats[0];
2210
+ if (format) void onExport(format);
2211
+ },
2212
+ children: [
2213
+ /* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }),
2214
+ "Export"
2215
+ ]
2216
+ }
2217
+ ),
2218
+ enableExport && exportFormats.length > 1 && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
2219
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
2220
+ Button,
2221
+ {
2222
+ "aria-label": "Export",
2223
+ size: "sm",
2224
+ variant: "outline",
2225
+ children: [
2226
+ /* @__PURE__ */ jsx(Download, { className: "mr-2 size-4" }),
2227
+ "Export"
2228
+ ]
2229
+ }
2230
+ ) }),
2231
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", children: [
2232
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Export as" }),
2233
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
2234
+ exportFormats.map((format) => /* @__PURE__ */ jsxs(
2235
+ DropdownMenuItem,
2236
+ {
2237
+ onClick: () => {
2238
+ void onExport(format);
2239
+ },
2240
+ children: [
2241
+ format === "csv" ? /* @__PURE__ */ jsx(FileText, { className: "mr-2 size-4" }) : /* @__PURE__ */ jsx(FileSpreadsheet, { className: "mr-2 size-4" }),
2242
+ format === "csv" ? "CSV (.csv)" : "Excel (.xlsx)"
2243
+ ]
2244
+ },
2245
+ format
2246
+ ))
2247
+ ] })
2248
+ ] }),
2249
+ enablePrint && onPrint && /* @__PURE__ */ jsxs(
2250
+ Button,
2251
+ {
2252
+ "aria-label": "Print",
2253
+ size: "sm",
2254
+ variant: "outline",
2255
+ onClick: onPrint,
2256
+ children: [
2257
+ /* @__PURE__ */ jsx(Printer, { className: "mr-2 size-4" }),
2258
+ "Print"
2259
+ ]
2260
+ }
2261
+ )
2262
+ ] })
2263
+ ]
2264
+ }
2265
+ ) : null,
2266
+ enableAdvancedFilter && advancedFilterColumns.length > 0 && /* @__PURE__ */ jsx(
2267
+ FilterBuilder,
2268
+ {
2269
+ columns: advancedFilterColumns,
2270
+ filter: currentAdvancedFilter,
2271
+ presets: filterPresets,
2272
+ onDeletePreset: onDeleteFilterPreset,
2273
+ onFilterChange: onAdvancedFilterChange,
2274
+ onSavePreset: onSaveFilterPreset
2275
+ }
2276
+ )
2277
+ ] });
2278
+ }
2279
+ function renderCellInput(accessorKey, editType, editOptions, cellValue, onChangeValue) {
2280
+ if (editType === "select") {
2281
+ return /* @__PURE__ */ jsxs(
2282
+ "select",
2283
+ {
2284
+ "aria-label": `New ${accessorKey}`,
2285
+ className: "h-8 w-full rounded-md border border-input bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2286
+ value: typeof cellValue === "string" ? cellValue : "",
2287
+ onChange: (e) => {
2288
+ onChangeValue(accessorKey, e.target.value);
2289
+ },
2290
+ children: [
2291
+ /* @__PURE__ */ jsx("option", { value: "", children: "\u2014" }),
2292
+ editOptions.map((option) => /* @__PURE__ */ jsx("option", { value: option, children: option }, option))
2293
+ ]
2294
+ }
2295
+ );
2296
+ }
2297
+ if (editType === "checkbox") {
2298
+ return /* @__PURE__ */ jsx(
2299
+ "input",
2300
+ {
2301
+ "aria-label": `New ${accessorKey}`,
2302
+ checked: Boolean(cellValue),
2303
+ className: "size-4 rounded border border-input",
2304
+ type: "checkbox",
2305
+ onChange: (e) => {
2306
+ onChangeValue(accessorKey, e.target.checked);
2307
+ }
2308
+ }
2309
+ );
2310
+ }
2311
+ return /* @__PURE__ */ jsx(
2312
+ "input",
2313
+ {
2314
+ value: editType === "number" ? cellValue ?? "" : typeof cellValue === "string" ? cellValue : "",
2315
+ "aria-label": `New ${accessorKey}`,
2316
+ className: "h-8 w-full rounded-md border border-input bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2317
+ type: editType === "number" ? "number" : editType === "date" ? "date" : "text",
2318
+ onChange: (e) => {
2319
+ onChangeValue(
2320
+ accessorKey,
2321
+ editType === "number" ? e.target.valueAsNumber : e.target.value
2322
+ );
2323
+ }
2324
+ }
2325
+ );
2326
+ }
2327
+ function DataTableTrailingRowInner({
2328
+ columns,
2329
+ onAdd
2330
+ }) {
2331
+ const [editing, setEditing] = React14.useState(false);
2332
+ const [values, setValues] = React14.useState({});
2333
+ const handleCancel = React14.useCallback(() => {
2334
+ setEditing(false);
2335
+ setValues({});
2336
+ }, []);
2337
+ const handleSave = React14.useCallback(() => {
2338
+ onAdd(values);
2339
+ setEditing(false);
2340
+ setValues({});
2341
+ }, [onAdd, values]);
2342
+ const handleKeyDown = React14.useCallback(
2343
+ (e) => {
2344
+ if (e.key === "Escape") {
2345
+ e.preventDefault();
2346
+ handleCancel();
2347
+ }
2348
+ },
2349
+ [handleCancel]
2350
+ );
2351
+ const handleChangeValue = React14.useCallback(
2352
+ (key, value) => {
2353
+ setValues((prev) => ({ ...prev, [key]: value }));
2354
+ },
2355
+ []
2356
+ );
2357
+ if (!editing) {
2358
+ return /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, children: /* @__PURE__ */ jsxs(
2359
+ "button",
2360
+ {
2361
+ className: "flex w-full items-center gap-2 px-4 py-2 text-sm text-muted-foreground hover:bg-muted/50 hover:text-foreground transition-colors",
2362
+ type: "button",
2363
+ onClick: () => {
2364
+ setEditing(true);
2365
+ },
2366
+ children: [
2367
+ /* @__PURE__ */ jsx(Plus, { className: "size-4" }),
2368
+ "Add row"
2369
+ ]
2370
+ }
2371
+ ) }) });
2372
+ }
2373
+ return /* @__PURE__ */ jsxs("tr", { onKeyDown: handleKeyDown, children: [
2374
+ columns.map((col) => {
2375
+ const accessorKey = "accessorKey" in col ? String(col.accessorKey) : col.id ?? "";
2376
+ const meta = col.meta;
2377
+ const editable = meta?.editable ?? false;
2378
+ const editType = meta?.editType ?? "text";
2379
+ const editOptions = meta?.editOptions ?? [];
2380
+ if (!editable || !accessorKey) {
2381
+ return /* @__PURE__ */ jsx("td", {}, accessorKey || col.id);
2382
+ }
2383
+ return /* @__PURE__ */ jsx("td", { className: "px-2 py-1", children: renderCellInput(accessorKey, editType, editOptions, values[accessorKey], handleChangeValue) }, accessorKey);
2384
+ }),
2385
+ /* @__PURE__ */ jsx("td", { className: "px-2 py-1", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
2386
+ /* @__PURE__ */ jsx(
2387
+ Button,
2388
+ {
2389
+ "aria-label": "Save new row",
2390
+ size: "icon",
2391
+ variant: "ghost",
2392
+ onClick: handleSave,
2393
+ children: /* @__PURE__ */ jsx(Check, { className: "size-4" })
2394
+ }
2395
+ ),
2396
+ /* @__PURE__ */ jsx(
2397
+ Button,
2398
+ {
2399
+ "aria-label": "Cancel new row",
2400
+ size: "icon",
2401
+ variant: "ghost",
2402
+ onClick: handleCancel,
2403
+ children: /* @__PURE__ */ jsx(X, { className: "size-4" })
2404
+ }
2405
+ )
2406
+ ] }) })
2407
+ ] });
2408
+ }
2409
+ var DataTableTrailingRow = DataTableTrailingRowInner;
2410
+
2411
+ // src/components/data-display/DataTable/DataTable.export.ts
2412
+ function escapeCSV(value) {
2413
+ let sanitized = value;
2414
+ if (/^[=+\-@\t\r]/.test(sanitized)) {
2415
+ sanitized = "'" + sanitized;
2416
+ }
2417
+ if (sanitized.includes(",") || sanitized.includes('"') || sanitized.includes("\n")) {
2418
+ return `"${sanitized.replaceAll('"', '""')}"`;
2419
+ }
2420
+ return sanitized;
2421
+ }
2422
+ function tableToCSV(table, options = {}) {
2423
+ const {
2424
+ includeHeaders = true,
2425
+ onlyVisibleColumns = true,
2426
+ onlyFilteredRows = false
2427
+ } = options;
2428
+ const columns = onlyVisibleColumns ? table.getVisibleLeafColumns() : table.getAllLeafColumns();
2429
+ const exportColumns = columns.filter((col) => col.id !== "select" && col.id !== "_row_number");
2430
+ const rows = onlyFilteredRows ? table.getFilteredRowModel().rows : table.getCoreRowModel().rows;
2431
+ const lines = [];
2432
+ if (includeHeaders) {
2433
+ const headerLine = exportColumns.map((col) => {
2434
+ const header = col.columnDef.header;
2435
+ return typeof header === "string" ? escapeCSV(header) : escapeCSV(col.id);
2436
+ }).join(",");
2437
+ lines.push(headerLine);
2438
+ }
2439
+ rows.forEach((row) => {
2440
+ const rowLine = exportColumns.map((col) => escapeCSV(String(row.getValue(col.id) ?? ""))).join(",");
2441
+ lines.push(rowLine);
2442
+ });
2443
+ return lines.join("\n");
2444
+ }
2445
+ function downloadFile(content, filename, mimeType) {
2446
+ const blob = new Blob([content], { type: mimeType });
2447
+ const url = URL.createObjectURL(blob);
2448
+ const link = document.createElement("a");
2449
+ link.href = url;
2450
+ link.download = filename;
2451
+ document.body.appendChild(link);
2452
+ link.click();
2453
+ document.body.removeChild(link);
2454
+ URL.revokeObjectURL(url);
2455
+ }
2456
+ function exportToCSV(table, filename = "export", options = {}) {
2457
+ const csv = tableToCSV(table, options);
2458
+ downloadFile(csv, `${filename}.csv`, "text/csv;charset=utf-8;");
2459
+ }
2460
+ async function exportToPDF(table, filename = "export", options = {}) {
2461
+ const {
2462
+ includeHeaders = true,
2463
+ onlyVisibleColumns = true,
2464
+ onlyFilteredRows = false
2465
+ } = options;
2466
+ try {
2467
+ const { default: jsPDF } = await import('./jspdf.node.min-CTWP225M.js');
2468
+ await import('./jspdf.plugin.autotable-AAE7PZKA.js');
2469
+ const columns = onlyVisibleColumns ? table.getVisibleLeafColumns() : table.getAllLeafColumns();
2470
+ const exportColumns = columns.filter((col) => col.id !== "select" && col.id !== "_row_number");
2471
+ const rows = onlyFilteredRows ? table.getFilteredRowModel().rows : table.getCoreRowModel().rows;
2472
+ const headers = exportColumns.map((col) => {
2473
+ const header = col.columnDef.header;
2474
+ return typeof header === "string" ? header : col.id;
2475
+ });
2476
+ const body = rows.map(
2477
+ (row) => exportColumns.map((col) => String(row.getValue(col.id) ?? ""))
2478
+ );
2479
+ const doc = new jsPDF({ orientation: "landscape" });
2480
+ const docWithAutoTable = doc;
2481
+ docWithAutoTable.autoTable({
2482
+ head: includeHeaders ? [headers] : void 0,
2483
+ body
2484
+ });
2485
+ doc.save(`${filename}.pdf`);
2486
+ } catch (error) {
2487
+ console.error("Failed to load jspdf libraries for PDF export:", error);
2488
+ throw error;
2489
+ }
2490
+ }
2491
+ async function exportToExcel(table, filename = "export", options = {}) {
2492
+ const {
2493
+ includeHeaders = true,
2494
+ onlyVisibleColumns = true,
2495
+ onlyFilteredRows = false
2496
+ } = options;
2497
+ try {
2498
+ const XLSX = await import('./xlsx-PWHBQ6NK.js');
2499
+ const columns = onlyVisibleColumns ? table.getVisibleLeafColumns() : table.getAllLeafColumns();
2500
+ const exportColumns = columns.filter((col) => col.id !== "select" && col.id !== "_row_number");
2501
+ const rows = onlyFilteredRows ? table.getFilteredRowModel().rows : table.getCoreRowModel().rows;
2502
+ const headers = exportColumns.map((col) => {
2503
+ const header = col.columnDef.header;
2504
+ return typeof header === "string" ? header : col.id;
2505
+ });
2506
+ const data = rows.map((row) => {
2507
+ const rowData = {};
2508
+ exportColumns.forEach((col, index) => {
2509
+ const key = headers[index] ?? col.id;
2510
+ rowData[key] = row.getValue(col.id);
2511
+ });
2512
+ return rowData;
2513
+ });
2514
+ const ws = XLSX.utils.json_to_sheet(data, {
2515
+ header: includeHeaders ? headers : void 0,
2516
+ skipHeader: !includeHeaders
2517
+ });
2518
+ const wb = XLSX.utils.book_new();
2519
+ XLSX.utils.book_append_sheet(wb, ws, "Data");
2520
+ XLSX.writeFile(wb, `${filename}.xlsx`);
2521
+ } catch (error) {
2522
+ console.error("Failed to load xlsx library for Excel export:", error);
2523
+ throw error;
2524
+ }
2525
+ }
2526
+
2527
+ // src/components/data-display/DataTable/filterGroupToColumnFilters.ts
2528
+ function toStr(val) {
2529
+ if (val == null) return "";
2530
+ if (typeof val === "string") return val;
2531
+ if (typeof val === "number" || typeof val === "boolean") return val.toString();
2532
+ return JSON.stringify(val);
2533
+ }
2534
+ function evaluateCondition(condition, cellValue) {
2535
+ const value = toStr(cellValue).toLowerCase();
2536
+ const filterValue = toStr(condition.value).toLowerCase();
2537
+ switch (condition.operator) {
2538
+ case "contains":
2539
+ return value.includes(filterValue);
2540
+ case "notContains":
2541
+ return !value.includes(filterValue);
2542
+ case "equals":
2543
+ return value === filterValue;
2544
+ case "notEquals":
2545
+ return value !== filterValue;
2546
+ case "startsWith":
2547
+ return value.startsWith(filterValue);
2548
+ case "endsWith":
2549
+ return value.endsWith(filterValue);
2550
+ case "isEmpty":
2551
+ return value === "";
2552
+ case "isNotEmpty":
2553
+ return value !== "";
2554
+ case "gt":
2555
+ return Number(cellValue) > Number(condition.value);
2556
+ case "gte":
2557
+ return Number(cellValue) >= Number(condition.value);
2558
+ case "lt":
2559
+ return Number(cellValue) < Number(condition.value);
2560
+ case "lte":
2561
+ return Number(cellValue) <= Number(condition.value);
2562
+ case "between":
2563
+ return Number(cellValue) >= Number(condition.value) && Number(cellValue) <= Number(condition.value2);
2564
+ case "before":
2565
+ return new Date(String(cellValue)) < new Date(String(condition.value));
2566
+ case "after":
2567
+ return new Date(String(cellValue)) > new Date(String(condition.value));
2568
+ case "dateBetween":
2569
+ return new Date(String(cellValue)) >= new Date(String(condition.value)) && new Date(String(cellValue)) <= new Date(String(condition.value2));
2570
+ case "in":
2571
+ return filterValue.split(",").map((v) => v.trim()).includes(value);
2572
+ case "notIn":
2573
+ return !filterValue.split(",").map((v) => v.trim()).includes(value);
2574
+ default:
2575
+ return true;
2576
+ }
2577
+ }
2578
+ function evaluateFilterGroup(group, getColumnValue) {
2579
+ if (group.conditions.length === 0) return true;
2580
+ const results = group.conditions.map((item) => {
2581
+ if (isFilterGroup(item)) {
2582
+ return evaluateFilterGroup(item, getColumnValue);
2583
+ }
2584
+ if (isFilterCondition(item)) {
2585
+ if (!item.column) return true;
2586
+ const cellValue = getColumnValue(item.column);
2587
+ return evaluateCondition(item, cellValue);
2588
+ }
2589
+ return true;
2590
+ });
2591
+ return group.logic === "AND" ? results.every(Boolean) : results.some(Boolean);
2592
+ }
2593
+ function useDataTableKeyboard({
2594
+ enableEditing,
2595
+ enableKeyboardNavigation,
2596
+ enableRowSelection,
2597
+ keyboardShortcuts,
2598
+ onCellFocus,
2599
+ startEdit,
2600
+ table,
2601
+ tableRef
2602
+ }) {
2603
+ const [focusedCell, setFocusedCell] = React14.useState(
2604
+ enableKeyboardNavigation ? { row: 0, col: 0 } : null
2605
+ );
2606
+ const computeNewPosition = React14.useCallback(
2607
+ (key, ctrlKey, currentRow, currentCol, totalRows, totalCols) => {
2608
+ const handlers = {
2609
+ ArrowDown: () => ({
2610
+ row: currentRow < totalRows - 1 ? currentRow + 1 : currentRow,
2611
+ col: currentCol,
2612
+ handled: currentRow < totalRows - 1
2613
+ }),
2614
+ ArrowLeft: () => ({
2615
+ row: currentRow,
2616
+ col: currentCol > 0 ? currentCol - 1 : currentCol,
2617
+ handled: currentCol > 0
2618
+ }),
2619
+ ArrowRight: () => ({
2620
+ row: currentRow,
2621
+ col: currentCol < totalCols - 1 ? currentCol + 1 : currentCol,
2622
+ handled: currentCol < totalCols - 1
2623
+ }),
2624
+ ArrowUp: () => ({
2625
+ row: currentRow > 0 ? currentRow - 1 : currentRow,
2626
+ col: currentCol,
2627
+ handled: currentRow > 0
2628
+ }),
2629
+ End: () => ({
2630
+ row: ctrlKey ? totalRows - 1 : currentRow,
2631
+ col: totalCols - 1,
2632
+ handled: true
2633
+ }),
2634
+ Home: () => ({
2635
+ row: ctrlKey ? 0 : currentRow,
2636
+ col: 0,
2637
+ handled: true
2638
+ }),
2639
+ PageDown: () => ({
2640
+ row: Math.min(currentRow + 10, totalRows - 1),
2641
+ col: currentCol,
2642
+ handled: true
2643
+ }),
2644
+ PageUp: () => ({
2645
+ row: Math.max(currentRow - 10, 0),
2646
+ col: currentCol,
2647
+ handled: true
2648
+ })
2649
+ };
2650
+ const handler = handlers[key];
2651
+ return handler ? handler() : { row: currentRow, col: currentCol, handled: false };
2652
+ },
2653
+ []
2654
+ );
2655
+ const tryKeyboardEdit = React14.useCallback(
2656
+ (rows, visibleColumns) => {
2657
+ if (!enableEditing || !focusedCell) return false;
2658
+ const row = rows[focusedCell.row];
2659
+ const column = visibleColumns[focusedCell.col];
2660
+ if (!row || !column) return false;
2661
+ const meta = isEditableColumnMeta(column.columnDef.meta) ? column.columnDef.meta : void 0;
2662
+ if (!meta?.editable) return false;
2663
+ startEdit(row.id, column.id, row.getValue(column.id), column);
2664
+ return true;
2665
+ },
2666
+ [enableEditing, focusedCell, startEdit]
2667
+ );
2668
+ const moveFocus = React14.useCallback(
2669
+ (newRow, newCol, visibleColumns) => {
2670
+ if (!focusedCell || newRow === focusedCell.row && newCol === focusedCell.col) return;
2671
+ setFocusedCell({ row: newRow, col: newCol });
2672
+ const cellSelector = `[data-row="${String(newRow)}"][data-col="${String(newCol)}"]`;
2673
+ const cell = tableRef.current?.querySelector(cellSelector);
2674
+ cell?.focus();
2675
+ if (onCellFocus) {
2676
+ const column = visibleColumns[newCol];
2677
+ if (column) onCellFocus(newRow, column.id);
2678
+ }
2679
+ },
2680
+ [focusedCell, onCellFocus, tableRef]
2681
+ );
2682
+ const handleKeyDown = React14.useCallback(
2683
+ (event) => {
2684
+ if (!enableKeyboardNavigation || !focusedCell) return;
2685
+ const rows = table.getRowModel().rows;
2686
+ const visibleColumns = table.getVisibleLeafColumns();
2687
+ if ((event.key === "Enter" || event.key === "F2") && tryKeyboardEdit(rows, visibleColumns)) {
2688
+ event.preventDefault();
2689
+ return;
2690
+ }
2691
+ const selectKey = keyboardShortcuts.select ?? " ";
2692
+ if (event.key === selectKey && enableRowSelection) {
2693
+ const row = rows[focusedCell.row];
2694
+ if (row) {
2695
+ event.preventDefault();
2696
+ row.toggleSelected();
2697
+ }
2698
+ return;
2699
+ }
2700
+ const { row: newRow, col: newCol, handled } = computeNewPosition(
2701
+ event.key,
2702
+ event.ctrlKey || event.metaKey,
2703
+ focusedCell.row,
2704
+ focusedCell.col,
2705
+ rows.length,
2706
+ visibleColumns.length
2707
+ );
2708
+ if (handled) {
2709
+ event.preventDefault();
2710
+ moveFocus(newRow, newCol, visibleColumns);
2711
+ }
2712
+ },
2713
+ [enableKeyboardNavigation, focusedCell, table, enableRowSelection, tryKeyboardEdit, moveFocus, computeNewPosition, keyboardShortcuts]
2714
+ );
2715
+ const handleCellFocus = React14.useCallback(
2716
+ (rowIndex, colIndex) => {
2717
+ if (!enableKeyboardNavigation) return;
2718
+ setFocusedCell({ row: rowIndex, col: colIndex });
2719
+ },
2720
+ [enableKeyboardNavigation]
2721
+ );
2722
+ return {
2723
+ focusedCell,
2724
+ handleCellFocus,
2725
+ handleKeyDown
2726
+ };
2727
+ }
2728
+
2729
+ // src/components/data-display/DataTable/useDataTable.ts
2730
+ var DEBOUNCE_MS = 150;
2731
+ function loadPersistedState(key, storage) {
2732
+ if (!key) return null;
2733
+ const store = storage ?? (typeof window !== "undefined" ? window.localStorage : null);
2734
+ if (!store) return null;
2735
+ try {
2736
+ const raw = store.getItem(`datatable-${key}`);
2737
+ if (!raw) return null;
2738
+ const parsed = JSON.parse(raw);
2739
+ if (parsed.v !== 1) return null;
2740
+ return parsed;
2741
+ } catch {
2742
+ return null;
2743
+ }
2744
+ }
2745
+ function useDebouncedCallback(callback, delay) {
2746
+ const timerRef = React14.useRef(null);
2747
+ React14.useEffect(() => {
2748
+ return () => {
2749
+ if (timerRef.current) clearTimeout(timerRef.current);
2750
+ };
2751
+ }, []);
2752
+ return React14.useCallback(
2753
+ (value) => {
2754
+ if (timerRef.current) clearTimeout(timerRef.current);
2755
+ timerRef.current = setTimeout(() => {
2756
+ callback(value);
2757
+ }, delay);
2758
+ },
2759
+ [callback, delay]
2760
+ );
2761
+ }
2762
+ function useDataTable(props, selectionColumn, rowNumberColumn = null) {
2763
+ const {
2764
+ advancedFilter,
2765
+ columnFilters: controlledColumnFilters,
2766
+ columnOrder: controlledColumnOrder,
2767
+ columnPinning: controlledColumnPinning,
2768
+ columnResizeMode = "onChange",
2769
+ columnSizing: controlledColumnSizing,
2770
+ columnVisibility: controlledColumnVisibility,
2771
+ columns,
2772
+ data,
2773
+ enableAdvancedFilter = false,
2774
+ enableClipboard = false,
2775
+ enableColumnAutoSize = false,
2776
+ enableColumnFilters = false,
2777
+ enableColumnOrdering = false,
2778
+ enableColumnPinning = false,
2779
+ enableColumnResizing = false,
2780
+ enableColumnVirtualization = false,
2781
+ enableEditing = false,
2782
+ enableFiltering = true,
2783
+ enableGrouping = false,
2784
+ enableKeyboardNavigation = false,
2785
+ enableMultiSort = false,
2786
+ enableVirtualization = false,
2787
+ enableRowPinning = false,
2788
+ enableRowSelection = false,
2789
+ enableSorting = true,
2790
+ enableTreeData = false,
2791
+ expanded: controlledExpanded,
2792
+ exportFilename = "export",
2793
+ getRowCanExpand,
2794
+ getSubRows,
2795
+ globalFilter: controlledGlobalFilter,
2796
+ grouping: controlledGrouping,
2797
+ initialColumnFilters,
2798
+ initialColumnPinning,
2799
+ initialGlobalFilter,
2800
+ initialPagination,
2801
+ initialSorting,
2802
+ keyboardShortcuts = {},
2803
+ manualFiltering = false,
2804
+ manualPagination = false,
2805
+ manualSorting = false,
2806
+ maxMultiSortColCount,
2807
+ onAdvancedFilterChange,
2808
+ onCellEdit,
2809
+ onCellEditCancel,
2810
+ onCellFocus,
2811
+ onColumnFiltersChange,
2812
+ onColumnOrderChange,
2813
+ onColumnPinningChange,
2814
+ onColumnSizingChange,
2815
+ onColumnVisibilityChange,
2816
+ onExpandedChange,
2817
+ onExport,
2818
+ onGlobalFilterChange,
2819
+ onGroupingChange,
2820
+ onPaginationChange,
2821
+ onRowPinningChange,
2822
+ onRowSelectionChange,
2823
+ onSelectionChange,
2824
+ onSortingChange,
2825
+ pageCount,
2826
+ pageSize = 10,
2827
+ persistenceKey,
2828
+ persistenceStorage,
2829
+ pagination: controlledPagination,
2830
+ rowPinning: controlledRowPinning,
2831
+ rowSelection: controlledRowSelection,
2832
+ showFooter = false,
2833
+ sorting: controlledSorting,
2834
+ treeExpandDepth = 1
2835
+ } = props;
2836
+ const [persisted] = React14.useState(() => loadPersistedState(persistenceKey, persistenceStorage));
2837
+ const [internalSorting, setInternalSorting] = React14.useState(
2838
+ initialSorting ?? persisted?.sorting ?? []
2839
+ );
2840
+ const [internalGlobalFilter, setInternalGlobalFilter] = React14.useState(
2841
+ initialGlobalFilter ?? ""
2842
+ );
2843
+ const [internalColumnFilters, setInternalColumnFilters] = React14.useState(initialColumnFilters ?? persisted?.columnFilters ?? []);
2844
+ const [internalColumnOrder, setInternalColumnOrder] = React14.useState(persisted?.columnOrder ?? []);
2845
+ const [internalColumnVisibility, setInternalColumnVisibility] = React14.useState(persisted?.columnVisibility ?? {});
2846
+ const [internalPagination, setInternalPagination] = React14.useState({
2847
+ pageIndex: initialPagination?.pageIndex ?? 0,
2848
+ pageSize: initialPagination?.pageSize ?? persisted?.pagination?.pageSize ?? pageSize
2849
+ });
2850
+ const [internalRowSelection, setInternalRowSelection] = React14.useState({});
2851
+ const [internalExpanded, setInternalExpanded] = React14.useState(enableTreeData && treeExpandDepth > 0 ? true : {});
2852
+ const [internalGrouping, setInternalGrouping] = React14.useState([]);
2853
+ const [internalColumnSizing, setInternalColumnSizing] = React14.useState(persisted?.columnSizing ?? {});
2854
+ const [internalColumnPinning, setInternalColumnPinning] = React14.useState(initialColumnPinning ?? persisted?.columnPinning ?? {});
2855
+ const [internalRowPinning, setInternalRowPinning] = React14.useState({ top: [], bottom: [] });
2856
+ const [internalAdvancedFilter, setInternalAdvancedFilter] = React14.useState({
2857
+ id: "root",
2858
+ logic: "AND",
2859
+ conditions: []
2860
+ });
2861
+ const tableRef = React14.useRef(null);
2862
+ const previousSelectionRef = React14.useRef(null);
2863
+ const [editingCell, setEditingCell] = React14.useState(null);
2864
+ const [editValue, setEditValue] = React14.useState("");
2865
+ const [editError, setEditError] = React14.useState(null);
2866
+ const editInputRef = React14.useRef(null);
2867
+ const [searchDisplayValue, setSearchDisplayValue] = React14.useState(controlledGlobalFilter ?? initialGlobalFilter ?? "");
2868
+ const filterUpdateFn = React14.useCallback(
2869
+ (value) => {
2870
+ if (onGlobalFilterChange) {
2871
+ onGlobalFilterChange(value);
2872
+ } else {
2873
+ setInternalGlobalFilter(value);
2874
+ }
2875
+ },
2876
+ [onGlobalFilterChange]
2877
+ );
2878
+ const debouncedFilterUpdate = useDebouncedCallback(filterUpdateFn, DEBOUNCE_MS);
2879
+ const sorting = controlledSorting ?? internalSorting;
2880
+ const globalFilter = controlledGlobalFilter ?? internalGlobalFilter;
2881
+ const columnFilters = controlledColumnFilters ?? internalColumnFilters;
2882
+ const columnOrder = controlledColumnOrder ?? internalColumnOrder;
2883
+ const columnVisibility = controlledColumnVisibility ?? internalColumnVisibility;
2884
+ const pagination = controlledPagination ?? internalPagination;
2885
+ const rowSelection = controlledRowSelection ?? internalRowSelection;
2886
+ const expanded = controlledExpanded ?? internalExpanded;
2887
+ const grouping = controlledGrouping ?? internalGrouping;
2888
+ const columnSizing = controlledColumnSizing ?? internalColumnSizing;
2889
+ const columnPinning = controlledColumnPinning ?? internalColumnPinning;
2890
+ const rowPinning = controlledRowPinning ?? internalRowPinning;
2891
+ const currentAdvancedFilter = advancedFilter ?? internalAdvancedFilter;
2892
+ const handleAdvancedFilterChange = React14.useCallback(
2893
+ (filter) => {
2894
+ if (onAdvancedFilterChange) {
2895
+ onAdvancedFilterChange(filter);
2896
+ } else {
2897
+ setInternalAdvancedFilter(filter);
2898
+ }
2899
+ },
2900
+ [onAdvancedFilterChange]
2901
+ );
2902
+ const handleRowSelectionChange = React14.useCallback(
2903
+ (updaterOrValue) => {
2904
+ const newValue = typeof updaterOrValue === "function" ? updaterOrValue(rowSelection) : updaterOrValue;
2905
+ if (onRowSelectionChange) {
2906
+ onRowSelectionChange(newValue);
2907
+ } else {
2908
+ setInternalRowSelection(newValue);
2909
+ }
2910
+ },
2911
+ [rowSelection, onRowSelectionChange]
2912
+ );
2913
+ const startEdit = React14.useCallback(
2914
+ (rowId, columnId, currentValue, column) => {
2915
+ if (!enableEditing) return;
2916
+ const meta = isEditableColumnMeta(column.columnDef.meta) ? column.columnDef.meta : void 0;
2917
+ if (!meta?.editable) return;
2918
+ setEditingCell({ rowId, columnId });
2919
+ setEditValue(currentValue);
2920
+ setEditError(null);
2921
+ },
2922
+ [enableEditing]
2923
+ );
2924
+ const cancelEdit = React14.useCallback(
2925
+ (row, column, oldValue) => {
2926
+ if (onCellEditCancel && editingCell) {
2927
+ onCellEditCancel({ row, column, oldValue });
2928
+ }
2929
+ setEditingCell(null);
2930
+ setEditValue("");
2931
+ setEditError(null);
2932
+ },
2933
+ [editingCell, onCellEditCancel]
2934
+ );
2935
+ const submitEdit = React14.useCallback(
2936
+ async (row, column, oldValue) => {
2937
+ const meta = isEditableColumnMeta(column.columnDef.meta) ? column.columnDef.meta : void 0;
2938
+ if (meta?.validate) {
2939
+ const validationError = meta.validate(editValue, row);
2940
+ if (validationError) {
2941
+ setEditError(validationError);
2942
+ return;
2943
+ }
2944
+ }
2945
+ if (onCellEdit) {
2946
+ const params = { row, column, value: editValue, oldValue };
2947
+ try {
2948
+ const result = await Promise.resolve(onCellEdit(params));
2949
+ if (!result) return;
2950
+ } catch {
2951
+ return;
2952
+ }
2953
+ }
2954
+ setEditingCell(null);
2955
+ setEditValue("");
2956
+ setEditError(null);
2957
+ },
2958
+ [editValue, onCellEdit]
2959
+ );
2960
+ const setEditInputRef = React14.useCallback((node) => {
2961
+ editInputRef.current = node;
2962
+ if (node) {
2963
+ node.focus();
2964
+ if (node instanceof HTMLInputElement) {
2965
+ node.select();
2966
+ }
2967
+ }
2968
+ }, []);
2969
+ const tableColumns = React14.useMemo(() => {
2970
+ const result = [];
2971
+ if (rowNumberColumn) result.push(rowNumberColumn);
2972
+ if (enableRowSelection && selectionColumn) result.push(selectionColumn);
2973
+ result.push(...columns);
2974
+ return result;
2975
+ }, [columns, enableRowSelection, rowNumberColumn, selectionColumn]);
2976
+ const filteredData = React14.useMemo(() => {
2977
+ if (!enableAdvancedFilter || currentAdvancedFilter.conditions.length === 0) return data;
2978
+ return data.filter((row) => {
2979
+ return evaluateFilterGroup(currentAdvancedFilter, (columnId) => {
2980
+ return row[columnId];
2981
+ });
2982
+ });
2983
+ }, [data, enableAdvancedFilter, currentAdvancedFilter]);
2984
+ const table = useReactTable({
2985
+ data: filteredData,
2986
+ columns: tableColumns,
2987
+ state: {
2988
+ sorting,
2989
+ globalFilter,
2990
+ grouping,
2991
+ columnFilters,
2992
+ columnOrder: enableColumnOrdering ? columnOrder : void 0,
2993
+ columnVisibility,
2994
+ columnPinning,
2995
+ rowPinning,
2996
+ pagination,
2997
+ rowSelection,
2998
+ expanded,
2999
+ columnSizing
3000
+ },
3001
+ enableGrouping,
3002
+ enableRowPinning,
3003
+ enableRowSelection,
3004
+ enableSorting,
3005
+ enableMultiSort,
3006
+ maxMultiSortColCount,
3007
+ enableFilters: enableFiltering || enableColumnFilters,
3008
+ enableGlobalFilter: enableFiltering,
3009
+ enableColumnFilters,
3010
+ enableColumnResizing,
3011
+ enableColumnPinning,
3012
+ columnResizeMode,
3013
+ manualPagination,
3014
+ manualSorting,
3015
+ manualFiltering,
3016
+ pageCount: manualPagination ? pageCount : void 0,
3017
+ getRowCanExpand,
3018
+ getSubRows: enableTreeData ? getSubRows : void 0,
3019
+ getCoreRowModel: getCoreRowModel(),
3020
+ getSortedRowModel: manualSorting ? void 0 : getSortedRowModel(),
3021
+ getFilteredRowModel: manualFiltering ? void 0 : getFilteredRowModel(),
3022
+ getGroupedRowModel: enableGrouping ? getGroupedRowModel() : void 0,
3023
+ getPaginationRowModel: manualPagination || enableVirtualization ? void 0 : getPaginationRowModel(),
3024
+ getExpandedRowModel: getExpandedRowModel(),
3025
+ getFacetedRowModel: getFacetedRowModel(),
3026
+ getFacetedUniqueValues: getFacetedUniqueValues(),
3027
+ onSortingChange: onSortingChange ?? setInternalSorting,
3028
+ onGlobalFilterChange: onGlobalFilterChange ?? setInternalGlobalFilter,
3029
+ onGroupingChange: onGroupingChange ?? setInternalGrouping,
3030
+ onColumnFiltersChange: onColumnFiltersChange ?? setInternalColumnFilters,
3031
+ onColumnOrderChange: enableColumnOrdering ? onColumnOrderChange ?? setInternalColumnOrder : void 0,
3032
+ onColumnVisibilityChange: onColumnVisibilityChange ?? setInternalColumnVisibility,
3033
+ onPaginationChange: onPaginationChange ?? setInternalPagination,
3034
+ onRowSelectionChange: handleRowSelectionChange,
3035
+ onExpandedChange: onExpandedChange ?? setInternalExpanded,
3036
+ onColumnSizingChange: onColumnSizingChange ?? setInternalColumnSizing,
3037
+ onColumnPinningChange: onColumnPinningChange ?? setInternalColumnPinning,
3038
+ onRowPinningChange: onRowPinningChange ?? setInternalRowPinning
3039
+ });
3040
+ const handleExport = React14.useCallback(
3041
+ async (format = "csv") => {
3042
+ const filename = typeof exportFilename === "function" ? exportFilename() : exportFilename;
3043
+ const options = { filename };
3044
+ if (onExport) {
3045
+ onExport(format, data, options);
3046
+ return;
3047
+ }
3048
+ if (format === "excel") {
3049
+ await exportToExcel(table, filename);
3050
+ } else if (format === "pdf") {
3051
+ await exportToPDF(table, filename);
3052
+ } else {
3053
+ exportToCSV(table, filename);
3054
+ }
3055
+ },
3056
+ [data, exportFilename, onExport, table]
3057
+ );
3058
+ React14.useEffect(() => {
3059
+ if (!onSelectionChange) return;
3060
+ const previousSelection = previousSelectionRef.current;
3061
+ previousSelectionRef.current = rowSelection;
3062
+ if (previousSelection === null && Object.keys(rowSelection).length === 0) return;
3063
+ if (previousSelection) {
3064
+ const prevKeys = Object.keys(previousSelection);
3065
+ const currKeys = Object.keys(rowSelection);
3066
+ if (prevKeys.length === currKeys.length && prevKeys.every((key) => key in rowSelection)) {
3067
+ return;
3068
+ }
3069
+ }
3070
+ const selectedRows = table.getSelectedRowModel().flatRows.map((row) => row.original);
3071
+ onSelectionChange(selectedRows);
3072
+ }, [onSelectionChange, rowSelection, table]);
3073
+ const { focusedCell, handleCellFocus, handleKeyDown } = useDataTableKeyboard({
3074
+ enableEditing,
3075
+ enableKeyboardNavigation,
3076
+ enableRowSelection,
3077
+ keyboardShortcuts,
3078
+ onCellFocus,
3079
+ startEdit,
3080
+ table,
3081
+ tableRef
3082
+ });
3083
+ const hasFooter = showFooter && tableColumns.some(
3084
+ (col) => "footer" in col && col.footer !== void 0
3085
+ );
3086
+ const getPinnedStyles = React14.useCallback(
3087
+ (column) => {
3088
+ if (!enableColumnPinning) return {};
3089
+ const isPinned = column.getIsPinned();
3090
+ if (!isPinned) return {};
3091
+ const isLeftPinned = isPinned === "left";
3092
+ const isRightPinned = isPinned === "right";
3093
+ return {
3094
+ position: "sticky",
3095
+ left: isLeftPinned ? `${String(column.getStart("left"))}px` : void 0,
3096
+ right: isRightPinned ? `${String(column.getAfter("right"))}px` : void 0,
3097
+ backgroundColor: "var(--surface-default)",
3098
+ zIndex: 1
3099
+ };
3100
+ },
3101
+ [enableColumnPinning]
3102
+ );
3103
+ const getPinnedAttribute = React14.useCallback(
3104
+ (column) => {
3105
+ if (!enableColumnPinning) return void 0;
3106
+ const isPinned = column.getIsPinned();
3107
+ return isPinned ? isPinned : void 0;
3108
+ },
3109
+ [enableColumnPinning]
3110
+ );
3111
+ const persistTimerRef = React14.useRef(null);
3112
+ React14.useEffect(() => {
3113
+ if (!persistenceKey) return;
3114
+ if (persistTimerRef.current) clearTimeout(persistTimerRef.current);
3115
+ persistTimerRef.current = setTimeout(() => {
3116
+ const storage = persistenceStorage ?? (typeof window !== "undefined" ? window.localStorage : null);
3117
+ if (!storage) return;
3118
+ try {
3119
+ const state = {
3120
+ v: 1,
3121
+ sorting,
3122
+ columnOrder: enableColumnOrdering ? columnOrder : void 0,
3123
+ columnVisibility,
3124
+ columnSizing,
3125
+ columnPinning,
3126
+ pagination: { pageSize: pagination.pageSize },
3127
+ columnFilters
3128
+ };
3129
+ storage.setItem(`datatable-${persistenceKey}`, JSON.stringify(state));
3130
+ } catch {
3131
+ }
3132
+ }, 500);
3133
+ return () => {
3134
+ if (persistTimerRef.current) clearTimeout(persistTimerRef.current);
3135
+ };
3136
+ }, [persistenceKey, persistenceStorage, sorting, columnOrder, enableColumnOrdering, columnVisibility, columnSizing, columnPinning, pagination.pageSize, columnFilters]);
3137
+ const autoSizeRunRef = React14.useRef(false);
3138
+ React14.useEffect(() => {
3139
+ if (!enableColumnAutoSize || autoSizeRunRef.current) return;
3140
+ const timer = setTimeout(() => {
3141
+ const tableEl = tableRef.current;
3142
+ if (!tableEl) return;
3143
+ const allColumns = table.getAllLeafColumns();
3144
+ const newSizing = {};
3145
+ for (const col of allColumns) {
3146
+ const cells = tableEl.querySelectorAll(`[data-column-id="${col.id}"]`);
3147
+ let maxWidth = 0;
3148
+ cells.forEach((cell) => {
3149
+ maxWidth = Math.max(maxWidth, cell.scrollWidth + 2);
3150
+ });
3151
+ if (maxWidth > 0) {
3152
+ const min = col.columnDef.minSize ?? 20;
3153
+ const max = col.columnDef.maxSize ?? 1e3;
3154
+ newSizing[col.id] = Math.min(Math.max(maxWidth, min), max);
3155
+ }
3156
+ }
3157
+ if (Object.keys(newSizing).length > 0) {
3158
+ table.setColumnSizing((prev) => ({ ...prev, ...newSizing }));
3159
+ }
3160
+ autoSizeRunRef.current = true;
3161
+ }, 0);
3162
+ return () => {
3163
+ clearTimeout(timer);
3164
+ };
3165
+ }, [enableColumnAutoSize, table, tableRef]);
3166
+ const handleCopy = React14.useCallback(
3167
+ (event) => {
3168
+ if (!enableClipboard) return;
3169
+ const selectedRows = table.getSelectedRowModel().flatRows;
3170
+ if (selectedRows.length > 0) {
3171
+ event.preventDefault();
3172
+ const visibleColumns = table.getVisibleLeafColumns();
3173
+ const headers = visibleColumns.filter((col) => col.id !== "select" && col.id !== "_row_number").map((col) => typeof col.columnDef.header === "string" ? col.columnDef.header : col.id);
3174
+ const rows = selectedRows.map(
3175
+ (row) => visibleColumns.filter((col) => col.id !== "select" && col.id !== "_row_number").map((col) => {
3176
+ const value = row.getValue(col.id);
3177
+ if (value == null) return "";
3178
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
3179
+ return "";
3180
+ })
3181
+ );
3182
+ const tsv = [headers.join(" "), ...rows.map((r) => r.join(" "))].join("\n");
3183
+ event.clipboardData.setData("text/plain", tsv);
3184
+ }
3185
+ },
3186
+ [enableClipboard, table]
3187
+ );
3188
+ const scrollContainerRef = React14.useRef(null);
3189
+ const rowVirtualizer = useVirtualizer({
3190
+ count: props.enableVirtualization ? table.getRowModel().rows.length : 0,
3191
+ enabled: props.enableVirtualization ?? false,
3192
+ estimateSize: () => props.estimateRowHeight ?? 35,
3193
+ getScrollElement: () => scrollContainerRef.current,
3194
+ overscan: props.overscan ?? 5
3195
+ });
3196
+ const visibleLeafColumns = table.getVisibleLeafColumns();
3197
+ const columnVirtualizer = useVirtualizer({
3198
+ count: enableColumnVirtualization ? visibleLeafColumns.length : 0,
3199
+ enabled: enableColumnVirtualization,
3200
+ estimateSize: (index) => visibleLeafColumns[index]?.getSize() ?? 150,
3201
+ getScrollElement: () => scrollContainerRef.current,
3202
+ horizontal: true,
3203
+ overscan: props.overscan ?? 3
3204
+ });
3205
+ return {
3206
+ cancelEdit,
3207
+ columnVirtualizer: enableColumnVirtualization ? columnVirtualizer : void 0,
3208
+ currentAdvancedFilter,
3209
+ debouncedFilterUpdate,
3210
+ editError,
3211
+ editingCell,
3212
+ editValue,
3213
+ focusedCell,
3214
+ getPinnedAttribute,
3215
+ getPinnedStyles,
3216
+ handleAdvancedFilterChange,
3217
+ handleCellFocus,
3218
+ handleCopy,
3219
+ handleExport,
3220
+ handleKeyDown,
3221
+ hasFooter,
3222
+ pagination,
3223
+ rowVirtualizer: props.enableVirtualization ? rowVirtualizer : void 0,
3224
+ scrollContainerRef,
3225
+ searchDisplayValue,
3226
+ setEditInputRef,
3227
+ setEditValue,
3228
+ setInternalPagination,
3229
+ setSearchDisplayValue,
3230
+ startEdit,
3231
+ submitEdit,
3232
+ table,
3233
+ tableColumns,
3234
+ tableRef
3235
+ };
3236
+ }
3237
+ function buildEditKey(rowIndex, columnId) {
3238
+ return `${String(rowIndex)}:${columnId}`;
3239
+ }
3240
+ function useDataTableBatchEditing({
3241
+ enabled,
3242
+ selectedCells,
3243
+ table
3244
+ }) {
3245
+ const [pendingEdits, setPendingEdits] = React14.useState(
3246
+ () => /* @__PURE__ */ new Map()
3247
+ );
3248
+ const applyBatchEdit = React14.useCallback(
3249
+ (columnId, value) => {
3250
+ if (!enabled) return;
3251
+ const column = table.getColumn(columnId);
3252
+ if (!column) return;
3253
+ const meta = column.columnDef.meta;
3254
+ if (!meta?.editable) return;
3255
+ const visibleColumns = table.getVisibleLeafColumns();
3256
+ const columnIndex = visibleColumns.findIndex((c) => c.id === columnId);
3257
+ if (columnIndex === -1) return;
3258
+ const matchingCells = selectedCells.filter(
3259
+ (cell) => cell.col === columnIndex
3260
+ );
3261
+ if (matchingCells.length === 0) return;
3262
+ setPendingEdits((prev) => {
3263
+ const next = new Map(prev);
3264
+ for (const cell of matchingCells) {
3265
+ next.set(buildEditKey(cell.row, columnId), value);
3266
+ }
3267
+ return next;
3268
+ });
3269
+ },
3270
+ [enabled, selectedCells, table]
3271
+ );
3272
+ const clearBatchEdit = React14.useCallback(() => {
3273
+ setPendingEdits(/* @__PURE__ */ new Map());
3274
+ }, []);
3275
+ return {
3276
+ applyBatchEdit,
3277
+ clearBatchEdit,
3278
+ pendingEdits
3279
+ };
3280
+ }
3281
+ function normalizeRange(range) {
3282
+ return {
3283
+ endCol: Math.max(range.startCol, range.endCol),
3284
+ endRow: Math.max(range.startRow, range.endRow),
3285
+ startCol: Math.min(range.startCol, range.endCol),
3286
+ startRow: Math.min(range.startRow, range.endRow)
3287
+ };
3288
+ }
3289
+ function expandRange(range) {
3290
+ const normalized = normalizeRange(range);
3291
+ const cells = [];
3292
+ for (let row = normalized.startRow; row <= normalized.endRow; row++) {
3293
+ for (let col = normalized.startCol; col <= normalized.endCol; col++) {
3294
+ cells.push({ colIndex: col, rowIndex: row });
3295
+ }
3296
+ }
3297
+ return cells;
3298
+ }
3299
+ function useDataTableCellSelection({
3300
+ colCount,
3301
+ enabled,
3302
+ onSelectionChange,
3303
+ rowCount
3304
+ }) {
3305
+ const [state, setState] = React14.useState({
3306
+ colCount,
3307
+ range: null,
3308
+ rowCount
3309
+ });
3310
+ const isDraggingRef = React14.useRef(false);
3311
+ const anchorRef = React14.useRef(null);
3312
+ const selection = state.rowCount === rowCount && state.colCount === colCount ? state.range : null;
3313
+ const updateSelection = React14.useCallback(
3314
+ (range) => {
3315
+ setState({ colCount, range, rowCount });
3316
+ },
3317
+ [colCount, rowCount]
3318
+ );
3319
+ const notifySelectionChange = React14.useCallback(
3320
+ (range) => {
3321
+ if (!onSelectionChange) return;
3322
+ const cells = range ? expandRange(range) : [];
3323
+ onSelectionChange(cells);
3324
+ },
3325
+ [onSelectionChange]
3326
+ );
3327
+ const clearSelection = React14.useCallback(() => {
3328
+ updateSelection(null);
3329
+ anchorRef.current = null;
3330
+ notifySelectionChange(null);
3331
+ }, [updateSelection, notifySelectionChange]);
3332
+ const getSelectedCells = React14.useCallback(() => {
3333
+ if (!selection) return [];
3334
+ return expandRange(selection);
3335
+ }, [selection]);
3336
+ const isSelected = React14.useCallback(
3337
+ (rowIndex, colIndex) => {
3338
+ if (!selection) return false;
3339
+ const normalized = normalizeRange(selection);
3340
+ return rowIndex >= normalized.startRow && rowIndex <= normalized.endRow && colIndex >= normalized.startCol && colIndex <= normalized.endCol;
3341
+ },
3342
+ [selection]
3343
+ );
3344
+ const handleMouseDown = React14.useCallback(
3345
+ (rowIndex, colIndex, event) => {
3346
+ if (!enabled) return;
3347
+ if (event.shiftKey && anchorRef.current) {
3348
+ const newRange = {
3349
+ endCol: colIndex,
3350
+ endRow: rowIndex,
3351
+ startCol: anchorRef.current.col,
3352
+ startRow: anchorRef.current.row
3353
+ };
3354
+ updateSelection(newRange);
3355
+ notifySelectionChange(newRange);
3356
+ } else {
3357
+ anchorRef.current = { col: colIndex, row: rowIndex };
3358
+ const newRange = {
3359
+ endCol: colIndex,
3360
+ endRow: rowIndex,
3361
+ startCol: colIndex,
3362
+ startRow: rowIndex
3363
+ };
3364
+ updateSelection(newRange);
3365
+ isDraggingRef.current = true;
3366
+ notifySelectionChange(newRange);
3367
+ }
3368
+ },
3369
+ [enabled, updateSelection, notifySelectionChange]
3370
+ );
3371
+ const handleMouseMove = React14.useCallback(
3372
+ (rowIndex, colIndex) => {
3373
+ if (!enabled || !isDraggingRef.current || !anchorRef.current) return;
3374
+ const newRange = {
3375
+ endCol: colIndex,
3376
+ endRow: rowIndex,
3377
+ startCol: anchorRef.current.col,
3378
+ startRow: anchorRef.current.row
3379
+ };
3380
+ updateSelection(newRange);
3381
+ notifySelectionChange(newRange);
3382
+ },
3383
+ [enabled, updateSelection, notifySelectionChange]
3384
+ );
3385
+ const handleMouseUp = React14.useCallback(() => {
3386
+ isDraggingRef.current = false;
3387
+ }, []);
3388
+ React14.useEffect(() => {
3389
+ if (!enabled) return;
3390
+ const handleKeyDown = (event) => {
3391
+ const isCtrlOrMeta = event.ctrlKey || event.metaKey;
3392
+ if (isCtrlOrMeta && event.key === "a" && rowCount > 0 && colCount > 0) {
3393
+ event.preventDefault();
3394
+ const allRange = {
3395
+ endCol: colCount - 1,
3396
+ endRow: rowCount - 1,
3397
+ startCol: 0,
3398
+ startRow: 0
3399
+ };
3400
+ anchorRef.current = { col: 0, row: 0 };
3401
+ updateSelection(allRange);
3402
+ notifySelectionChange(allRange);
3403
+ }
3404
+ };
3405
+ const handleGlobalMouseUp = () => {
3406
+ isDraggingRef.current = false;
3407
+ };
3408
+ document.addEventListener("keydown", handleKeyDown);
3409
+ window.addEventListener("mouseup", handleGlobalMouseUp);
3410
+ return () => {
3411
+ document.removeEventListener("keydown", handleKeyDown);
3412
+ window.removeEventListener("mouseup", handleGlobalMouseUp);
3413
+ };
3414
+ }, [enabled, rowCount, colCount, updateSelection, notifySelectionChange]);
3415
+ return {
3416
+ clearSelection,
3417
+ getSelectedCells,
3418
+ handleMouseDown,
3419
+ handleMouseMove,
3420
+ handleMouseUp,
3421
+ isSelected,
3422
+ selection
3423
+ };
3424
+ }
3425
+ var DEFAULT_MAX_SIZE = 50;
3426
+ function useDataTableHistory({
3427
+ containerRef,
3428
+ maxSize = DEFAULT_MAX_SIZE,
3429
+ onApply
3430
+ } = {}) {
3431
+ const [undoStack, setUndoStack] = React14.useState([]);
3432
+ const [redoStack, setRedoStack] = React14.useState([]);
3433
+ const pushEdit = React14.useCallback(
3434
+ (entry) => {
3435
+ setUndoStack((prev) => {
3436
+ const next = [...prev, entry];
3437
+ if (next.length > maxSize) {
3438
+ return next.slice(next.length - maxSize);
3439
+ }
3440
+ return next;
3441
+ });
3442
+ setRedoStack([]);
3443
+ },
3444
+ [maxSize]
3445
+ );
3446
+ const undoStackRef = React14.useRef(undoStack);
3447
+ const redoStackRef = React14.useRef(redoStack);
3448
+ const onApplyRef = React14.useRef(onApply);
3449
+ React14.useEffect(() => {
3450
+ undoStackRef.current = undoStack;
3451
+ }, [undoStack]);
3452
+ React14.useEffect(() => {
3453
+ redoStackRef.current = redoStack;
3454
+ }, [redoStack]);
3455
+ React14.useEffect(() => {
3456
+ onApplyRef.current = onApply;
3457
+ }, [onApply]);
3458
+ const undo = React14.useCallback(() => {
3459
+ const entry = undoStackRef.current.at(-1);
3460
+ if (!entry) return;
3461
+ setUndoStack((prev) => prev.slice(0, -1));
3462
+ setRedoStack((prev) => [...prev, entry]);
3463
+ onApplyRef.current?.(entry, "undo");
3464
+ }, []);
3465
+ const redo = React14.useCallback(() => {
3466
+ const entry = redoStackRef.current.at(-1);
3467
+ if (!entry) return;
3468
+ setRedoStack((prev) => prev.slice(0, -1));
3469
+ setUndoStack((prev) => [...prev, entry]);
3470
+ onApplyRef.current?.(entry, "redo");
3471
+ }, []);
3472
+ const clear = React14.useCallback(() => {
3473
+ setUndoStack([]);
3474
+ setRedoStack([]);
3475
+ }, []);
3476
+ React14.useEffect(() => {
3477
+ if (!onApplyRef.current) return;
3478
+ function handleKeyDown(event) {
3479
+ if (containerRef?.current && !containerRef.current.contains(document.activeElement)) {
3480
+ return;
3481
+ }
3482
+ const isCtrlOrMeta = event.ctrlKey || event.metaKey;
3483
+ if (!isCtrlOrMeta) return;
3484
+ if ((event.key === "z" || event.key === "Z") && event.shiftKey) {
3485
+ event.preventDefault();
3486
+ redo();
3487
+ return;
3488
+ }
3489
+ if (event.key === "y" || event.key === "Y") {
3490
+ event.preventDefault();
3491
+ redo();
3492
+ return;
3493
+ }
3494
+ if (event.key === "z" && !event.shiftKey) {
3495
+ event.preventDefault();
3496
+ undo();
3497
+ }
3498
+ }
3499
+ document.addEventListener("keydown", handleKeyDown);
3500
+ return () => {
3501
+ document.removeEventListener("keydown", handleKeyDown);
3502
+ };
3503
+ }, [containerRef, onApply, redo, undo]);
3504
+ return {
3505
+ canRedo: redoStack.length > 0,
3506
+ canUndo: undoStack.length > 0,
3507
+ clear,
3508
+ pushEdit,
3509
+ redo,
3510
+ undo
3511
+ };
3512
+ }
3513
+ function useDataTableInfiniteScroll({
3514
+ enabled,
3515
+ hasNextPage,
3516
+ isFetching,
3517
+ onLoadMore,
3518
+ rootMargin = "200px"
3519
+ }) {
3520
+ const observerRef = React14.useRef(null);
3521
+ const sentinelNodeRef = React14.useRef(null);
3522
+ const onLoadMoreRef = React14.useRef(onLoadMore);
3523
+ React14.useEffect(() => {
3524
+ onLoadMoreRef.current = onLoadMore;
3525
+ }, [onLoadMore]);
3526
+ const disconnectObserver = React14.useCallback(() => {
3527
+ if (observerRef.current) {
3528
+ observerRef.current.disconnect();
3529
+ observerRef.current = null;
3530
+ }
3531
+ }, []);
3532
+ React14.useEffect(() => {
3533
+ if (!enabled || !hasNextPage || isFetching) {
3534
+ disconnectObserver();
3535
+ return;
3536
+ }
3537
+ const observer = new IntersectionObserver(
3538
+ (entries) => {
3539
+ const entry = entries[0];
3540
+ if (entry?.isIntersecting) {
3541
+ onLoadMoreRef.current();
3542
+ }
3543
+ },
3544
+ { rootMargin }
3545
+ );
3546
+ observerRef.current = observer;
3547
+ if (sentinelNodeRef.current) {
3548
+ observer.observe(sentinelNodeRef.current);
3549
+ }
3550
+ return () => {
3551
+ observer.disconnect();
3552
+ };
3553
+ }, [disconnectObserver, enabled, hasNextPage, isFetching, rootMargin]);
3554
+ const sentinelRef = React14.useCallback(
3555
+ (node) => {
3556
+ if (sentinelNodeRef.current && observerRef.current) {
3557
+ observerRef.current.unobserve(sentinelNodeRef.current);
3558
+ }
3559
+ sentinelNodeRef.current = node;
3560
+ if (node && observerRef.current) {
3561
+ observerRef.current.observe(node);
3562
+ }
3563
+ },
3564
+ []
3565
+ );
3566
+ return {
3567
+ isLoading: isFetching,
3568
+ sentinelRef
3569
+ };
3570
+ }
3571
+ function parseClipboardText(text) {
3572
+ const lines = text.replaceAll(/\r\n?/g, "\n").trimEnd().split("\n");
3573
+ const delimiter = lines.some((line) => line.includes(" ")) ? " " : ",";
3574
+ return lines.map((line) => line.split(delimiter));
3575
+ }
3576
+ function mapRowToCells(parsedRow, targetRowIndex, startCol, visibleColumns) {
3577
+ const cells = [];
3578
+ let editableColOffset = 0;
3579
+ for (const value of parsedRow) {
3580
+ let targetColIndex = startCol + editableColOffset;
3581
+ while (targetColIndex < visibleColumns.length) {
3582
+ const col = visibleColumns[targetColIndex];
3583
+ if (!col) break;
3584
+ const meta2 = col.columnDef.meta;
3585
+ if (meta2?.editable) break;
3586
+ targetColIndex++;
3587
+ editableColOffset++;
3588
+ }
3589
+ const column = visibleColumns[targetColIndex];
3590
+ if (!column) continue;
3591
+ const meta = column.columnDef.meta;
3592
+ if (!meta?.editable) continue;
3593
+ cells.push({ columnId: column.id, rowIndex: targetRowIndex, value });
3594
+ editableColOffset++;
3595
+ }
3596
+ return cells;
3597
+ }
3598
+ function useDataTablePaste({
3599
+ enabled,
3600
+ focusedCell,
3601
+ onPaste,
3602
+ table
3603
+ }) {
3604
+ const handlePaste = React14.useCallback(
3605
+ (event) => {
3606
+ if (!enabled || !focusedCell || !onPaste) return;
3607
+ const text = event.clipboardData.getData("text/plain");
3608
+ if (!text) return;
3609
+ event.preventDefault();
3610
+ const parsed = parseClipboardText(text);
3611
+ const rows = table.getRowModel().rows;
3612
+ const visibleColumns = table.getVisibleLeafColumns();
3613
+ const cells = [];
3614
+ for (const [rowOffset, parsedRow] of parsed.entries()) {
3615
+ const targetRowIndex = focusedCell.row + rowOffset;
3616
+ const targetRow = rows[targetRowIndex];
3617
+ if (!targetRow) continue;
3618
+ const rowCells = mapRowToCells(parsedRow, targetRowIndex, focusedCell.col, visibleColumns);
3619
+ cells.push(...rowCells);
3620
+ }
3621
+ if (cells.length > 0) {
3622
+ onPaste({ cells });
3623
+ }
3624
+ },
3625
+ [enabled, focusedCell, onPaste, table]
3626
+ );
3627
+ return {
3628
+ handlePaste
3629
+ };
3630
+ }
3631
+ function useDataTableRowEditing({
3632
+ enabled,
3633
+ onRowEdit,
3634
+ onRowEditCancel
3635
+ }) {
3636
+ const [editingRowId, setEditingRowId] = React14.useState(null);
3637
+ const [rowEditValues, setRowEditValues] = React14.useState({});
3638
+ const [oldValues, setOldValues] = React14.useState({});
3639
+ const editingRowRef = React14.useRef(null);
3640
+ const isRowEditing = React14.useCallback(
3641
+ (rowId) => editingRowId === rowId,
3642
+ [editingRowId]
3643
+ );
3644
+ const startRowEdit = React14.useCallback(
3645
+ (row) => {
3646
+ if (!enabled) return;
3647
+ const initialValues = {};
3648
+ const currentOldValues = {};
3649
+ for (const cell of row.getAllCells()) {
3650
+ const meta = cell.column.columnDef.meta;
3651
+ if (meta?.editable) {
3652
+ const value = row.getValue(cell.column.id);
3653
+ initialValues[cell.column.id] = value;
3654
+ currentOldValues[cell.column.id] = value;
3655
+ }
3656
+ }
3657
+ editingRowRef.current = row;
3658
+ setEditingRowId(row.id);
3659
+ setRowEditValues(initialValues);
3660
+ setOldValues(currentOldValues);
3661
+ },
3662
+ [enabled]
3663
+ );
3664
+ const cancelRowEdit = React14.useCallback(() => {
3665
+ if (editingRowId === null) return;
3666
+ const row = editingRowRef.current;
3667
+ editingRowRef.current = null;
3668
+ setEditingRowId(null);
3669
+ setRowEditValues({});
3670
+ setOldValues({});
3671
+ if (row && onRowEditCancel) {
3672
+ onRowEditCancel({ row });
3673
+ }
3674
+ }, [editingRowId, onRowEditCancel]);
3675
+ const setRowEditValue = React14.useCallback(
3676
+ (columnId, value) => {
3677
+ setRowEditValues((prev) => ({ ...prev, [columnId]: value }));
3678
+ },
3679
+ []
3680
+ );
3681
+ const submitRowEdit = React14.useCallback(
3682
+ async (row) => {
3683
+ if (!enabled || editingRowId === null) return;
3684
+ if (onRowEdit) {
3685
+ const accepted = await onRowEdit({
3686
+ oldValues,
3687
+ row,
3688
+ values: rowEditValues
3689
+ });
3690
+ if (!accepted) {
3691
+ return;
3692
+ }
3693
+ }
3694
+ editingRowRef.current = null;
3695
+ setEditingRowId(null);
3696
+ setRowEditValues({});
3697
+ setOldValues({});
3698
+ },
3699
+ [enabled, editingRowId, oldValues, onRowEdit, rowEditValues]
3700
+ );
3701
+ return {
3702
+ cancelRowEdit,
3703
+ editingRowId,
3704
+ isRowEditing,
3705
+ rowEditValues,
3706
+ setRowEditValue,
3707
+ startRowEdit,
3708
+ submitRowEdit
3709
+ };
3710
+ }
3711
+ function cleanupDataAttributes(element) {
3712
+ const dragging = element.closest("table")?.querySelectorAll("[data-dragging]");
3713
+ const dragOver = element.closest("table")?.querySelectorAll("[data-drag-over]");
3714
+ dragging?.forEach((el) => {
3715
+ el.removeAttribute("data-dragging");
3716
+ });
3717
+ dragOver?.forEach((el) => {
3718
+ el.removeAttribute("data-drag-over");
3719
+ });
3720
+ }
3721
+ function useDataTableRowReordering({
3722
+ enabled,
3723
+ onRowReorder
3724
+ }) {
3725
+ const [draggedIndex, setDraggedIndex] = React14.useState(null);
3726
+ const [targetIndex, setTargetIndex] = React14.useState(null);
3727
+ const isDragging = draggedIndex !== null;
3728
+ const handleDragStart = React14.useCallback(
3729
+ (rowIndex, event) => {
3730
+ if (!enabled) return;
3731
+ setDraggedIndex(rowIndex);
3732
+ event.dataTransfer.effectAllowed = "move";
3733
+ event.currentTarget.setAttribute("data-dragging", "true");
3734
+ },
3735
+ [enabled]
3736
+ );
3737
+ const handleDragOver = React14.useCallback(
3738
+ (rowIndex, event) => {
3739
+ if (!enabled || draggedIndex === null) return;
3740
+ event.preventDefault();
3741
+ event.dataTransfer.dropEffect = "move";
3742
+ if (targetIndex !== null && targetIndex !== rowIndex) {
3743
+ const table = event.currentTarget.closest("table");
3744
+ const previousTarget = table?.querySelector("[data-drag-over]");
3745
+ previousTarget?.removeAttribute("data-drag-over");
3746
+ }
3747
+ setTargetIndex(rowIndex);
3748
+ event.currentTarget.setAttribute("data-drag-over", "true");
3749
+ },
3750
+ [enabled, draggedIndex, targetIndex]
3751
+ );
3752
+ const handleDrop = React14.useCallback(
3753
+ (rowIndex, event) => {
3754
+ if (!enabled || draggedIndex === null) return;
3755
+ event.preventDefault();
3756
+ cleanupDataAttributes(event.currentTarget);
3757
+ if (draggedIndex !== rowIndex && onRowReorder) {
3758
+ onRowReorder({ fromIndex: draggedIndex, toIndex: rowIndex });
3759
+ }
3760
+ setDraggedIndex(null);
3761
+ setTargetIndex(null);
3762
+ },
3763
+ [enabled, draggedIndex, onRowReorder]
3764
+ );
3765
+ const handleDragEnd = React14.useCallback(
3766
+ (_rowIndex, event) => {
3767
+ cleanupDataAttributes(event.currentTarget);
3768
+ setDraggedIndex(null);
3769
+ setTargetIndex(null);
3770
+ },
3771
+ []
3772
+ );
3773
+ const dragHandleProps = React14.useCallback(
3774
+ (rowIndex) => ({
3775
+ draggable: enabled,
3776
+ onDragEnd: (event) => {
3777
+ handleDragEnd(rowIndex, event);
3778
+ },
3779
+ onDragOver: (event) => {
3780
+ handleDragOver(rowIndex, event);
3781
+ },
3782
+ onDragStart: (event) => {
3783
+ handleDragStart(rowIndex, event);
3784
+ },
3785
+ onDrop: (event) => {
3786
+ handleDrop(rowIndex, event);
3787
+ }
3788
+ }),
3789
+ [enabled, handleDragEnd, handleDragOver, handleDragStart, handleDrop]
3790
+ );
3791
+ return {
3792
+ dragHandleProps,
3793
+ isDragging
3794
+ };
3795
+ }
3796
+ var DEFAULT_PAGE_INDEX = 0;
3797
+ var DEFAULT_PAGE_SIZE = 10;
3798
+ var DEFAULT_PREFIX = "dt_";
3799
+ var PARAM_FILTER = "filter";
3800
+ var PARAM_PAGE = "page";
3801
+ var PARAM_PAGE_SIZE = "pageSize";
3802
+ var PARAM_SEARCH = "search";
3803
+ var PARAM_SORT = "sort";
3804
+ function parseSortingParam(raw) {
3805
+ if (!raw) return [];
3806
+ return raw.split(",").reduce((acc, segment) => {
3807
+ const lastDot = segment.lastIndexOf(".");
3808
+ if (lastDot === -1) return acc;
3809
+ const id = segment.slice(0, lastDot);
3810
+ const direction = segment.slice(lastDot + 1);
3811
+ if (id && (direction === "asc" || direction === "desc")) {
3812
+ acc.push({ desc: direction === "desc", id });
3813
+ }
3814
+ return acc;
3815
+ }, []);
3816
+ }
3817
+ function parsePaginationParams(pageRaw, pageSizeRaw) {
3818
+ const pageIndex = pageRaw ? Math.max(0, Number.parseInt(pageRaw, 10) - 1) : DEFAULT_PAGE_INDEX;
3819
+ const pageSize = pageSizeRaw ? Math.max(1, Number.parseInt(pageSizeRaw, 10)) : DEFAULT_PAGE_SIZE;
3820
+ return {
3821
+ pageIndex: Number.isNaN(pageIndex) ? DEFAULT_PAGE_INDEX : pageIndex,
3822
+ pageSize: Number.isNaN(pageSize) ? DEFAULT_PAGE_SIZE : pageSize
3823
+ };
3824
+ }
3825
+ function parseColumnFiltersParam(raw) {
3826
+ if (!raw) return [];
3827
+ try {
3828
+ const parsed = JSON.parse(raw);
3829
+ if (!Array.isArray(parsed)) return [];
3830
+ return parsed.reduce((acc, item) => {
3831
+ if (item !== null && typeof item === "object" && "id" in item && "value" in item && typeof item.id === "string") {
3832
+ acc.push({ id: item.id, value: item.value });
3833
+ }
3834
+ return acc;
3835
+ }, []);
3836
+ } catch {
3837
+ return [];
3838
+ }
3839
+ }
3840
+ function serializeSorting(sorting) {
3841
+ return sorting.map((s) => `${s.id}.${s.desc ? "desc" : "asc"}`).join(",");
3842
+ }
3843
+ function serializeColumnFilters(filters) {
3844
+ if (filters.length === 0) return "";
3845
+ return JSON.stringify(filters.map((f) => ({ id: f.id, value: f.value })));
3846
+ }
3847
+ function readStateFromUrl(prefix) {
3848
+ const params = new URLSearchParams(window.location.search);
3849
+ return {
3850
+ columnFilters: parseColumnFiltersParam(params.get(`${prefix}${PARAM_FILTER}`)),
3851
+ globalFilter: params.get(`${prefix}${PARAM_SEARCH}`) ?? "",
3852
+ pagination: parsePaginationParams(
3853
+ params.get(`${prefix}${PARAM_PAGE}`),
3854
+ params.get(`${prefix}${PARAM_PAGE_SIZE}`)
3855
+ ),
3856
+ sorting: parseSortingParam(params.get(`${prefix}${PARAM_SORT}`))
3857
+ };
3858
+ }
3859
+ function writeStateToUrl(prefix, state) {
3860
+ const params = new URLSearchParams(window.location.search);
3861
+ setOrDelete(params, `${prefix}${PARAM_SORT}`, serializeSorting(state.sorting));
3862
+ setOrDelete(params, `${prefix}${PARAM_SEARCH}`, state.globalFilter);
3863
+ setOrDelete(params, `${prefix}${PARAM_FILTER}`, serializeColumnFilters(state.columnFilters));
3864
+ const pageValue = state.pagination.pageIndex > DEFAULT_PAGE_INDEX ? String(state.pagination.pageIndex + 1) : "";
3865
+ setOrDelete(params, `${prefix}${PARAM_PAGE}`, pageValue);
3866
+ const pageSizeValue = state.pagination.pageSize !== DEFAULT_PAGE_SIZE ? String(state.pagination.pageSize) : "";
3867
+ setOrDelete(params, `${prefix}${PARAM_PAGE_SIZE}`, pageSizeValue);
3868
+ const search = params.toString();
3869
+ const newUrl = `${window.location.pathname}${search ? `?${search}` : ""}`;
3870
+ window.history.replaceState(null, "", newUrl);
3871
+ }
3872
+ function setOrDelete(params, key, value) {
3873
+ if (value) {
3874
+ params.set(key, value);
3875
+ } else {
3876
+ params.delete(key);
3877
+ }
3878
+ }
3879
+ function useDataTableUrlState({
3880
+ enabled,
3881
+ prefix = DEFAULT_PREFIX
3882
+ }) {
3883
+ const initial = React14.useMemo(() => {
3884
+ if (!enabled || typeof window === "undefined") {
3885
+ return {
3886
+ columnFilters: [],
3887
+ globalFilter: "",
3888
+ pagination: { pageIndex: DEFAULT_PAGE_INDEX, pageSize: DEFAULT_PAGE_SIZE },
3889
+ sorting: []
3890
+ };
3891
+ }
3892
+ return readStateFromUrl(prefix);
3893
+ }, [enabled, prefix]);
3894
+ const updateUrl = React14.useCallback(
3895
+ (state) => {
3896
+ if (!enabled || typeof window === "undefined") return;
3897
+ writeStateToUrl(prefix, state);
3898
+ },
3899
+ [enabled, prefix]
3900
+ );
3901
+ return {
3902
+ initialColumnFilters: initial.columnFilters,
3903
+ initialGlobalFilter: initial.globalFilter,
3904
+ initialPagination: initial.pagination,
3905
+ initialSorting: initial.sorting,
3906
+ updateUrl
3907
+ };
3908
+ }
3909
+ function DataTable(props) {
3910
+ const {
3911
+ advancedFilterColumns = [],
3912
+ bulkActions,
3913
+ cellClassName,
3914
+ className,
3915
+ contextMenuItems,
3916
+ data,
3917
+ density: controlledDensity,
3918
+ editTrigger = "dblclick",
3919
+ emptyState,
3920
+ enableAdvancedFilter = false,
3921
+ enableBatchEditing = false,
3922
+ enableCellSelection = false,
3923
+ enableClipboard = false,
3924
+ enableColumnFilters = false,
3925
+ enableColumnMenu = false,
3926
+ enableColumnOrdering = false,
3927
+ enableColumnPinning = false,
3928
+ enableColumnResizing = false,
3929
+ enableColumnVirtualization = false,
3930
+ enableColumnVisibility = false,
3931
+ enableDensityToggle = false,
3932
+ enableEditing = false,
3933
+ enableExport = false,
3934
+ enableFillHandle = false,
3935
+ enableFilterChips = false,
3936
+ enableFiltering = true,
3937
+ enableFind = false,
3938
+ enableGrouping = false,
3939
+ enableInfiniteScroll = false,
3940
+ enableKeyboardNavigation = false,
3941
+ enablePagination = true,
3942
+ enablePaste = false,
3943
+ enablePrint = false,
3944
+ enableResponsive = false,
3945
+ enableRowAnimation = false,
3946
+ enableRowColumnSpanning = false,
3947
+ enableRowEditing = false,
3948
+ enableRowNumbers = false,
3949
+ enableRowSelection = false,
3950
+ enableSearch = true,
3951
+ enableSearchHighlight = false,
3952
+ enableSidePanel = false,
3953
+ enableStatusBar = false,
3954
+ enableStickyHeader = false,
3955
+ enableStriping = false,
3956
+ enableTrailingRow = false,
3957
+ enableUndoRedo = false,
3958
+ enableUrlState = false,
3959
+ enableVirtualization = false,
3960
+ error = false,
3961
+ errorState,
3962
+ exportFormats = ["csv"],
3963
+ filterPresets,
3964
+ hasNextPage = false,
3965
+ isFetching = false,
3966
+ loading = false,
3967
+ loadingComponent,
3968
+ maxHeight,
3969
+ onAddRow,
3970
+ onCellFill,
3971
+ onCellSelectionChange,
3972
+ onDeleteFilterPreset,
3973
+ onDensityChange,
3974
+ onLoadMore,
3975
+ onPaginationChange,
3976
+ onPaste,
3977
+ onRowClick,
3978
+ onRowEdit,
3979
+ onRowEditCancel,
3980
+ onRowReorder,
3981
+ onSaveFilterPreset,
3982
+ onSidePanelOpenChange,
3983
+ onUndoRedo,
3984
+ pageSizeOptions = [10, 20, 50],
3985
+ renderColumnFilter,
3986
+ renderSubComponent,
3987
+ responsiveBreakpoint = 768,
3988
+ rowClassName,
3989
+ searchPlaceholder = "Search...",
3990
+ sidePanelContent,
3991
+ sidePanelOpen: controlledSidePanelOpen,
3992
+ statusBarItems,
3993
+ urlStatePrefix
3994
+ } = props;
3995
+ const [internalDensity, setInternalDensity] = React14.useState("default");
3996
+ const density = controlledDensity ?? internalDensity;
3997
+ const handleDensityChange = React14.useCallback(
3998
+ (newDensity) => {
3999
+ if (onDensityChange) {
4000
+ onDensityChange(newDensity);
4001
+ } else {
4002
+ setInternalDensity(newDensity);
4003
+ }
4004
+ },
4005
+ [onDensityChange]
4006
+ );
4007
+ const [findBarOpen, setFindBarOpen] = React14.useState(false);
4008
+ const [internalSidePanelOpen, setInternalSidePanelOpen] = React14.useState(false);
4009
+ const sidePanelOpen = controlledSidePanelOpen ?? internalSidePanelOpen;
4010
+ const setSidePanelOpen = React14.useCallback(
4011
+ (open) => {
4012
+ if (onSidePanelOpenChange) {
4013
+ onSidePanelOpenChange(open);
4014
+ } else {
4015
+ setInternalSidePanelOpen(open);
4016
+ }
4017
+ },
4018
+ [onSidePanelOpenChange]
4019
+ );
4020
+ const containerRef = React14.useRef(null);
4021
+ const isBelowBreakpoint = useMediaQuery(`(max-width: ${String(responsiveBreakpoint)}px)`);
4022
+ const showCardView = enableResponsive && isBelowBreakpoint;
4023
+ const selectionColumn = React14.useMemo(() => {
4024
+ if (!enableRowSelection) return null;
4025
+ return {
4026
+ id: "select",
4027
+ header: ({ table: table2 }) => /* @__PURE__ */ jsx(
4028
+ Checkbox,
4029
+ {
4030
+ checked: table2.getIsAllPageRowsSelected() || table2.getIsSomePageRowsSelected() && "indeterminate",
4031
+ "aria-label": "Select all",
4032
+ onCheckedChange: (value) => {
4033
+ table2.toggleAllPageRowsSelected(!!value);
4034
+ }
4035
+ }
4036
+ ),
4037
+ cell: ({ row }) => /* @__PURE__ */ jsx(
4038
+ Checkbox,
4039
+ {
4040
+ "aria-label": "Select row",
4041
+ checked: row.getIsSelected(),
4042
+ onCheckedChange: (value) => {
4043
+ row.toggleSelected(!!value);
4044
+ }
4045
+ }
4046
+ ),
4047
+ enableSorting: false,
4048
+ enableHiding: false,
4049
+ // Without an explicit size TanStack defaults to 150px, which the
4050
+ // 100%-width table then stretches even wider — a checkbox column
4051
+ // should be ~40px.
4052
+ size: 40,
4053
+ enableResizing: false
4054
+ };
4055
+ }, [enableRowSelection]);
4056
+ const rowNumberColumn = React14.useMemo(() => {
4057
+ if (!enableRowNumbers) return null;
4058
+ return {
4059
+ id: "_row_number",
4060
+ header: "#",
4061
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "text-muted-foreground tabular-nums text-right block text-xs", children: row.index + 1 }),
4062
+ size: 50,
4063
+ enableSorting: false,
4064
+ enableHiding: false,
4065
+ enableResizing: false,
4066
+ enableColumnFilter: false,
4067
+ enableGlobalFilter: false
4068
+ };
4069
+ }, [enableRowNumbers]);
4070
+ const urlState = useDataTableUrlState({
4071
+ enabled: enableUrlState,
4072
+ prefix: urlStatePrefix
4073
+ });
4074
+ const mergedProps = React14.useMemo(() => {
4075
+ if (!enableUrlState) return props;
4076
+ return {
4077
+ ...props,
4078
+ initialColumnFilters: props.initialColumnFilters ?? (urlState.initialColumnFilters.length > 0 ? urlState.initialColumnFilters : void 0),
4079
+ initialGlobalFilter: props.initialGlobalFilter ?? (urlState.initialGlobalFilter || void 0),
4080
+ initialPagination: props.initialPagination ?? (urlState.initialPagination.pageIndex > 0 || urlState.initialPagination.pageSize !== 10 ? urlState.initialPagination : void 0),
4081
+ initialSorting: props.initialSorting ?? (urlState.initialSorting.length > 0 ? urlState.initialSorting : void 0)
4082
+ };
4083
+ }, [enableUrlState, props]);
4084
+ const {
4085
+ cancelEdit,
4086
+ columnVirtualizer,
4087
+ currentAdvancedFilter,
4088
+ debouncedFilterUpdate,
4089
+ editError,
4090
+ editingCell,
4091
+ editValue,
4092
+ focusedCell,
4093
+ getPinnedAttribute,
4094
+ getPinnedStyles,
4095
+ handleAdvancedFilterChange,
4096
+ handleCellFocus,
4097
+ handleCopy,
4098
+ handleExport,
4099
+ handleKeyDown,
4100
+ hasFooter,
4101
+ pagination,
4102
+ rowVirtualizer,
4103
+ scrollContainerRef,
4104
+ searchDisplayValue,
4105
+ setEditInputRef,
4106
+ setEditValue,
4107
+ setInternalPagination,
4108
+ setSearchDisplayValue,
4109
+ startEdit,
4110
+ submitEdit,
4111
+ table,
4112
+ tableColumns,
4113
+ tableRef
4114
+ } = useDataTable(mergedProps, selectionColumn, rowNumberColumn);
4115
+ const historyOnApply = React14.useCallback(
4116
+ (entry, direction) => {
4117
+ if (!onUndoRedo) return;
4118
+ const value = direction === "undo" ? entry.oldValue : entry.newValue;
4119
+ onUndoRedo({ columnId: entry.columnId, rowId: entry.rowId, value }, direction);
4120
+ },
4121
+ [onUndoRedo]
4122
+ );
4123
+ useDataTableHistory({
4124
+ containerRef,
4125
+ onApply: enableUndoRedo ? historyOnApply : void 0
4126
+ });
4127
+ const cellSelection = useDataTableCellSelection({
4128
+ colCount: table.getVisibleLeafColumns().length,
4129
+ enabled: enableCellSelection,
4130
+ onSelectionChange: onCellSelectionChange,
4131
+ rowCount: table.getRowModel().rows.length
4132
+ });
4133
+ const noop = React14.useCallback(() => {
4134
+ }, []);
4135
+ const infiniteScroll = useDataTableInfiniteScroll({
4136
+ enabled: enableInfiniteScroll,
4137
+ hasNextPage,
4138
+ isFetching,
4139
+ onLoadMore: onLoadMore ?? noop
4140
+ });
4141
+ const { handlePaste } = useDataTablePaste({
4142
+ enabled: enablePaste,
4143
+ focusedCell,
4144
+ onPaste,
4145
+ table
4146
+ });
4147
+ useDataTableRowEditing({
4148
+ enabled: enableRowEditing,
4149
+ onRowEdit,
4150
+ onRowEditCancel
4151
+ });
4152
+ useDataTableBatchEditing({
4153
+ enabled: enableBatchEditing,
4154
+ selectedCells: cellSelection.getSelectedCells().map((c) => ({ col: c.colIndex, row: c.rowIndex })),
4155
+ table
4156
+ });
4157
+ const rowReordering = useDataTableRowReordering({
4158
+ enabled: props.enableRowReordering ?? false,
4159
+ onRowReorder: onRowReorder ? (params) => {
4160
+ onRowReorder(params.fromIndex, params.toIndex);
4161
+ } : void 0
4162
+ });
4163
+ const tableState = table.getState();
4164
+ const currentSorting = tableState.sorting;
4165
+ const currentPagination = tableState.pagination;
4166
+ const currentColumnFilters = tableState.columnFilters;
4167
+ const currentGlobalFilter = tableState.globalFilter;
4168
+ const urlUpdateUrl = urlState.updateUrl;
4169
+ React14.useEffect(() => {
4170
+ if (!enableUrlState) return;
4171
+ urlUpdateUrl({
4172
+ columnFilters: currentColumnFilters,
4173
+ globalFilter: currentGlobalFilter,
4174
+ pagination: currentPagination,
4175
+ sorting: currentSorting
4176
+ });
4177
+ }, [enableUrlState, urlUpdateUrl, currentSorting, currentPagination, currentColumnFilters, currentGlobalFilter]);
4178
+ const handlePrint = React14.useCallback(() => {
4179
+ window.print();
4180
+ }, []);
4181
+ React14.useEffect(() => {
4182
+ if (!enableFind) return;
4183
+ function handleFindKeyDown(e) {
4184
+ const isCtrlOrMeta = e.ctrlKey || e.metaKey;
4185
+ if (isCtrlOrMeta && e.key === "f" && containerRef.current?.contains(document.activeElement)) {
4186
+ e.preventDefault();
4187
+ setFindBarOpen(true);
4188
+ }
4189
+ }
4190
+ document.addEventListener("keydown", handleFindKeyDown);
4191
+ return () => {
4192
+ document.removeEventListener("keydown", handleFindKeyDown);
4193
+ };
4194
+ }, [enableFind]);
4195
+ const handleFindBarClose = React14.useCallback(() => {
4196
+ setFindBarOpen(false);
4197
+ }, []);
4198
+ if (loading || error || data.length === 0) {
4199
+ return /* @__PURE__ */ jsx(
4200
+ DataTableEmptyState,
4201
+ {
4202
+ className,
4203
+ emptyState,
4204
+ error,
4205
+ errorState,
4206
+ loading,
4207
+ loadingComponent
4208
+ }
4209
+ );
4210
+ }
4211
+ return /* @__PURE__ */ jsxs(
4212
+ "div",
4213
+ {
4214
+ ref: containerRef,
4215
+ className: cn(dataTableVariants({ density }), "relative", className),
4216
+ "data-slot": "data-table",
4217
+ children: [
4218
+ /* @__PURE__ */ jsx("div", { className: "print:hidden", children: /* @__PURE__ */ jsx(
4219
+ DataTableToolbar,
4220
+ {
4221
+ advancedFilterColumns,
4222
+ columns: enableColumnVisibility ? table.getAllLeafColumns() : void 0,
4223
+ currentAdvancedFilter,
4224
+ debouncedFilterUpdate,
4225
+ density,
4226
+ enableAdvancedFilter,
4227
+ enableColumnVisibility,
4228
+ enableDensityToggle,
4229
+ enableExport,
4230
+ enableFiltering,
4231
+ enablePrint,
4232
+ enableSearch,
4233
+ exportFormats,
4234
+ filterPresets,
4235
+ searchDisplayValue,
4236
+ searchPlaceholder,
4237
+ setSearchDisplayValue,
4238
+ onAdvancedFilterChange: handleAdvancedFilterChange,
4239
+ onDeleteFilterPreset,
4240
+ onDensityChange: handleDensityChange,
4241
+ onExport: handleExport,
4242
+ onPrint: handlePrint,
4243
+ onSaveFilterPreset
4244
+ }
4245
+ ) }),
4246
+ enableFind && /* @__PURE__ */ jsx("div", { className: "print:hidden", children: /* @__PURE__ */ jsx(
4247
+ DataTableFindBar,
4248
+ {
4249
+ open: findBarOpen,
4250
+ tableRef,
4251
+ onClose: handleFindBarClose
4252
+ }
4253
+ ) }),
4254
+ enableFilterChips && /* @__PURE__ */ jsx("div", { className: "print:hidden", children: /* @__PURE__ */ jsx(DataTableFilterChips, { table }) }),
4255
+ bulkActions && bulkActions.length > 0 && enableRowSelection && /* @__PURE__ */ jsx("div", { className: "print:hidden", children: /* @__PURE__ */ jsx(
4256
+ DataTableBulkActions,
4257
+ {
4258
+ actions: bulkActions,
4259
+ table
4260
+ }
4261
+ ) }),
4262
+ showCardView ? /* @__PURE__ */ jsx(
4263
+ DataTableCardView,
4264
+ {
4265
+ rowClassName,
4266
+ table,
4267
+ onRowClick
4268
+ }
4269
+ ) : (
4270
+ /* Table View */
4271
+ /* @__PURE__ */ jsxs(
4272
+ "div",
4273
+ {
4274
+ ref: enableVirtualization || enableColumnVirtualization ? scrollContainerRef : void 0,
4275
+ style: (enableVirtualization || enableColumnVirtualization || enableStickyHeader) && maxHeight ? {
4276
+ maxHeight: typeof maxHeight === "number" ? `${String(maxHeight)}px` : maxHeight,
4277
+ overflow: "auto"
4278
+ } : void 0,
4279
+ className: "rounded-md border print:border-none print:w-full print:max-h-none print:overflow-visible",
4280
+ "data-slot": "data-table-container",
4281
+ children: [
4282
+ /* @__PURE__ */ jsxs(
4283
+ Table,
4284
+ {
4285
+ ref: tableRef,
4286
+ "aria-colcount": enableKeyboardNavigation ? table.getVisibleLeafColumns().length : void 0,
4287
+ "aria-rowcount": enableKeyboardNavigation ? table.getRowModel().rows.length + 1 : void 0,
4288
+ role: enableKeyboardNavigation ? "grid" : void 0,
4289
+ onCopy: enableClipboard ? handleCopy : void 0,
4290
+ onKeyDown: enableKeyboardNavigation ? handleKeyDown : void 0,
4291
+ onPaste: enablePaste ? handlePaste : void 0,
4292
+ children: [
4293
+ /* @__PURE__ */ jsx(
4294
+ DataTableHeader,
4295
+ {
4296
+ columnVirtualizer: enableColumnVirtualization ? columnVirtualizer : void 0,
4297
+ enableColumnFilters,
4298
+ enableColumnMenu,
4299
+ enableColumnOrdering,
4300
+ enableColumnPinning,
4301
+ enableColumnResizing,
4302
+ enableColumnVisibility,
4303
+ enableGrouping,
4304
+ enableSorting: props.enableSorting ?? true,
4305
+ enableStickyHeader,
4306
+ getPinnedAttribute,
4307
+ getPinnedStyles,
4308
+ renderColumnFilter,
4309
+ table
4310
+ }
4311
+ ),
4312
+ /* @__PURE__ */ jsx(
4313
+ DataTableBody,
4314
+ {
4315
+ cancelEdit,
4316
+ cellClassName,
4317
+ columnVirtualizer: enableColumnVirtualization ? columnVirtualizer : void 0,
4318
+ containerRef,
4319
+ contextMenuItems,
4320
+ dragHandleProps: rowReordering.dragHandleProps,
4321
+ editError,
4322
+ editingCell,
4323
+ editTrigger,
4324
+ editValue,
4325
+ enableColumnPinning,
4326
+ enableEditing,
4327
+ enableGrouping,
4328
+ enableKeyboardNavigation,
4329
+ enableRowAnimation: enableRowAnimation && !enableVirtualization,
4330
+ enableRowColumnSpanning,
4331
+ enableRowReordering: props.enableRowReordering ?? false,
4332
+ enableRowSelection,
4333
+ enableSearchHighlight,
4334
+ enableStriping,
4335
+ enableVirtualization,
4336
+ focusedCell,
4337
+ getPinnedAttribute,
4338
+ getPinnedStyles,
4339
+ globalFilter: enableSearchHighlight ? table.getState().globalFilter : void 0,
4340
+ handleCellFocus,
4341
+ hasFooter,
4342
+ renderSubComponent,
4343
+ rowClassName,
4344
+ rowVirtualizer: enableVirtualization ? rowVirtualizer : void 0,
4345
+ setEditInputRef,
4346
+ setEditValue,
4347
+ startEdit,
4348
+ submitEdit,
4349
+ table,
4350
+ tableColumns,
4351
+ onRowClick
4352
+ }
4353
+ ),
4354
+ enableTrailingRow && onAddRow && /* @__PURE__ */ jsx("tfoot", { children: /* @__PURE__ */ jsx(
4355
+ DataTableTrailingRow,
4356
+ {
4357
+ columns: tableColumns,
4358
+ onAdd: onAddRow
4359
+ }
4360
+ ) })
4361
+ ]
4362
+ }
4363
+ ),
4364
+ enableFillHandle && onCellFill && focusedCell && /* @__PURE__ */ jsx(
4365
+ DataTableFillHandle,
4366
+ {
4367
+ position: focusedCell,
4368
+ tableRef,
4369
+ onFill: onCellFill
4370
+ }
4371
+ ),
4372
+ enableInfiniteScroll && /* @__PURE__ */ jsx(
4373
+ "div",
4374
+ {
4375
+ ref: infiniteScroll.sentinelRef,
4376
+ "aria-hidden": "true",
4377
+ style: { height: 1 }
4378
+ }
4379
+ )
4380
+ ]
4381
+ }
4382
+ )
4383
+ ),
4384
+ enablePagination && !enableVirtualization && !showCardView && /* @__PURE__ */ jsx("div", { className: "print:hidden", children: /* @__PURE__ */ jsx(
4385
+ DataTablePagination,
4386
+ {
4387
+ enableRowSelection,
4388
+ pageSizeOptions,
4389
+ pagination,
4390
+ setInternalPagination,
4391
+ table,
4392
+ onPaginationChange
4393
+ }
4394
+ ) }),
4395
+ enableStatusBar && /* @__PURE__ */ jsx("div", { className: "print:hidden", children: /* @__PURE__ */ jsx(
4396
+ DataTableStatusBar,
4397
+ {
4398
+ enableRowSelection,
4399
+ items: statusBarItems,
4400
+ table
4401
+ }
4402
+ ) }),
4403
+ enableSidePanel && /* @__PURE__ */ jsx(
4404
+ DataTableSidePanel,
4405
+ {
4406
+ open: sidePanelOpen,
4407
+ onClose: () => {
4408
+ setSidePanelOpen(false);
4409
+ },
4410
+ children: sidePanelContent
4411
+ }
4412
+ ),
4413
+ /* @__PURE__ */ jsxs("div", { "aria-atomic": "true", "aria-live": "polite", className: "sr-only", children: [
4414
+ table.getFilteredRowModel().rows.length,
4415
+ " rows",
4416
+ enableRowSelection && table.getFilteredSelectedRowModel().rows.length > 0 ? `, ${String(table.getFilteredSelectedRowModel().rows.length)} selected` : ""
4417
+ ] })
4418
+ ]
4419
+ }
4420
+ );
4421
+ }
4422
+ function DataTableProgressCell({
4423
+ className,
4424
+ max = 100,
4425
+ value
4426
+ }) {
4427
+ const percent = Math.min(100, Math.max(0, value / max * 100));
4428
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
4429
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-full rounded-full bg-muted", children: /* @__PURE__ */ jsx(
4430
+ "div",
4431
+ {
4432
+ className: "h-full rounded-full bg-primary transition-all",
4433
+ style: { width: `${String(percent)}%` }
4434
+ }
4435
+ ) }),
4436
+ /* @__PURE__ */ jsxs("span", { className: "w-8 text-right text-xs tabular-nums text-muted-foreground", children: [
4437
+ Math.round(percent),
4438
+ "%"
4439
+ ] })
4440
+ ] });
4441
+ }
4442
+ function DataTableRatingCell({
4443
+ className,
4444
+ max = 5,
4445
+ value
4446
+ }) {
4447
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-0.5", className), children: Array.from({ length: max }, (_, i) => /* @__PURE__ */ jsx(
4448
+ Star,
4449
+ {
4450
+ className: cn(
4451
+ "size-3.5",
4452
+ i < value ? "fill-yellow-400 text-yellow-400" : "text-muted-foreground/30"
4453
+ )
4454
+ },
4455
+ i
4456
+ )) });
4457
+ }
4458
+ function DataTableCurrencyCell({
4459
+ className,
4460
+ currency = "USD",
4461
+ locale = "en-US",
4462
+ value
4463
+ }) {
4464
+ const formatted = new Intl.NumberFormat(locale, {
4465
+ style: "currency",
4466
+ currency
4467
+ }).format(value);
4468
+ return /* @__PURE__ */ jsx("span", { className: cn("tabular-nums", className), children: formatted });
4469
+ }
4470
+ function DataTableBooleanCell({
4471
+ className,
4472
+ value
4473
+ }) {
4474
+ return value ? /* @__PURE__ */ jsx(Check, { className: cn("size-4 text-green-600", className) }) : /* @__PURE__ */ jsx(X, { className: cn("size-4 text-muted-foreground", className) });
4475
+ }
4476
+ function DataTableDateCell({
4477
+ className,
4478
+ format = "date",
4479
+ now,
4480
+ value
4481
+ }) {
4482
+ const date = value instanceof Date ? value : new Date(value);
4483
+ const [mountTime] = React14.useState(() => Date.now());
4484
+ const referenceTime = now ?? mountTime;
4485
+ let formatted;
4486
+ if (format === "relative") {
4487
+ const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
4488
+ const diffMs = date.getTime() - referenceTime;
4489
+ const diffDays = Math.round(diffMs / (1e3 * 60 * 60 * 24));
4490
+ if (Math.abs(diffDays) < 1) {
4491
+ const diffHours = Math.round(diffMs / (1e3 * 60 * 60));
4492
+ formatted = rtf.format(diffHours, "hour");
4493
+ } else {
4494
+ formatted = rtf.format(diffDays, "day");
4495
+ }
4496
+ } else {
4497
+ const options = format === "datetime" ? { dateStyle: "medium", timeStyle: "short" } : format === "time" ? { timeStyle: "short" } : { dateStyle: "medium" };
4498
+ formatted = new Intl.DateTimeFormat("en-US", options).format(date);
4499
+ }
4500
+ return /* @__PURE__ */ jsx("span", { className: cn("text-sm", className), children: formatted });
4501
+ }
4502
+
4503
+ export { DataTable, DataTableBooleanCell, DataTableCurrencyCell, DataTableDateCell, DataTableProgressCell, DataTableRatingCell, downloadFile, exportToCSV, exportToExcel, exportToPDF, tableToCSV };
4504
+ //# sourceMappingURL=chunk-ZO2EKJZM.js.map
4505
+ //# sourceMappingURL=chunk-ZO2EKJZM.js.map