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

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