@hexclave/dashboard-ui-components 1.0.0

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 (331) hide show
  1. package/LICENSE +5 -0
  2. package/dist/chunk-BE-pF4vm.js +34 -0
  3. package/dist/components/alert.d.ts +22 -0
  4. package/dist/components/alert.d.ts.map +1 -0
  5. package/dist/components/alert.js +75 -0
  6. package/dist/components/alert.js.map +1 -0
  7. package/dist/components/analytics-chart/analytics-chart-pie.d.ts +67 -0
  8. package/dist/components/analytics-chart/analytics-chart-pie.d.ts.map +1 -0
  9. package/dist/components/analytics-chart/analytics-chart-pie.js +253 -0
  10. package/dist/components/analytics-chart/analytics-chart-pie.js.map +1 -0
  11. package/dist/components/analytics-chart/analytics-chart.d.ts +554 -0
  12. package/dist/components/analytics-chart/analytics-chart.d.ts.map +1 -0
  13. package/dist/components/analytics-chart/analytics-chart.js +1021 -0
  14. package/dist/components/analytics-chart/analytics-chart.js.map +1 -0
  15. package/dist/components/analytics-chart/default-analytics-chart-tooltip.d.ts +66 -0
  16. package/dist/components/analytics-chart/default-analytics-chart-tooltip.d.ts.map +1 -0
  17. package/dist/components/analytics-chart/default-analytics-chart-tooltip.js +179 -0
  18. package/dist/components/analytics-chart/default-analytics-chart-tooltip.js.map +1 -0
  19. package/dist/components/analytics-chart/format.d.ts +13 -0
  20. package/dist/components/analytics-chart/format.d.ts.map +1 -0
  21. package/dist/components/analytics-chart/format.js +138 -0
  22. package/dist/components/analytics-chart/format.js.map +1 -0
  23. package/dist/components/analytics-chart/index.d.ts +8 -0
  24. package/dist/components/analytics-chart/index.js +184 -0
  25. package/dist/components/analytics-chart/palette.d.ts +15 -0
  26. package/dist/components/analytics-chart/palette.d.ts.map +1 -0
  27. package/dist/components/analytics-chart/palette.js +60 -0
  28. package/dist/components/analytics-chart/palette.js.map +1 -0
  29. package/dist/components/analytics-chart/render-data-series.d.ts +28 -0
  30. package/dist/components/analytics-chart/render-data-series.d.ts.map +1 -0
  31. package/dist/components/analytics-chart/render-data-series.js +109 -0
  32. package/dist/components/analytics-chart/render-data-series.js.map +1 -0
  33. package/dist/components/analytics-chart/state.d.ts +54 -0
  34. package/dist/components/analytics-chart/state.d.ts.map +1 -0
  35. package/dist/components/analytics-chart/state.js +142 -0
  36. package/dist/components/analytics-chart/state.js.map +1 -0
  37. package/dist/components/analytics-chart/strings.d.ts +33 -0
  38. package/dist/components/analytics-chart/strings.d.ts.map +1 -0
  39. package/dist/components/analytics-chart/strings.js +37 -0
  40. package/dist/components/analytics-chart/strings.js.map +1 -0
  41. package/dist/components/analytics-chart/types.d.ts +157 -0
  42. package/dist/components/analytics-chart/types.d.ts.map +1 -0
  43. package/dist/components/analytics-chart/types.js +21 -0
  44. package/dist/components/analytics-chart/types.js.map +1 -0
  45. package/dist/components/badge.d.ts +40 -0
  46. package/dist/components/badge.d.ts.map +1 -0
  47. package/dist/components/badge.js +75 -0
  48. package/dist/components/badge.js.map +1 -0
  49. package/dist/components/button.d.ts +46 -0
  50. package/dist/components/button.d.ts.map +1 -0
  51. package/dist/components/button.js +82 -0
  52. package/dist/components/button.js.map +1 -0
  53. package/dist/components/card.d.ts +87 -0
  54. package/dist/components/card.d.ts.map +1 -0
  55. package/dist/components/card.js +161 -0
  56. package/dist/components/card.js.map +1 -0
  57. package/dist/components/chart-card.d.ts +50 -0
  58. package/dist/components/chart-card.d.ts.map +1 -0
  59. package/dist/components/chart-card.js +83 -0
  60. package/dist/components/chart-card.js.map +1 -0
  61. package/dist/components/chart-container.d.ts +51 -0
  62. package/dist/components/chart-container.d.ts.map +1 -0
  63. package/dist/components/chart-container.js +77 -0
  64. package/dist/components/chart-container.js.map +1 -0
  65. package/dist/components/chart-legend.d.ts +11 -0
  66. package/dist/components/chart-legend.d.ts.map +1 -0
  67. package/dist/components/chart-legend.js +37 -0
  68. package/dist/components/chart-legend.js.map +1 -0
  69. package/dist/components/chart-theme.d.ts +26 -0
  70. package/dist/components/chart-theme.d.ts.map +1 -0
  71. package/dist/components/chart-theme.js +64 -0
  72. package/dist/components/chart-theme.js.map +1 -0
  73. package/dist/components/chart-tooltip.d.ts +41 -0
  74. package/dist/components/chart-tooltip.d.ts.map +1 -0
  75. package/dist/components/chart-tooltip.js +89 -0
  76. package/dist/components/chart-tooltip.js.map +1 -0
  77. package/dist/components/cursor-blast-effect.d.ts +27 -0
  78. package/dist/components/cursor-blast-effect.d.ts.map +1 -0
  79. package/dist/components/cursor-blast-effect.js +244 -0
  80. package/dist/components/cursor-blast-effect.js.map +1 -0
  81. package/dist/components/data-grid/data-grid-sizing.d.ts +13 -0
  82. package/dist/components/data-grid/data-grid-sizing.d.ts.map +1 -0
  83. package/dist/components/data-grid/data-grid-sizing.js +44 -0
  84. package/dist/components/data-grid/data-grid-sizing.js.map +1 -0
  85. package/dist/components/data-grid/data-grid-toolbar.d.ts +31 -0
  86. package/dist/components/data-grid/data-grid-toolbar.d.ts.map +1 -0
  87. package/dist/components/data-grid/data-grid-toolbar.js +229 -0
  88. package/dist/components/data-grid/data-grid-toolbar.js.map +1 -0
  89. package/dist/components/data-grid/data-grid.d.ts +47 -0
  90. package/dist/components/data-grid/data-grid.d.ts.map +1 -0
  91. package/dist/components/data-grid/data-grid.js +927 -0
  92. package/dist/components/data-grid/data-grid.js.map +1 -0
  93. package/dist/components/data-grid/data-grid.test.d.ts +1 -0
  94. package/dist/components/data-grid/data-grid.test.js +297 -0
  95. package/dist/components/data-grid/data-grid.test.js.map +1 -0
  96. package/dist/components/data-grid/index.d.ts +9 -0
  97. package/dist/components/data-grid/index.js +148 -0
  98. package/dist/components/data-grid/state.d.ts +34 -0
  99. package/dist/components/data-grid/state.d.ts.map +1 -0
  100. package/dist/components/data-grid/state.js +199 -0
  101. package/dist/components/data-grid/state.js.map +1 -0
  102. package/dist/components/data-grid/strings.d.ts +8 -0
  103. package/dist/components/data-grid/strings.d.ts.map +1 -0
  104. package/dist/components/data-grid/strings.js +42 -0
  105. package/dist/components/data-grid/strings.js.map +1 -0
  106. package/dist/components/data-grid/types.d.ts +278 -0
  107. package/dist/components/data-grid/types.d.ts.map +1 -0
  108. package/dist/components/data-grid/types.js +0 -0
  109. package/dist/components/data-grid/use-data-source.d.ts +85 -0
  110. package/dist/components/data-grid/use-data-source.d.ts.map +1 -0
  111. package/dist/components/data-grid/use-data-source.js +244 -0
  112. package/dist/components/data-grid/use-data-source.js.map +1 -0
  113. package/dist/components/data-grid/use-url-state.d.ts +38 -0
  114. package/dist/components/data-grid/use-url-state.d.ts.map +1 -0
  115. package/dist/components/data-grid/use-url-state.js +214 -0
  116. package/dist/components/data-grid/use-url-state.js.map +1 -0
  117. package/dist/components/data-grid/use-url-state.test.d.ts +1 -0
  118. package/dist/components/data-grid/use-url-state.test.js +91 -0
  119. package/dist/components/data-grid/use-url-state.test.js.map +1 -0
  120. package/dist/components/dialog.d.ts +67 -0
  121. package/dist/components/dialog.d.ts.map +1 -0
  122. package/dist/components/dialog.js +100 -0
  123. package/dist/components/dialog.js.map +1 -0
  124. package/dist/components/edit-mode.d.ts +12 -0
  125. package/dist/components/edit-mode.d.ts.map +1 -0
  126. package/dist/components/edit-mode.js +23 -0
  127. package/dist/components/edit-mode.js.map +1 -0
  128. package/dist/components/empty-state.d.ts +37 -0
  129. package/dist/components/empty-state.d.ts.map +1 -0
  130. package/dist/components/empty-state.js +53 -0
  131. package/dist/components/empty-state.js.map +1 -0
  132. package/dist/components/input.d.ts +18 -0
  133. package/dist/components/input.d.ts.map +1 -0
  134. package/dist/components/input.js +53 -0
  135. package/dist/components/input.js.map +1 -0
  136. package/dist/components/metric-card.d.ts +55 -0
  137. package/dist/components/metric-card.d.ts.map +1 -0
  138. package/dist/components/metric-card.js +112 -0
  139. package/dist/components/metric-card.js.map +1 -0
  140. package/dist/components/pill-toggle.d.ts +33 -0
  141. package/dist/components/pill-toggle.d.ts.map +1 -0
  142. package/dist/components/pill-toggle.js +86 -0
  143. package/dist/components/pill-toggle.js.map +1 -0
  144. package/dist/components/progress-bar.d.ts +35 -0
  145. package/dist/components/progress-bar.d.ts.map +1 -0
  146. package/dist/components/progress-bar.js +54 -0
  147. package/dist/components/progress-bar.js.map +1 -0
  148. package/dist/components/separator.d.ts +23 -0
  149. package/dist/components/separator.d.ts.map +1 -0
  150. package/dist/components/separator.js +29 -0
  151. package/dist/components/separator.js.map +1 -0
  152. package/dist/components/skeleton.d.ts +24 -0
  153. package/dist/components/skeleton.d.ts.map +1 -0
  154. package/dist/components/skeleton.js +30 -0
  155. package/dist/components/skeleton.js.map +1 -0
  156. package/dist/components/table.d.ts +49 -0
  157. package/dist/components/table.d.ts.map +1 -0
  158. package/dist/components/table.js +84 -0
  159. package/dist/components/table.js.map +1 -0
  160. package/dist/components/tabs.d.ts +38 -0
  161. package/dist/components/tabs.d.ts.map +1 -0
  162. package/dist/components/tabs.js +113 -0
  163. package/dist/components/tabs.js.map +1 -0
  164. package/dist/dashboard-ui-components.global.js +25539 -0
  165. package/dist/dashboard-ui-components.global.js.map +7 -0
  166. package/dist/esm/components/alert.d.ts +22 -0
  167. package/dist/esm/components/alert.d.ts.map +1 -0
  168. package/dist/esm/components/alert.js +73 -0
  169. package/dist/esm/components/alert.js.map +1 -0
  170. package/dist/esm/components/analytics-chart/analytics-chart-pie.d.ts +67 -0
  171. package/dist/esm/components/analytics-chart/analytics-chart-pie.d.ts.map +1 -0
  172. package/dist/esm/components/analytics-chart/analytics-chart-pie.js +251 -0
  173. package/dist/esm/components/analytics-chart/analytics-chart-pie.js.map +1 -0
  174. package/dist/esm/components/analytics-chart/analytics-chart.d.ts +554 -0
  175. package/dist/esm/components/analytics-chart/analytics-chart.d.ts.map +1 -0
  176. package/dist/esm/components/analytics-chart/analytics-chart.js +1019 -0
  177. package/dist/esm/components/analytics-chart/analytics-chart.js.map +1 -0
  178. package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.d.ts +66 -0
  179. package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.d.ts.map +1 -0
  180. package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.js +176 -0
  181. package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.js.map +1 -0
  182. package/dist/esm/components/analytics-chart/format.d.ts +13 -0
  183. package/dist/esm/components/analytics-chart/format.d.ts.map +1 -0
  184. package/dist/esm/components/analytics-chart/format.js +133 -0
  185. package/dist/esm/components/analytics-chart/format.js.map +1 -0
  186. package/dist/esm/components/analytics-chart/index.d.ts +8 -0
  187. package/dist/esm/components/analytics-chart/index.js +9 -0
  188. package/dist/esm/components/analytics-chart/palette.d.ts +15 -0
  189. package/dist/esm/components/analytics-chart/palette.d.ts.map +1 -0
  190. package/dist/esm/components/analytics-chart/palette.js +55 -0
  191. package/dist/esm/components/analytics-chart/palette.js.map +1 -0
  192. package/dist/esm/components/analytics-chart/render-data-series.d.ts +28 -0
  193. package/dist/esm/components/analytics-chart/render-data-series.d.ts.map +1 -0
  194. package/dist/esm/components/analytics-chart/render-data-series.js +107 -0
  195. package/dist/esm/components/analytics-chart/render-data-series.js.map +1 -0
  196. package/dist/esm/components/analytics-chart/state.d.ts +54 -0
  197. package/dist/esm/components/analytics-chart/state.d.ts.map +1 -0
  198. package/dist/esm/components/analytics-chart/state.js +126 -0
  199. package/dist/esm/components/analytics-chart/state.js.map +1 -0
  200. package/dist/esm/components/analytics-chart/strings.d.ts +33 -0
  201. package/dist/esm/components/analytics-chart/strings.d.ts.map +1 -0
  202. package/dist/esm/components/analytics-chart/strings.js +34 -0
  203. package/dist/esm/components/analytics-chart/strings.js.map +1 -0
  204. package/dist/esm/components/analytics-chart/types.d.ts +157 -0
  205. package/dist/esm/components/analytics-chart/types.d.ts.map +1 -0
  206. package/dist/esm/components/analytics-chart/types.js +18 -0
  207. package/dist/esm/components/analytics-chart/types.js.map +1 -0
  208. package/dist/esm/components/badge.d.ts +40 -0
  209. package/dist/esm/components/badge.d.ts.map +1 -0
  210. package/dist/esm/components/badge.js +73 -0
  211. package/dist/esm/components/badge.js.map +1 -0
  212. package/dist/esm/components/button.d.ts +46 -0
  213. package/dist/esm/components/button.d.ts.map +1 -0
  214. package/dist/esm/components/button.js +79 -0
  215. package/dist/esm/components/button.js.map +1 -0
  216. package/dist/esm/components/card.d.ts +87 -0
  217. package/dist/esm/components/card.d.ts.map +1 -0
  218. package/dist/esm/components/card.js +155 -0
  219. package/dist/esm/components/card.js.map +1 -0
  220. package/dist/esm/components/chart-card.d.ts +50 -0
  221. package/dist/esm/components/chart-card.d.ts.map +1 -0
  222. package/dist/esm/components/chart-card.js +80 -0
  223. package/dist/esm/components/chart-card.js.map +1 -0
  224. package/dist/esm/components/chart-container.d.ts +51 -0
  225. package/dist/esm/components/chart-container.d.ts.map +1 -0
  226. package/dist/esm/components/chart-container.js +70 -0
  227. package/dist/esm/components/chart-container.js.map +1 -0
  228. package/dist/esm/components/chart-legend.d.ts +11 -0
  229. package/dist/esm/components/chart-legend.d.ts.map +1 -0
  230. package/dist/esm/components/chart-legend.js +34 -0
  231. package/dist/esm/components/chart-legend.js.map +1 -0
  232. package/dist/esm/components/chart-theme.d.ts +26 -0
  233. package/dist/esm/components/chart-theme.d.ts.map +1 -0
  234. package/dist/esm/components/chart-theme.js +59 -0
  235. package/dist/esm/components/chart-theme.js.map +1 -0
  236. package/dist/esm/components/chart-tooltip.d.ts +41 -0
  237. package/dist/esm/components/chart-tooltip.d.ts.map +1 -0
  238. package/dist/esm/components/chart-tooltip.js +84 -0
  239. package/dist/esm/components/chart-tooltip.js.map +1 -0
  240. package/dist/esm/components/cursor-blast-effect.d.ts +27 -0
  241. package/dist/esm/components/cursor-blast-effect.d.ts.map +1 -0
  242. package/dist/esm/components/cursor-blast-effect.js +242 -0
  243. package/dist/esm/components/cursor-blast-effect.js.map +1 -0
  244. package/dist/esm/components/data-grid/data-grid-sizing.d.ts +13 -0
  245. package/dist/esm/components/data-grid/data-grid-sizing.d.ts.map +1 -0
  246. package/dist/esm/components/data-grid/data-grid-sizing.js +38 -0
  247. package/dist/esm/components/data-grid/data-grid-sizing.js.map +1 -0
  248. package/dist/esm/components/data-grid/data-grid-toolbar.d.ts +31 -0
  249. package/dist/esm/components/data-grid/data-grid-toolbar.d.ts.map +1 -0
  250. package/dist/esm/components/data-grid/data-grid-toolbar.js +226 -0
  251. package/dist/esm/components/data-grid/data-grid-toolbar.js.map +1 -0
  252. package/dist/esm/components/data-grid/data-grid.d.ts +47 -0
  253. package/dist/esm/components/data-grid/data-grid.d.ts.map +1 -0
  254. package/dist/esm/components/data-grid/data-grid.js +923 -0
  255. package/dist/esm/components/data-grid/data-grid.js.map +1 -0
  256. package/dist/esm/components/data-grid/data-grid.test.d.ts +1 -0
  257. package/dist/esm/components/data-grid/data-grid.test.js +297 -0
  258. package/dist/esm/components/data-grid/data-grid.test.js.map +1 -0
  259. package/dist/esm/components/data-grid/index.d.ts +9 -0
  260. package/dist/esm/components/data-grid/index.js +9 -0
  261. package/dist/esm/components/data-grid/state.d.ts +34 -0
  262. package/dist/esm/components/data-grid/state.d.ts.map +1 -0
  263. package/dist/esm/components/data-grid/state.js +187 -0
  264. package/dist/esm/components/data-grid/state.js.map +1 -0
  265. package/dist/esm/components/data-grid/strings.d.ts +8 -0
  266. package/dist/esm/components/data-grid/strings.d.ts.map +1 -0
  267. package/dist/esm/components/data-grid/strings.js +39 -0
  268. package/dist/esm/components/data-grid/strings.js.map +1 -0
  269. package/dist/esm/components/data-grid/types.d.ts +278 -0
  270. package/dist/esm/components/data-grid/types.d.ts.map +1 -0
  271. package/dist/esm/components/data-grid/types.js +1 -0
  272. package/dist/esm/components/data-grid/use-data-source.d.ts +85 -0
  273. package/dist/esm/components/data-grid/use-data-source.d.ts.map +1 -0
  274. package/dist/esm/components/data-grid/use-data-source.js +242 -0
  275. package/dist/esm/components/data-grid/use-data-source.js.map +1 -0
  276. package/dist/esm/components/data-grid/use-url-state.d.ts +38 -0
  277. package/dist/esm/components/data-grid/use-url-state.d.ts.map +1 -0
  278. package/dist/esm/components/data-grid/use-url-state.js +212 -0
  279. package/dist/esm/components/data-grid/use-url-state.js.map +1 -0
  280. package/dist/esm/components/data-grid/use-url-state.test.d.ts +1 -0
  281. package/dist/esm/components/data-grid/use-url-state.test.js +91 -0
  282. package/dist/esm/components/data-grid/use-url-state.test.js.map +1 -0
  283. package/dist/esm/components/dialog.d.ts +67 -0
  284. package/dist/esm/components/dialog.d.ts.map +1 -0
  285. package/dist/esm/components/dialog.js +92 -0
  286. package/dist/esm/components/dialog.js.map +1 -0
  287. package/dist/esm/components/edit-mode.d.ts +12 -0
  288. package/dist/esm/components/edit-mode.d.ts.map +1 -0
  289. package/dist/esm/components/edit-mode.js +20 -0
  290. package/dist/esm/components/edit-mode.js.map +1 -0
  291. package/dist/esm/components/empty-state.d.ts +37 -0
  292. package/dist/esm/components/empty-state.d.ts.map +1 -0
  293. package/dist/esm/components/empty-state.js +50 -0
  294. package/dist/esm/components/empty-state.js.map +1 -0
  295. package/dist/esm/components/input.d.ts +18 -0
  296. package/dist/esm/components/input.d.ts.map +1 -0
  297. package/dist/esm/components/input.js +50 -0
  298. package/dist/esm/components/input.js.map +1 -0
  299. package/dist/esm/components/metric-card.d.ts +55 -0
  300. package/dist/esm/components/metric-card.d.ts.map +1 -0
  301. package/dist/esm/components/metric-card.js +109 -0
  302. package/dist/esm/components/metric-card.js.map +1 -0
  303. package/dist/esm/components/pill-toggle.d.ts +33 -0
  304. package/dist/esm/components/pill-toggle.d.ts.map +1 -0
  305. package/dist/esm/components/pill-toggle.js +84 -0
  306. package/dist/esm/components/pill-toggle.js.map +1 -0
  307. package/dist/esm/components/progress-bar.d.ts +35 -0
  308. package/dist/esm/components/progress-bar.d.ts.map +1 -0
  309. package/dist/esm/components/progress-bar.js +52 -0
  310. package/dist/esm/components/progress-bar.js.map +1 -0
  311. package/dist/esm/components/separator.d.ts +23 -0
  312. package/dist/esm/components/separator.d.ts.map +1 -0
  313. package/dist/esm/components/separator.js +27 -0
  314. package/dist/esm/components/separator.js.map +1 -0
  315. package/dist/esm/components/skeleton.d.ts +24 -0
  316. package/dist/esm/components/skeleton.d.ts.map +1 -0
  317. package/dist/esm/components/skeleton.js +28 -0
  318. package/dist/esm/components/skeleton.js.map +1 -0
  319. package/dist/esm/components/table.d.ts +49 -0
  320. package/dist/esm/components/table.d.ts.map +1 -0
  321. package/dist/esm/components/table.js +76 -0
  322. package/dist/esm/components/table.js.map +1 -0
  323. package/dist/esm/components/tabs.d.ts +38 -0
  324. package/dist/esm/components/tabs.d.ts.map +1 -0
  325. package/dist/esm/components/tabs.js +111 -0
  326. package/dist/esm/components/tabs.js.map +1 -0
  327. package/dist/esm/index.d.ts +24 -0
  328. package/dist/esm/index.js +27 -0
  329. package/dist/index.d.ts +37 -0
  330. package/dist/index.js +291 -0
  331. package/package.json +73 -0
@@ -0,0 +1,927 @@
1
+ "use client";
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_chunk = require('../../chunk-BE-pF4vm.js');
5
+ let _phosphor_icons_react = require("@phosphor-icons/react");
6
+ let _stackframe_stack_ui = require("@hexclave/ui");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ let react = require("react");
9
+ react = require_chunk.__toESM(react);
10
+ let __state_js = require("./state.js");
11
+ let __strings_js = require("./strings.js");
12
+ let _stackframe_stack_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
13
+ let _tanstack_react_table = require("@tanstack/react-table");
14
+ let _tanstack_react_virtual = require("@tanstack/react-virtual");
15
+ let ___skeleton_js = require("../skeleton.js");
16
+ let __data_grid_sizing_js = require("./data-grid-sizing.js");
17
+ let __data_grid_toolbar_js = require("./data-grid-toolbar.js");
18
+
19
+ //#region src/components/data-grid/data-grid.tsx
20
+ function getEventTargetElement(target) {
21
+ if (target instanceof Element) return target;
22
+ if (target instanceof Node) return target.parentElement;
23
+ return null;
24
+ }
25
+ function isDataGridInteractiveRowClickTarget(target) {
26
+ return getEventTargetElement(target)?.closest([
27
+ "a",
28
+ "button",
29
+ "input",
30
+ "select",
31
+ "textarea",
32
+ "[role=\"button\"]",
33
+ "[role=\"menuitem\"]",
34
+ "[contenteditable]:not([contenteditable=\"false\"])",
35
+ "[data-no-row-click]"
36
+ ].join(",")) != null;
37
+ }
38
+ function shouldIgnoreRowClick(event) {
39
+ return event.defaultPrevented || isDataGridInteractiveRowClickTarget(event.target);
40
+ }
41
+ function toTanstackSorting(sorting) {
42
+ return sorting.map((s) => ({
43
+ id: s.columnId,
44
+ desc: s.direction === "desc"
45
+ }));
46
+ }
47
+ function fromTanstackSorting(sorting) {
48
+ return sorting.map((s) => ({
49
+ columnId: s.id,
50
+ direction: s.desc ? "desc" : "asc"
51
+ }));
52
+ }
53
+ function toTanstackRowSelection(ids) {
54
+ const out = {};
55
+ for (const id of ids) out[id] = true;
56
+ return out;
57
+ }
58
+ function resolveUpdater(updater, current) {
59
+ return typeof updater === "function" ? updater(current) : updater;
60
+ }
61
+ function distributeFlexWidths(sizes, visibleColumns, available) {
62
+ const flexCols = visibleColumns.filter((c) => c.flex != null && c.flex > 0);
63
+ if (flexCols.length === 0 || available <= 0) return;
64
+ const totalFlex = flexCols.reduce((acc, c) => acc + (c.flex ?? 0), 0);
65
+ let remaining = available;
66
+ flexCols.forEach((col, i) => {
67
+ const share = i === flexCols.length - 1 ? remaining : Math.floor(available * ((col.flex ?? 0) / totalFlex));
68
+ const max = col.maxWidth ?? Infinity;
69
+ const add = Math.max(0, Math.min(share, max - sizes[col.id]));
70
+ sizes[col.id] += add;
71
+ remaining -= add;
72
+ });
73
+ }
74
+ function selectSingle(current, rowId) {
75
+ const isSelected = current.selectedIds.has(rowId);
76
+ return {
77
+ selectedIds: isSelected ? /* @__PURE__ */ new Set() : new Set([rowId]),
78
+ anchorId: isSelected ? null : rowId
79
+ };
80
+ }
81
+ function selectRange(current, rowId, allRowIds, additive) {
82
+ if (current.anchorId == null) return null;
83
+ const anchorIdx = allRowIds.indexOf(current.anchorId);
84
+ const currentIdx = allRowIds.indexOf(rowId);
85
+ if (anchorIdx < 0 || currentIdx < 0) return null;
86
+ const start = Math.min(anchorIdx, currentIdx);
87
+ const end = Math.max(anchorIdx, currentIdx);
88
+ const next = additive ? new Set(current.selectedIds) : /* @__PURE__ */ new Set();
89
+ for (let i = start; i <= end; i++) next.add(allRowIds[i]);
90
+ return {
91
+ selectedIds: next,
92
+ anchorId: current.anchorId
93
+ };
94
+ }
95
+ function selectToggle(current, rowId) {
96
+ const next = new Set(current.selectedIds);
97
+ if (next.has(rowId)) next.delete(rowId);
98
+ else next.add(rowId);
99
+ return {
100
+ selectedIds: next,
101
+ anchorId: rowId
102
+ };
103
+ }
104
+ function nextSelection(input) {
105
+ const { current, rowId, mode, modifiers, allRowIds } = input;
106
+ if (mode === "single") return selectSingle(current, rowId);
107
+ if (modifiers.shift) {
108
+ const range = selectRange(current, rowId, allRowIds, modifiers.ctrl);
109
+ if (range != null) return range;
110
+ }
111
+ if (modifiers.ctrl) return selectToggle(current, rowId);
112
+ return {
113
+ selectedIds: new Set([rowId]),
114
+ anchorId: rowId
115
+ };
116
+ }
117
+ function HeaderCell({ header, col, resizable }) {
118
+ const sorted = header.column.getIsSorted();
119
+ const sortIndex = header.column.getSortIndex();
120
+ const totalSorts = header.column.getCanMultiSort() ? header.getContext().table.getState().sorting.length : 0;
121
+ const ctx = {
122
+ columnId: col.id,
123
+ columnDef: col,
124
+ isSorted: sorted === false ? false : sorted,
125
+ sortIndex: totalSorts > 1 && sortIndex >= 0 ? sortIndex + 1 : null
126
+ };
127
+ const label = typeof col.header === "function" ? col.header(ctx) : col.header;
128
+ const sortable = header.column.getCanSort();
129
+ const canResize = resizable && header.column.getCanResize();
130
+ const isResizing = header.column.getIsResizing();
131
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
132
+ className: (0, _stackframe_stack_ui.cn)("group/header relative flex items-center gap-1.5 px-3 select-none bg-transparent overflow-hidden", "border-r border-black/[0.04] dark:border-white/[0.04] last:border-r-0", sortable && "cursor-pointer"),
133
+ style: { width: `calc(var(--col-${col.id}-size) * 1px)` },
134
+ "data-col-id": col.id,
135
+ onClick: sortable ? header.column.getToggleSortingHandler() : void 0,
136
+ role: "columnheader",
137
+ "aria-sort": sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : "none",
138
+ children: [
139
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
140
+ className: (0, _stackframe_stack_ui.cn)("flex-1 min-w-0 truncate text-xs font-semibold uppercase tracking-wider text-muted-foreground", col.align === "center" && "text-center", col.align === "right" && "text-right"),
141
+ children: label
142
+ }),
143
+ sorted && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
144
+ className: "flex items-center gap-0.5 text-foreground/60",
145
+ children: [sorted === "asc" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.ArrowUp, {
146
+ className: "h-3 w-3",
147
+ weight: "bold"
148
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.ArrowDown, {
149
+ className: "h-3 w-3",
150
+ weight: "bold"
151
+ }), ctx.sortIndex != null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
152
+ className: "text-[10px] font-medium tabular-nums",
153
+ children: ctx.sortIndex
154
+ })]
155
+ }),
156
+ !sorted && sortable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
157
+ className: "hidden group-hover/header:flex items-center text-foreground/20",
158
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.CaretUp, {
159
+ className: "h-2.5 w-2.5 -mb-[1px]",
160
+ weight: "bold"
161
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.CaretDown, {
162
+ className: "h-2.5 w-2.5 -mt-[1px]",
163
+ weight: "bold"
164
+ })]
165
+ }),
166
+ canResize && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
167
+ onMouseDown: header.getResizeHandler(),
168
+ onTouchStart: header.getResizeHandler(),
169
+ onClick: (e) => {
170
+ e.preventDefault();
171
+ e.stopPropagation();
172
+ },
173
+ className: (0, _stackframe_stack_ui.cn)("absolute right-0 top-0 bottom-0 z-10 w-[5px] cursor-col-resize touch-none", "group-hover/header:bg-foreground/[0.06] hover:!bg-blue-500/30", "transition-colors duration-100", isResizing && "bg-blue-500/40")
174
+ })
175
+ ]
176
+ });
177
+ }
178
+ function DataCell({ col, row, rowId, rowIndex, isSelected, dateDisplay }) {
179
+ const value = (0, __state_js.resolveColumnValue)(col, row);
180
+ const ctx = {
181
+ row,
182
+ rowId,
183
+ rowIndex,
184
+ value,
185
+ columnId: col.id,
186
+ isSelected,
187
+ dateDisplay
188
+ };
189
+ const isDateCol = col.type === "date" || col.type === "dateTime";
190
+ let content;
191
+ if (col.renderCell) content = col.renderCell(ctx);
192
+ else if (isDateCol) content = renderDateCell(value, dateDisplay, col);
193
+ else content = formatCellValue(value);
194
+ const hasCellClick = col.onCellClick || col.onCellDoubleClick;
195
+ const isWrap = col.cellOverflow === "wrap";
196
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
197
+ className: (0, _stackframe_stack_ui.cn)("flex px-3 bg-transparent overflow-hidden", "border-r border-black/[0.04] dark:border-white/[0.04] last:border-r-0", "text-sm text-foreground", isWrap ? "items-start py-2" : "items-center", col.align === "center" && "justify-center", col.align === "right" && "justify-end", hasCellClick && "cursor-pointer"),
198
+ style: { width: `calc(var(--col-${col.id}-size) * 1px)` },
199
+ "data-col-id": col.id,
200
+ role: "gridcell",
201
+ onClick: col.onCellClick ? (e) => {
202
+ e.stopPropagation();
203
+ col.onCellClick(ctx, e);
204
+ } : void 0,
205
+ onDoubleClick: col.onCellDoubleClick ? (e) => {
206
+ e.stopPropagation();
207
+ col.onCellDoubleClick(ctx, e);
208
+ } : void 0,
209
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
210
+ className: (0, _stackframe_stack_ui.cn)("min-w-0", isWrap ? "flex-1" : "truncate"),
211
+ children: content
212
+ })
213
+ });
214
+ }
215
+ function formatCellValue(value) {
216
+ if (value == null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
217
+ className: "text-muted-foreground/40",
218
+ children: "-"
219
+ });
220
+ if (typeof value === "boolean") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
221
+ className: (0, _stackframe_stack_ui.cn)("inline-flex items-center px-1.5 py-0.5 rounded-md text-xs font-medium", value ? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400" : "bg-foreground/[0.04] text-muted-foreground"),
222
+ children: value ? "Yes" : "No"
223
+ });
224
+ if (value instanceof Date) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
225
+ className: "tabular-nums text-muted-foreground",
226
+ children: value.toLocaleDateString()
227
+ });
228
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
229
+ className: "truncate",
230
+ children: String(value)
231
+ });
232
+ }
233
+ function renderDateCell(value, dateDisplay, col) {
234
+ const { display, tooltip } = (0, __state_js.formatGridDate)(value, dateDisplay, {
235
+ parseValue: col.parseValue,
236
+ dateFormat: col.dateFormat
237
+ });
238
+ if (display == null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
239
+ className: "text-muted-foreground/40",
240
+ children: "-"
241
+ });
242
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
243
+ className: "tabular-nums text-muted-foreground truncate cursor-help",
244
+ title: tooltip ?? void 0,
245
+ children: display
246
+ });
247
+ }
248
+ function hashStringToInt(value) {
249
+ let hash = 0;
250
+ for (let i = 0; i < value.length; i++) hash = (hash << 5) - hash + value.charCodeAt(i) | 0;
251
+ return Math.abs(hash);
252
+ }
253
+ function SkeletonRow({ columns, height, showCheckbox }) {
254
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
255
+ className: "flex",
256
+ style: { height },
257
+ role: "row",
258
+ children: [showCheckbox && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
259
+ className: "flex items-center justify-center border-r border-black/[0.04] dark:border-white/[0.04]",
260
+ style: { width: 44 },
261
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___skeleton_js.DesignSkeleton, { className: "h-4 w-4 rounded" })
262
+ }), columns.map((col) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
263
+ className: "flex items-center px-3 border-r border-black/[0.04] dark:border-white/[0.04] last:border-r-0",
264
+ style: { width: `calc(var(--col-${col.id}-size) * 1px)` },
265
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___skeleton_js.DesignSkeleton, {
266
+ className: "h-3.5 rounded-md",
267
+ style: { width: `${40 + hashStringToInt(col.id) % 40}%` }
268
+ })
269
+ }, col.id))]
270
+ });
271
+ }
272
+ function SelectionCheckbox({ checked, indeterminate, onChange, ariaLabel, title }) {
273
+ const Icon = indeterminate ? _phosphor_icons_react.MinusSquare : checked ? _phosphor_icons_react.CheckSquare : _phosphor_icons_react.Square;
274
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
275
+ className: (0, _stackframe_stack_ui.cn)("flex items-center justify-center w-full h-full", "hover:bg-foreground/[0.04] transition-colors duration-75", checked || indeterminate ? "text-blue-600 dark:text-blue-400" : "text-muted-foreground/40 hover:text-muted-foreground/60"),
276
+ onClick: (e) => {
277
+ e.stopPropagation();
278
+ onChange(e);
279
+ },
280
+ "aria-label": ariaLabel,
281
+ title: title ?? ariaLabel,
282
+ role: "checkbox",
283
+ "aria-checked": indeterminate ? "mixed" : checked,
284
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, {
285
+ className: "h-4 w-4",
286
+ weight: checked || indeterminate ? "fill" : "regular"
287
+ })
288
+ });
289
+ }
290
+ const NOOP = () => {};
291
+ function InfiniteScrollSentinel({ onIntersect, isLoading, rootRef, strings }) {
292
+ const ref = (0, react.useRef)(null);
293
+ (0, react.useEffect)(() => {
294
+ const el = ref.current;
295
+ if (!el) return;
296
+ const observer = new IntersectionObserver((entries) => {
297
+ if (entries[0]?.isIntersecting) onIntersect();
298
+ }, {
299
+ root: rootRef?.current ?? null,
300
+ rootMargin: "200px"
301
+ });
302
+ observer.observe(el);
303
+ return () => observer.disconnect();
304
+ }, [onIntersect, rootRef]);
305
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
306
+ ref,
307
+ className: "flex items-center justify-center py-4",
308
+ children: isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
309
+ className: "flex items-center gap-2 text-xs text-muted-foreground",
310
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "h-3 w-3 rounded-full border-2 border-current border-t-transparent animate-spin" }), strings.loadingMore]
311
+ })
312
+ });
313
+ }
314
+ function DefaultFooter({ ctx, pagination, onChange }) {
315
+ const { state, totalRowCount, visibleRowCount, selectedRowCount, strings } = ctx;
316
+ const totalPages = totalRowCount != null ? Math.max(1, Math.ceil(totalRowCount / state.pagination.pageSize)) : void 0;
317
+ const setPage = (pageIndex) => onChange((s) => ({
318
+ ...s,
319
+ pagination: {
320
+ ...s.pagination,
321
+ pageIndex
322
+ }
323
+ }));
324
+ const setPageSize = (pageSize) => onChange((s) => ({
325
+ ...s,
326
+ pagination: {
327
+ ...s.pagination,
328
+ pageSize,
329
+ pageIndex: 0
330
+ }
331
+ }));
332
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
333
+ className: "flex items-center justify-between px-4 py-2.5 border-t border-foreground/[0.06] text-xs text-muted-foreground",
334
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
335
+ className: "flex items-center gap-3",
336
+ children: [selectedRowCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
337
+ className: "font-medium text-foreground",
338
+ children: strings.rowsSelected(selectedRowCount)
339
+ }), totalRowCount != null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
340
+ visibleRowCount,
341
+ " of ",
342
+ totalRowCount,
343
+ " rows"
344
+ ] })]
345
+ }), pagination !== "infinite" && totalPages != null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
346
+ className: "flex items-center gap-3",
347
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
348
+ className: "flex items-center gap-1.5",
349
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: strings.rowsPerPage }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
350
+ className: (0, _stackframe_stack_ui.cn)("h-7 rounded-lg border border-black/[0.08] dark:border-white/[0.08] bg-background px-1.5", "text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-foreground/[0.1]", "cursor-pointer"),
351
+ value: state.pagination.pageSize,
352
+ onChange: (e) => setPageSize(Number(e.target.value)),
353
+ children: [
354
+ 10,
355
+ 25,
356
+ 50,
357
+ 100
358
+ ].map((size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
359
+ value: size,
360
+ children: size
361
+ }, size))
362
+ })]
363
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
364
+ className: "flex items-center gap-1",
365
+ children: [
366
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
367
+ className: (0, _stackframe_stack_ui.cn)("h-7 w-7 flex items-center justify-center rounded-lg", "hover:bg-foreground/[0.04] disabled:opacity-30 disabled:cursor-not-allowed", "transition-colors duration-75"),
368
+ onClick: () => setPage(state.pagination.pageIndex - 1),
369
+ disabled: state.pagination.pageIndex === 0,
370
+ "aria-label": "Previous page",
371
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.CaretUp, {
372
+ className: "h-3.5 w-3.5 -rotate-90",
373
+ weight: "bold"
374
+ })
375
+ }),
376
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
377
+ className: "px-2 tabular-nums font-medium",
378
+ children: strings.pageOf(state.pagination.pageIndex + 1, totalPages)
379
+ }),
380
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
381
+ className: (0, _stackframe_stack_ui.cn)("h-7 w-7 flex items-center justify-center rounded-lg", "hover:bg-foreground/[0.04] disabled:opacity-30 disabled:cursor-not-allowed", "transition-colors duration-75"),
382
+ onClick: () => setPage(state.pagination.pageIndex + 1),
383
+ disabled: state.pagination.pageIndex >= totalPages - 1,
384
+ "aria-label": "Next page",
385
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.CaretDown, {
386
+ className: "h-3.5 w-3.5 -rotate-90",
387
+ weight: "bold"
388
+ })
389
+ })
390
+ ]
391
+ })]
392
+ })]
393
+ });
394
+ }
395
+ /**
396
+ * Interactive table built on TanStack Table v8. Sorting, column sizing,
397
+ * visibility, ordering, and pinning are owned by the table instance; we
398
+ * layer virtualization, sticky toolbar/header/footer, infinite scroll,
399
+ * quick search, CSV export, and date-format toggling on top.
400
+ *
401
+ * The grid is display-only — it does not fetch or page data itself. Pair
402
+ * with `useDataSource` for client- or server-side data and pass the
403
+ * already-processed slice through `rows`.
404
+ *
405
+ * ```tsx
406
+ * const columns = useMemo(() => [...], []);
407
+ * const [gridState, setGridState] = useState(() => createDefaultDataGridState(columns));
408
+ * const gridData = useDataSource({
409
+ * data: users, columns, getRowId: (r) => r.id,
410
+ * sorting: gridState.sorting,
411
+ * quickSearch: gridState.quickSearch,
412
+ * pagination: gridState.pagination,
413
+ * paginationMode: "client",
414
+ * });
415
+ *
416
+ * <DataGrid
417
+ * columns={columns}
418
+ * rows={gridData.rows}
419
+ * getRowId={(r) => r.id}
420
+ * totalRowCount={gridData.totalRowCount}
421
+ * isLoading={gridData.isLoading}
422
+ * state={gridState}
423
+ * onChange={setGridState}
424
+ * />
425
+ * ```
426
+ *
427
+ * Iron rules:
428
+ * - `rows` is always `gridData.rows`, never your raw array.
429
+ * - Columns must be stable (define outside the component or wrap in `useMemo`).
430
+ * - Initialize state with `createDefaultDataGridState(columns)`.
431
+ * - `renderCell` must be a pure function — no React hooks inside.
432
+ */
433
+ function DataGrid(props) {
434
+ const { columns: allColumns, rows, getRowId, totalRowCount, isLoading = false, isRefetching = false, hasMore = false, isLoadingMore = false, onLoadMore, state, onChange, paginationMode = "paginated", selectionMode = "none", resizable = true, rowHeight: rowHeightProp = 44, estimatedRowHeight: estimatedRowHeightProp, headerHeight = 44, overscan = 5, maxHeight, fillHeight = true, stickyTop, toolbar, toolbarExtra, emptyState, loadingState, footer, footerExtra, exportFilename = "export", strings: stringsOverride, className, onRowClick, onRowDoubleClick, onSelectionChange, onSortChange, onColumnResize, onColumnVisibilityChange } = props;
435
+ const isDynamicRowHeight = rowHeightProp === "auto";
436
+ const fixedRowHeight = isDynamicRowHeight ? void 0 : rowHeightProp;
437
+ const estimatedRowHeight = estimatedRowHeightProp ?? fixedRowHeight ?? 44;
438
+ const strings = (0, react.useMemo)(() => (0, __strings_js.resolveDataGridStrings)(stringsOverride), [stringsOverride]);
439
+ const tableColumns = (0, react.useMemo)(() => allColumns.map((col) => ({
440
+ id: col.id,
441
+ accessorFn: (row) => (0, __state_js.resolveColumnValue)(col, row),
442
+ header: typeof col.header === "string" ? col.header : col.id,
443
+ size: col.width ?? __data_grid_sizing_js.DEFAULT_COL_WIDTH,
444
+ minSize: (0, __data_grid_sizing_js.getEffectiveMinWidth)(col),
445
+ maxSize: (0, __data_grid_sizing_js.getEffectiveMaxWidth)(col),
446
+ enableSorting: col.sortable !== false,
447
+ enableHiding: col.hideable !== false,
448
+ enableResizing: col.resizable !== false,
449
+ enableMultiSort: true
450
+ })), [allColumns]);
451
+ const tanstackSorting = (0, react.useMemo)(() => toTanstackSorting(state.sorting), [state.sorting]);
452
+ const tanstackRowSelection = (0, react.useMemo)(() => toTanstackRowSelection(state.selection.selectedIds), [state.selection.selectedIds]);
453
+ const tanstackColumnPinning = (0, react.useMemo)(() => ({
454
+ left: [...state.columnPinning.left],
455
+ right: [...state.columnPinning.right]
456
+ }), [state.columnPinning]);
457
+ const tanstackColumnOrder = (0, react.useMemo)(() => [...state.columnOrder], [state.columnOrder]);
458
+ const allColumnsRef = (0, react.useRef)(allColumns);
459
+ allColumnsRef.current = allColumns;
460
+ const handleSortingChange = (0, react.useCallback)((updater) => {
461
+ const ours = fromTanstackSorting(resolveUpdater(updater, toTanstackSorting(state.sorting))).map((s) => ({ ...s }));
462
+ onChange((s) => ({
463
+ ...s,
464
+ sorting: ours,
465
+ pagination: {
466
+ ...s.pagination,
467
+ pageIndex: 0
468
+ }
469
+ }));
470
+ onSortChange?.(ours);
471
+ }, [
472
+ onChange,
473
+ onSortChange,
474
+ state.sorting
475
+ ]);
476
+ const handleColumnSizingChange = (0, react.useCallback)((updater) => {
477
+ const next = resolveUpdater(updater, state.columnWidths);
478
+ const clamped = {};
479
+ for (const [id, w] of Object.entries(next)) {
480
+ const col = allColumnsRef.current.find((c) => c.id === id);
481
+ clamped[id] = col ? (0, __data_grid_sizing_js.clampColumnWidth)(col, w) : w;
482
+ }
483
+ onChange((s) => ({
484
+ ...s,
485
+ columnWidths: clamped
486
+ }));
487
+ if (onColumnResize) {
488
+ for (const [id, w] of Object.entries(clamped)) if (state.columnWidths[id] !== w) onColumnResize(id, w);
489
+ }
490
+ }, [
491
+ onChange,
492
+ onColumnResize,
493
+ state.columnWidths
494
+ ]);
495
+ const handleVisibilityChange = (0, react.useCallback)((updater) => {
496
+ const next = resolveUpdater(updater, state.columnVisibility);
497
+ onChange((s) => ({
498
+ ...s,
499
+ columnVisibility: next
500
+ }));
501
+ onColumnVisibilityChange?.(next);
502
+ }, [
503
+ onChange,
504
+ onColumnVisibilityChange,
505
+ state.columnVisibility
506
+ ]);
507
+ const handleColumnOrderChange = (0, react.useCallback)((updater) => {
508
+ const next = resolveUpdater(updater, [...state.columnOrder]);
509
+ onChange((s) => ({
510
+ ...s,
511
+ columnOrder: next
512
+ }));
513
+ }, [onChange, state.columnOrder]);
514
+ const handleColumnPinningChange = (0, react.useCallback)((updater) => {
515
+ const next = resolveUpdater(updater, {
516
+ left: [...state.columnPinning.left],
517
+ right: [...state.columnPinning.right]
518
+ });
519
+ onChange((s) => ({
520
+ ...s,
521
+ columnPinning: {
522
+ left: next.left ?? [],
523
+ right: next.right ?? []
524
+ }
525
+ }));
526
+ }, [onChange, state.columnPinning]);
527
+ const table = (0, _tanstack_react_table.useReactTable)({
528
+ data: rows,
529
+ columns: tableColumns,
530
+ getRowId: (row) => getRowId(row),
531
+ getCoreRowModel: (0, _tanstack_react_table.getCoreRowModel)(),
532
+ state: {
533
+ sorting: tanstackSorting,
534
+ columnVisibility: state.columnVisibility,
535
+ columnSizing: state.columnWidths,
536
+ columnOrder: tanstackColumnOrder,
537
+ columnPinning: tanstackColumnPinning,
538
+ rowSelection: tanstackRowSelection
539
+ },
540
+ onSortingChange: handleSortingChange,
541
+ onColumnSizingChange: handleColumnSizingChange,
542
+ onColumnVisibilityChange: handleVisibilityChange,
543
+ onColumnOrderChange: handleColumnOrderChange,
544
+ onColumnPinningChange: handleColumnPinningChange,
545
+ columnResizeMode: "onEnd",
546
+ enableRowSelection: selectionMode !== "none",
547
+ enableMultiRowSelection: selectionMode === "multiple",
548
+ enableColumnResizing: resizable,
549
+ manualSorting: true,
550
+ manualPagination: true,
551
+ manualFiltering: true
552
+ });
553
+ const visibleColumns = (0, react.useMemo)(() => {
554
+ const colMap = new Map(allColumns.map((c) => [c.id, c]));
555
+ return table.getVisibleLeafColumns().map((c) => colMap.get(c.id)).filter(Boolean);
556
+ }, [
557
+ allColumns,
558
+ table,
559
+ state.columnOrder,
560
+ state.columnVisibility
561
+ ]);
562
+ const rowIds = (0, react.useMemo)(() => rows.map(getRowId), [rows, getRowId]);
563
+ const [containerWidth, setContainerWidth] = (0, react.useState)(0);
564
+ (0, react.useLayoutEffect)(() => {
565
+ const grid = gridRef.current;
566
+ const scroller = scrollContainerRef.current;
567
+ if (!grid) return;
568
+ const update = () => {
569
+ const w = scroller?.clientWidth ?? grid.clientWidth;
570
+ if (w > 0) setContainerWidth(w);
571
+ };
572
+ update();
573
+ const observer = new ResizeObserver(update);
574
+ observer.observe(grid);
575
+ if (scroller) observer.observe(scroller);
576
+ return () => observer.disconnect();
577
+ }, []);
578
+ const columnSizingInfo = table.getState().columnSizingInfo;
579
+ const columnSizes = (0, react.useMemo)(() => {
580
+ const sizes = {};
581
+ let baseTotal = selectionMode !== "none" ? 44 : 0;
582
+ const resizingId = columnSizingInfo.isResizingColumn || null;
583
+ const deltaOffset = columnSizingInfo.deltaOffset ?? 0;
584
+ for (const col of visibleColumns) {
585
+ const baseSize = table.getColumn(col.id)?.getSize() ?? col.width ?? __data_grid_sizing_js.DEFAULT_COL_WIDTH;
586
+ const liveSize = resizingId === col.id ? (0, __data_grid_sizing_js.clampColumnWidth)(col, baseSize + deltaOffset) : baseSize;
587
+ sizes[col.id] = liveSize;
588
+ baseTotal += liveSize;
589
+ }
590
+ distributeFlexWidths(sizes, visibleColumns, containerWidth - baseTotal);
591
+ return sizes;
592
+ }, [
593
+ visibleColumns,
594
+ table,
595
+ columnSizingInfo,
596
+ state.columnWidths,
597
+ containerWidth,
598
+ selectionMode
599
+ ]);
600
+ const totalContentWidth = (0, react.useMemo)(() => {
601
+ let total = selectionMode !== "none" ? 44 : 0;
602
+ for (const col of visibleColumns) total += columnSizes[col.id] ?? 0;
603
+ return total;
604
+ }, [
605
+ visibleColumns,
606
+ columnSizes,
607
+ selectionMode
608
+ ]);
609
+ const cssVars = (0, react.useMemo)(() => {
610
+ const vars = { "--grid-total-w": `${totalContentWidth}px` };
611
+ for (const col of visibleColumns) vars[`--col-${col.id}-size`] = columnSizes[col.id];
612
+ return vars;
613
+ }, [
614
+ visibleColumns,
615
+ columnSizes,
616
+ totalContentWidth
617
+ ]);
618
+ const fireSelection = (0, react.useCallback)((next) => {
619
+ onChange((s) => ({
620
+ ...s,
621
+ selection: next
622
+ }));
623
+ if (onSelectionChange) {
624
+ const idSet = next.selectedIds;
625
+ onSelectionChange(idSet, rows.filter((r) => idSet.has(getRowId(r))));
626
+ }
627
+ }, [
628
+ onChange,
629
+ onSelectionChange,
630
+ rows,
631
+ getRowId
632
+ ]);
633
+ const handleRowClick = (0, react.useCallback)((row, rowId, event) => {
634
+ if (selectionMode !== "none") fireSelection(nextSelection({
635
+ current: state.selection,
636
+ rowId,
637
+ mode: selectionMode,
638
+ modifiers: {
639
+ shift: event.shiftKey,
640
+ ctrl: event.metaKey || event.ctrlKey
641
+ },
642
+ allRowIds: rowIds
643
+ }));
644
+ onRowClick?.(row, rowId, event);
645
+ }, [
646
+ selectionMode,
647
+ state.selection,
648
+ rowIds,
649
+ fireSelection,
650
+ onRowClick
651
+ ]);
652
+ const handleSelectAll = (0, react.useCallback)(() => {
653
+ fireSelection(rowIds.length > 0 && rowIds.every((id) => state.selection.selectedIds.has(id)) ? {
654
+ selectedIds: /* @__PURE__ */ new Set(),
655
+ anchorId: null
656
+ } : {
657
+ selectedIds: new Set(rowIds),
658
+ anchorId: null
659
+ });
660
+ }, [
661
+ rowIds,
662
+ state.selection.selectedIds,
663
+ fireSelection
664
+ ]);
665
+ const handleExportCsv = (0, react.useCallback)(() => {
666
+ if (typeof window !== "undefined" && rows.length > 0) {
667
+ const totalSuffix = totalRowCount != null && totalRowCount > rows.length ? ` of ${totalRowCount} total — load more rows first to include them` : "";
668
+ if (!window.confirm(`Export ${rows.length.toLocaleString()} loaded row${rows.length === 1 ? "" : "s"}${totalSuffix}?`)) return;
669
+ }
670
+ (0, __state_js.exportToCsv)(rows, visibleColumns, exportFilename);
671
+ }, [
672
+ rows,
673
+ visibleColumns,
674
+ exportFilename,
675
+ totalRowCount
676
+ ]);
677
+ const scrollContainerRef = (0, react.useRef)(null);
678
+ const headerScrollRef = (0, react.useRef)(null);
679
+ const stickyChromeRef = (0, react.useRef)(null);
680
+ const rowsClipRef = (0, react.useRef)(null);
681
+ const gridRef = (0, react.useRef)(null);
682
+ const measureElementFn = (0, react.useCallback)((el) => el.getBoundingClientRect().height, []);
683
+ const rowVirtualizer = (0, _tanstack_react_virtual.useVirtualizer)({
684
+ count: rows.length,
685
+ getScrollElement: () => scrollContainerRef.current,
686
+ estimateSize: () => estimatedRowHeight,
687
+ overscan,
688
+ getItemKey: (index) => {
689
+ const row = rows[index];
690
+ return row != null ? String(getRowId(row)) : index;
691
+ },
692
+ ...isDynamicRowHeight ? { measureElement: measureElementFn } : {}
693
+ });
694
+ (0, react.useLayoutEffect)(() => {
695
+ const gridEl = gridRef.current;
696
+ const stickyEl = stickyChromeRef.current;
697
+ const bodyEl = scrollContainerRef.current;
698
+ const clipEl = rowsClipRef.current;
699
+ if (!gridEl || !stickyEl || !bodyEl || !clipEl) return;
700
+ const updateClip = () => {
701
+ const stickyRect = stickyEl.getBoundingClientRect();
702
+ const clipRect = clipEl.getBoundingClientRect();
703
+ const overlap = Math.max(0, stickyRect.bottom - clipRect.top);
704
+ clipEl.style.setProperty("--data-grid-sticky-overlap", `${overlap}px`);
705
+ };
706
+ updateClip();
707
+ bodyEl.addEventListener("scroll", updateClip);
708
+ window.addEventListener("scroll", updateClip, true);
709
+ window.addEventListener("resize", updateClip);
710
+ const observer = new ResizeObserver(updateClip);
711
+ observer.observe(gridEl);
712
+ observer.observe(stickyEl);
713
+ observer.observe(bodyEl);
714
+ return () => {
715
+ bodyEl.removeEventListener("scroll", updateClip);
716
+ window.removeEventListener("scroll", updateClip, true);
717
+ window.removeEventListener("resize", updateClip);
718
+ observer.disconnect();
719
+ };
720
+ }, []);
721
+ const handleBodyScroll = (0, react.useCallback)(() => {
722
+ const body = scrollContainerRef.current;
723
+ const header = headerScrollRef.current;
724
+ if (body && header) header.scrollLeft = body.scrollLeft;
725
+ }, []);
726
+ const toolbarCtx = (0, react.useMemo)(() => ({
727
+ state,
728
+ onChange,
729
+ columns: allColumns,
730
+ visibleColumns,
731
+ totalRowCount,
732
+ selectedRowCount: state.selection.selectedIds.size,
733
+ strings,
734
+ exportCsv: handleExportCsv
735
+ }), [
736
+ state,
737
+ onChange,
738
+ allColumns,
739
+ visibleColumns,
740
+ totalRowCount,
741
+ strings,
742
+ handleExportCsv
743
+ ]);
744
+ const footerCtx = (0, react.useMemo)(() => ({
745
+ state,
746
+ totalRowCount,
747
+ visibleRowCount: rows.length,
748
+ selectedRowCount: state.selection.selectedIds.size,
749
+ paginationMode,
750
+ strings
751
+ }), [
752
+ state,
753
+ totalRowCount,
754
+ rows.length,
755
+ paginationMode,
756
+ strings
757
+ ]);
758
+ const allSelected = rowIds.length > 0 && rowIds.every((id) => state.selection.selectedIds.has(id));
759
+ const someSelected = !allSelected && rowIds.some((id) => state.selection.selectedIds.has(id));
760
+ const infiniteScrollRootRef = paginationMode === "infinite" && (fillHeight || maxHeight != null) ? scrollContainerRef : void 0;
761
+ const headers = (0, react.useMemo)(() => table.getHeaderGroups()[0]?.headers.filter((h) => visibleColumns.some((c) => c.id === h.column.id)) ?? [], [table, visibleColumns]);
762
+ const headerByColId = (0, react.useMemo)(() => {
763
+ const m = /* @__PURE__ */ new Map();
764
+ for (const h of headers) m.set(h.column.id, h);
765
+ return m;
766
+ }, [headers]);
767
+ const isBounded = fillHeight || maxHeight != null;
768
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
769
+ ref: gridRef,
770
+ className: (0, _stackframe_stack_ui.cn)("isolate flex w-full min-w-0 max-w-full flex-col bg-transparent rounded-[calc(var(--radius)*2)]", fillHeight ? "min-h-0 h-full" : "min-h-0 h-auto", isBounded && "overflow-hidden", className),
771
+ style: maxHeight != null ? {
772
+ ...cssVars,
773
+ maxHeight
774
+ } : cssVars,
775
+ role: "grid",
776
+ "aria-rowcount": totalRowCount ?? rows.length,
777
+ "aria-colcount": visibleColumns.length,
778
+ children: [
779
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
780
+ ref: stickyChromeRef,
781
+ className: "sticky z-30 w-full min-w-0 shrink-0 overflow-visible rounded-t-[calc(var(--radius)*2)] bg-white/90 dark:bg-background/60 backdrop-blur-xl",
782
+ style: { top: stickyTop ?? (maxHeight != null ? 0 : "var(--data-grid-sticky-top, 0px)") },
783
+ children: [toolbar !== false && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
784
+ className: "relative bg-transparent",
785
+ children: toolbar ? toolbar(toolbarCtx) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__data_grid_toolbar_js.DataGridToolbar, {
786
+ ctx: toolbarCtx,
787
+ extra: typeof toolbarExtra === "function" ? toolbarExtra(toolbarCtx) : toolbarExtra
788
+ })
789
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
790
+ className: "relative",
791
+ children: [isRefetching && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
792
+ className: "absolute top-0 left-0 right-0 h-0.5 z-30 bg-foreground/[0.04] overflow-hidden",
793
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "h-full w-1/3 bg-blue-500/60 rounded-full animate-pulse" })
794
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
795
+ ref: headerScrollRef,
796
+ className: "w-full min-w-0 shrink-0 overflow-hidden border-b border-foreground/[0.06]",
797
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
798
+ className: "flex",
799
+ style: {
800
+ height: headerHeight,
801
+ minWidth: totalContentWidth
802
+ },
803
+ role: "row",
804
+ children: [selectionMode !== "none" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
805
+ className: "flex items-center justify-center border-r border-foreground/[0.04]",
806
+ style: { width: 44 },
807
+ children: selectionMode === "multiple" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectionCheckbox, {
808
+ checked: allSelected,
809
+ indeterminate: someSelected,
810
+ onChange: handleSelectAll,
811
+ ariaLabel: "Select all rows on this page",
812
+ title: "Select all rows on this page"
813
+ })
814
+ }), visibleColumns.map((col) => {
815
+ const header = headerByColId.get(col.id);
816
+ if (!header) return null;
817
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HeaderCell, {
818
+ header,
819
+ col,
820
+ resizable
821
+ }, col.id);
822
+ })]
823
+ })
824
+ })]
825
+ })]
826
+ }),
827
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
828
+ ref: scrollContainerRef,
829
+ className: (0, _stackframe_stack_ui.cn)("relative z-0 w-full min-w-0 overflow-auto bg-transparent", isBounded ? "min-h-0 flex-1" : "flex-none", "[&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar]:h-1.5", "[&::-webkit-scrollbar-track]:bg-transparent", "[&::-webkit-scrollbar-thumb]:bg-foreground/[0.08] [&::-webkit-scrollbar-thumb]:rounded-full", "[&::-webkit-scrollbar-thumb]:hover:bg-foreground/[0.15]"),
830
+ onScroll: handleBodyScroll,
831
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
832
+ ref: rowsClipRef,
833
+ "data-data-grid-rows-clip": "",
834
+ className: "relative z-0",
835
+ style: {
836
+ minWidth: totalContentWidth,
837
+ clipPath: "inset(var(--data-grid-sticky-overlap, 0px) 0 0 0)"
838
+ },
839
+ children: [
840
+ isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
841
+ style: { minWidth: totalContentWidth },
842
+ children: loadingState ?? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SkeletonRow, {
843
+ columns: visibleColumns,
844
+ height: estimatedRowHeight,
845
+ showCheckbox: selectionMode !== "none"
846
+ }, i))
847
+ }),
848
+ !isLoading && rows.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
849
+ className: "flex items-center justify-center py-16 text-sm text-muted-foreground",
850
+ style: { minWidth: totalContentWidth },
851
+ children: emptyState ?? strings.noData
852
+ }),
853
+ !isLoading && rows.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
854
+ style: {
855
+ height: rowVirtualizer.getTotalSize(),
856
+ width: "100%",
857
+ minWidth: totalContentWidth,
858
+ position: "relative"
859
+ },
860
+ children: rowVirtualizer.getVirtualItems().map((virtualRow) => {
861
+ const row = rows[virtualRow.index] ?? (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(`DataGrid: virtualized row index ${virtualRow.index} out of range (rows.length=${rows.length})`);
862
+ const rowId = getRowId(row);
863
+ const isSelected = state.selection.selectedIds.has(rowId);
864
+ const isOddRow = virtualRow.index % 2 === 1;
865
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
866
+ ref: isDynamicRowHeight ? rowVirtualizer.measureElement : void 0,
867
+ "data-index": virtualRow.index,
868
+ className: (0, _stackframe_stack_ui.cn)("absolute left-0 w-full flex", "border-b border-black/[0.03] dark:border-white/[0.03]", "transition-colors duration-75", isSelected ? "bg-blue-500/[0.06] dark:bg-blue-400/[0.08] hover:bg-blue-500/[0.08] dark:hover:bg-blue-400/[0.1]" : isOddRow ? "bg-foreground/[0.02] dark:bg-foreground/[0.03] hover:bg-foreground/[0.04] dark:hover:bg-foreground/[0.06]" : "hover:bg-foreground/[0.025] dark:hover:bg-foreground/[0.04]", (selectionMode !== "none" || onRowClick) && "cursor-pointer"),
869
+ style: {
870
+ ...isDynamicRowHeight ? { minHeight: estimatedRowHeight } : { height: fixedRowHeight },
871
+ transform: `translateY(${virtualRow.start}px)`
872
+ },
873
+ onClick: (e) => {
874
+ if (!shouldIgnoreRowClick(e)) handleRowClick(row, rowId, e);
875
+ },
876
+ onDoubleClick: (e) => {
877
+ if (!shouldIgnoreRowClick(e)) onRowDoubleClick?.(row, rowId, e);
878
+ },
879
+ role: "row",
880
+ "aria-rowindex": virtualRow.index + 2,
881
+ "aria-selected": isSelected,
882
+ "data-row-id": rowId,
883
+ "data-state": isSelected ? "selected" : void 0,
884
+ children: [selectionMode !== "none" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
885
+ className: "flex items-center justify-center border-r border-black/[0.04] dark:border-white/[0.04]",
886
+ style: { width: 44 },
887
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectionCheckbox, {
888
+ checked: isSelected,
889
+ onChange: (event) => handleRowClick(row, rowId, event),
890
+ ariaLabel: `Select row ${rowId}`
891
+ })
892
+ }), visibleColumns.map((col) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DataCell, {
893
+ col,
894
+ row,
895
+ rowId,
896
+ rowIndex: virtualRow.index,
897
+ isSelected,
898
+ dateDisplay: state.dateDisplay
899
+ }, col.id))]
900
+ }, rowId);
901
+ })
902
+ }),
903
+ paginationMode === "infinite" && hasMore && !isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfiniteScrollSentinel, {
904
+ onIntersect: onLoadMore ?? NOOP,
905
+ isLoading: isLoadingMore,
906
+ rootRef: infiniteScrollRootRef,
907
+ strings
908
+ })
909
+ ]
910
+ })
911
+ }),
912
+ footer !== false && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
913
+ className: "sticky bottom-0 z-30 shrink-0 overflow-hidden rounded-b-[calc(var(--radius)*2)] bg-white/90 dark:bg-background/60 backdrop-blur-xl",
914
+ children: [footer ? footer(footerCtx) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DefaultFooter, {
915
+ ctx: footerCtx,
916
+ pagination: paginationMode,
917
+ onChange
918
+ }), footerExtra && (typeof footerExtra === "function" ? footerExtra(footerCtx) : footerExtra)]
919
+ })
920
+ ]
921
+ });
922
+ }
923
+
924
+ //#endregion
925
+ exports.DataGrid = DataGrid;
926
+ exports.isDataGridInteractiveRowClickTarget = isDataGridInteractiveRowClickTarget;
927
+ //# sourceMappingURL=data-grid.js.map