@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,187 @@
1
+ import { DEFAULT_COL_WIDTH, clampColumnWidth } from "./data-grid-sizing.js";
2
+ import { stringCompare } from "@hexclave/shared/dist/utils/strings";
3
+
4
+ //#region src/components/data-grid/state.ts
5
+ /**
6
+ * Build the initial `DataGridState` for a set of columns. Pass this as the
7
+ * lazy initializer to `useState` — never hand-assemble the state object.
8
+ *
9
+ * ```tsx
10
+ * const [gridState, setGridState] = React.useState(() =>
11
+ * createDefaultDataGridState(columns)
12
+ * );
13
+ * ```
14
+ */
15
+ function createDefaultDataGridState(columns) {
16
+ const columnWidths = {};
17
+ const columnOrder = [];
18
+ for (const col of columns) {
19
+ columnWidths[col.id] = clampColumnWidth(col, col.width ?? DEFAULT_COL_WIDTH);
20
+ columnOrder.push(col.id);
21
+ }
22
+ return {
23
+ sorting: [],
24
+ columnVisibility: {},
25
+ columnWidths,
26
+ columnPinning: {
27
+ left: [],
28
+ right: []
29
+ },
30
+ columnOrder,
31
+ pagination: {
32
+ pageIndex: 0,
33
+ pageSize: 50
34
+ },
35
+ selection: {
36
+ selectedIds: /* @__PURE__ */ new Set(),
37
+ anchorId: null
38
+ },
39
+ dateDisplay: "relative",
40
+ quickSearch: ""
41
+ };
42
+ }
43
+ function resolveColumnValue(col, row) {
44
+ if (typeof col.accessor === "function") return col.accessor(row);
45
+ return row[col.accessor ?? col.id];
46
+ }
47
+ function defaultComparator(a, b) {
48
+ if (a == null && b == null) return 0;
49
+ if (a == null) return -1;
50
+ if (b == null) return 1;
51
+ if (typeof a === "number" && typeof b === "number") return a - b;
52
+ if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();
53
+ return stringCompare(String(a), String(b));
54
+ }
55
+ function buildRowComparator(sortModel, columns) {
56
+ if (sortModel.length === 0) return null;
57
+ const colMap = new Map(columns.map((c) => [c.id, c]));
58
+ return (a, b) => {
59
+ for (const { columnId, direction } of sortModel) {
60
+ const col = colMap.get(columnId);
61
+ if (!col) continue;
62
+ const va = resolveColumnValue(col, a);
63
+ const vb = resolveColumnValue(col, b);
64
+ const cmp = col.sortComparator ? col.sortComparator(va, vb) : defaultComparator(va, vb);
65
+ if (cmp !== 0) return direction === "asc" ? cmp : -cmp;
66
+ }
67
+ return 0;
68
+ };
69
+ }
70
+ function paginateRows(rows, pagination) {
71
+ const start = pagination.pageIndex * pagination.pageSize;
72
+ return rows.slice(start, start + pagination.pageSize);
73
+ }
74
+ /** Default row matcher: case-insensitive substring across every column. */
75
+ function defaultMatchRow(row, query, columns) {
76
+ for (const col of columns) {
77
+ const v = resolveColumnValue(col, row);
78
+ if (v == null) continue;
79
+ if (String(v).toLowerCase().includes(query)) return true;
80
+ }
81
+ return false;
82
+ }
83
+ function applyQuickSearch(rows, query, columns, matchRow = defaultMatchRow) {
84
+ const trimmed = query.trim().toLowerCase();
85
+ if (!trimmed) return rows;
86
+ return rows.filter((r) => matchRow(r, trimmed, columns));
87
+ }
88
+ function defaultParseDate(value) {
89
+ if (value == null) return null;
90
+ if (value instanceof Date) return isNaN(value.getTime()) ? null : value;
91
+ if (typeof value === "number" || typeof value === "string") {
92
+ const d = new Date(value);
93
+ return isNaN(d.getTime()) ? null : d;
94
+ }
95
+ return null;
96
+ }
97
+ const DIVISIONS = [
98
+ {
99
+ amount: 60,
100
+ unit: "second"
101
+ },
102
+ {
103
+ amount: 60,
104
+ unit: "minute"
105
+ },
106
+ {
107
+ amount: 24,
108
+ unit: "hour"
109
+ },
110
+ {
111
+ amount: 7,
112
+ unit: "day"
113
+ },
114
+ {
115
+ amount: 4.34524,
116
+ unit: "week"
117
+ },
118
+ {
119
+ amount: 12,
120
+ unit: "month"
121
+ },
122
+ {
123
+ amount: Number.POSITIVE_INFINITY,
124
+ unit: "year"
125
+ }
126
+ ];
127
+ const relativeTimeFormatterCache = /* @__PURE__ */ new Map();
128
+ function getRelativeTimeFormatter(locale) {
129
+ const key = locale ?? "__default__";
130
+ let cached = relativeTimeFormatterCache.get(key);
131
+ if (cached == null) {
132
+ cached = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
133
+ relativeTimeFormatterCache.set(key, cached);
134
+ }
135
+ return cached;
136
+ }
137
+ function defaultFormatRelative(date) {
138
+ const rtf = getRelativeTimeFormatter();
139
+ let duration = (date.getTime() - Date.now()) / 1e3;
140
+ for (const div of DIVISIONS) {
141
+ if (Math.abs(duration) < div.amount) return rtf.format(Math.round(duration), div.unit);
142
+ duration /= div.amount;
143
+ }
144
+ return rtf.format(Math.round(duration), "year");
145
+ }
146
+ function defaultFormatAbsolute(date) {
147
+ return date.toLocaleString();
148
+ }
149
+ function formatGridDate(value, mode, opts) {
150
+ const date = (opts?.parseValue ?? defaultParseDate)(value);
151
+ if (!date) return {
152
+ display: null,
153
+ tooltip: null
154
+ };
155
+ const relative = opts?.dateFormat?.relative ?? defaultFormatRelative;
156
+ const tooltip = (opts?.dateFormat?.absolute ?? defaultFormatAbsolute)(date);
157
+ return {
158
+ display: mode === "relative" ? relative(date) : tooltip,
159
+ tooltip
160
+ };
161
+ }
162
+ function exportToCsv(rows, columns, filename) {
163
+ const header = columns.map((col) => typeof col.header === "string" ? col.header : col.id);
164
+ const csvRows = rows.map((row) => columns.map((col) => {
165
+ const val = resolveColumnValue(col, row);
166
+ const formatted = col.formatValue ? String(col.formatValue(val, row) ?? "") : String(val ?? "");
167
+ if (formatted.includes(",") || formatted.includes("\"") || formatted.includes("\n")) return `"${formatted.replace(/"/g, "\"\"")}"`;
168
+ return formatted;
169
+ }));
170
+ const csvContent = "" + [header.join(","), ...csvRows.map((row) => row.join(","))].join("\n");
171
+ const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
172
+ const url = URL.createObjectURL(blob);
173
+ const link = document.createElement("a");
174
+ link.href = url;
175
+ link.download = `${filename}.csv`;
176
+ document.body.appendChild(link);
177
+ try {
178
+ link.click();
179
+ } finally {
180
+ link.remove();
181
+ URL.revokeObjectURL(url);
182
+ }
183
+ }
184
+
185
+ //#endregion
186
+ export { applyQuickSearch, buildRowComparator, createDefaultDataGridState, defaultFormatAbsolute, defaultFormatRelative, defaultMatchRow, defaultParseDate, exportToCsv, formatGridDate, paginateRows, resolveColumnValue };
187
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","names":[],"sources":["../../../../src/components/data-grid/state.ts"],"sourcesContent":["import { stringCompare } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { clampColumnWidth, DEFAULT_COL_WIDTH } from \"./data-grid-sizing\";\nimport type {\n DataGridColumnDef,\n DataGridDateDisplay,\n DataGridDateFormat,\n DataGridPaginationModel,\n DataGridSortModel,\n DataGridState,\n} from \"./types\";\n\n/**\n * Build the initial `DataGridState` for a set of columns. Pass this as the\n * lazy initializer to `useState` — never hand-assemble the state object.\n *\n * ```tsx\n * const [gridState, setGridState] = React.useState(() =>\n * createDefaultDataGridState(columns)\n * );\n * ```\n */\nexport function createDefaultDataGridState(\n columns: readonly DataGridColumnDef<any>[],\n): DataGridState {\n const columnWidths: Record<string, number> = {};\n const columnOrder: string[] = [];\n\n for (const col of columns) {\n columnWidths[col.id] = clampColumnWidth(col, col.width ?? DEFAULT_COL_WIDTH);\n columnOrder.push(col.id);\n }\n\n return {\n sorting: [],\n columnVisibility: {},\n columnWidths,\n columnPinning: { left: [], right: [] },\n columnOrder,\n pagination: { pageIndex: 0, pageSize: 50 },\n selection: { selectedIds: new Set(), anchorId: null },\n dateDisplay: \"relative\",\n quickSearch: \"\",\n };\n}\n\n// ─── Column value resolution ─────────────────────────────────────────\n\nexport function resolveColumnValue<TRow>(\n col: DataGridColumnDef<TRow>,\n row: TRow,\n): unknown {\n if (typeof col.accessor === \"function\") return col.accessor(row);\n const key = (col.accessor ?? col.id) as keyof TRow;\n return row[key];\n}\n\n// ─── Default sort comparator (used by client-mode useDataSource) ────\n\nfunction defaultComparator(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return stringCompare(String(a), String(b));\n}\n\nexport function buildRowComparator<TRow>(\n sortModel: DataGridSortModel,\n columns: readonly DataGridColumnDef<TRow>[],\n): ((a: TRow, b: TRow) => number) | null {\n if (sortModel.length === 0) return null;\n const colMap = new Map(columns.map((c) => [c.id, c]));\n return (a, b) => {\n for (const { columnId, direction } of sortModel) {\n const col = colMap.get(columnId);\n if (!col) continue;\n const va = resolveColumnValue(col, a);\n const vb = resolveColumnValue(col, b);\n const cmp = col.sortComparator ? col.sortComparator(va, vb) : defaultComparator(va, vb);\n if (cmp !== 0) return direction === \"asc\" ? cmp : -cmp;\n }\n return 0;\n };\n}\n\n// ─── Pagination ──────────────────────────────────────────────────────\n\nexport function paginateRows<TRow>(\n rows: readonly TRow[],\n pagination: DataGridPaginationModel,\n): TRow[] {\n const start = pagination.pageIndex * pagination.pageSize;\n return rows.slice(start, start + pagination.pageSize) as TRow[];\n}\n\n// ─── Quick search ────────────────────────────────────────────────────\n\n/** Default row matcher: case-insensitive substring across every column. */\nexport function defaultMatchRow<TRow>(\n row: TRow,\n query: string,\n columns: readonly DataGridColumnDef<TRow>[],\n): boolean {\n for (const col of columns) {\n const v = resolveColumnValue(col, row);\n if (v == null) continue;\n if (String(v).toLowerCase().includes(query)) return true;\n }\n return false;\n}\n\nexport function applyQuickSearch<TRow>(\n rows: readonly TRow[],\n query: string,\n columns: readonly DataGridColumnDef<TRow>[],\n matchRow: (\n row: TRow,\n query: string,\n columns: readonly DataGridColumnDef<TRow>[],\n ) => boolean = defaultMatchRow,\n): readonly TRow[] {\n const trimmed = query.trim().toLowerCase();\n if (!trimmed) return rows;\n return rows.filter((r) => matchRow(r, trimmed, columns));\n}\n\n// ─── Date helpers ────────────────────────────────────────────────────\n\nexport function defaultParseDate(value: unknown): Date | null {\n if (value == null) return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\n if (typeof value === \"number\" || typeof value === \"string\") {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nconst DIVISIONS: Array<{ amount: number; unit: Intl.RelativeTimeFormatUnit }> = [\n { amount: 60, unit: \"second\" },\n { amount: 60, unit: \"minute\" },\n { amount: 24, unit: \"hour\" },\n { amount: 7, unit: \"day\" },\n { amount: 4.34524, unit: \"week\" },\n { amount: 12, unit: \"month\" },\n { amount: Number.POSITIVE_INFINITY, unit: \"year\" },\n];\n\nconst relativeTimeFormatterCache = new Map<string, Intl.RelativeTimeFormat>();\nfunction getRelativeTimeFormatter(locale?: string): Intl.RelativeTimeFormat {\n const key = locale ?? \"__default__\";\n let cached = relativeTimeFormatterCache.get(key);\n if (cached == null) {\n cached = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n relativeTimeFormatterCache.set(key, cached);\n }\n return cached;\n}\n\nexport function defaultFormatRelative(date: Date): string {\n const rtf = getRelativeTimeFormatter();\n // Wall-clock comparison to \"now\" (e.g. \"5 minutes ago\"). performance.now()\n // would be wrong here — it's a monotonic timer, not a wall-clock instant.\n let duration = (date.getTime() - Date.now()) / 1000;\n for (const div of DIVISIONS) {\n if (Math.abs(duration) < div.amount) return rtf.format(Math.round(duration), div.unit);\n duration /= div.amount;\n }\n return rtf.format(Math.round(duration), \"year\");\n}\n\nexport function defaultFormatAbsolute(date: Date): string {\n return date.toLocaleString();\n}\n\nexport function formatGridDate(\n value: unknown,\n mode: DataGridDateDisplay,\n opts?: {\n parseValue?: (value: unknown) => Date | null;\n dateFormat?: DataGridDateFormat;\n },\n): { display: string | null; tooltip: string | null } {\n const parse = opts?.parseValue ?? defaultParseDate;\n const date = parse(value);\n if (!date) return { display: null, tooltip: null };\n const relative = opts?.dateFormat?.relative ?? defaultFormatRelative;\n const absolute = opts?.dateFormat?.absolute ?? defaultFormatAbsolute;\n const tooltip = absolute(date);\n const display = mode === \"relative\" ? relative(date) : tooltip;\n return { display, tooltip };\n}\n\n// ─── CSV Export ──────────────────────────────────────────────────────\n\nexport function exportToCsv<TRow>(\n rows: readonly TRow[],\n columns: readonly DataGridColumnDef<TRow>[],\n filename: string,\n): void {\n const header = columns.map((col) =>\n typeof col.header === \"string\" ? col.header : col.id,\n );\n const csvRows = rows.map((row) =>\n columns.map((col) => {\n const val = resolveColumnValue(col, row);\n const formatted = col.formatValue\n ? String((col.formatValue(val, row) as string | null | undefined) ?? \"\")\n : String(val ?? \"\");\n if (formatted.includes(\",\") || formatted.includes('\"') || formatted.includes(\"\\n\")) {\n return `\"${formatted.replace(/\"/g, '\"\"')}\"`;\n }\n return formatted;\n }),\n );\n // UTF-8 BOM so Excel opens the CSV as UTF-8.\n const csvContent = \"\\uFEFF\" + [\n header.join(\",\"),\n ...csvRows.map((row) => row.join(\",\")),\n ].join(\"\\n\");\n\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `${filename}.csv`;\n document.body.appendChild(link);\n try {\n link.click();\n } finally {\n link.remove();\n URL.revokeObjectURL(url);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { DataGridStrings } from "./types";
2
+
3
+ //#region src/components/data-grid/strings.d.ts
4
+ declare const DATA_GRID_DEFAULT_STRINGS: DataGridStrings;
5
+ declare function resolveDataGridStrings(override: Partial<DataGridStrings> | undefined): DataGridStrings;
6
+ //#endregion
7
+ export { DATA_GRID_DEFAULT_STRINGS, resolveDataGridStrings };
8
+ //# sourceMappingURL=strings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.d.ts","names":[],"sources":["../../../../src/components/data-grid/strings.ts"],"mappings":";;;cAEa,yBAAA,EAA2B,eAAA;AAAA,iBAqCxB,sBAAA,CACd,QAAA,EAAU,OAAA,CAAQ,eAAA,gBACjB,eAAA"}
@@ -0,0 +1,39 @@
1
+ //#region src/components/data-grid/strings.ts
2
+ const DATA_GRID_DEFAULT_STRINGS = {
3
+ searchPlaceholder: "Search…",
4
+ columns: "Columns",
5
+ export: "Export",
6
+ density: "Density",
7
+ showAll: "Show all",
8
+ hideAll: "Hide all",
9
+ resetColumns: "Reset",
10
+ dateFormat: "Date format",
11
+ dateFormatRelative: "Relative",
12
+ dateFormatAbsolute: "Absolute",
13
+ rowsSelected: (count) => `${count} row${count === 1 ? "" : "s"} selected`,
14
+ rowsPerPage: "Rows per page",
15
+ pageOf: (page, total) => `${page} of ${total}`,
16
+ noData: "No data",
17
+ loading: "Loading…",
18
+ loadingMore: "Loading more…",
19
+ exportCsv: "Export CSV",
20
+ exportCopied: "Copied!",
21
+ sortAsc: "Sort ascending",
22
+ sortDesc: "Sort descending",
23
+ unsort: "Remove sort",
24
+ pinLeft: "Pin left",
25
+ pinRight: "Pin right",
26
+ unpin: "Unpin",
27
+ hideColumn: "Hide column"
28
+ };
29
+ function resolveDataGridStrings(override) {
30
+ if (!override) return DATA_GRID_DEFAULT_STRINGS;
31
+ return {
32
+ ...DATA_GRID_DEFAULT_STRINGS,
33
+ ...override
34
+ };
35
+ }
36
+
37
+ //#endregion
38
+ export { DATA_GRID_DEFAULT_STRINGS, resolveDataGridStrings };
39
+ //# sourceMappingURL=strings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.js","names":[],"sources":["../../../../src/components/data-grid/strings.ts"],"sourcesContent":["import type { DataGridStrings } from \"./types\";\n\nexport const DATA_GRID_DEFAULT_STRINGS: DataGridStrings = {\n // toolbar\n searchPlaceholder: \"Search\\u2026\",\n columns: \"Columns\",\n export: \"Export\",\n density: \"Density\",\n // column manager\n showAll: \"Show all\",\n hideAll: \"Hide all\",\n resetColumns: \"Reset\",\n // date display\n dateFormat: \"Date format\",\n dateFormatRelative: \"Relative\",\n dateFormatAbsolute: \"Absolute\",\n // selection\n rowsSelected: (count) => `${count} row${count === 1 ? \"\" : \"s\"} selected`,\n // pagination\n rowsPerPage: \"Rows per page\",\n pageOf: (page, total) => `${page} of ${total}`,\n // empty / loading\n noData: \"No data\",\n loading: \"Loading\\u2026\",\n loadingMore: \"Loading more\\u2026\",\n // export\n exportCsv: \"Export CSV\",\n exportCopied: \"Copied!\",\n // sort\n sortAsc: \"Sort ascending\",\n sortDesc: \"Sort descending\",\n unsort: \"Remove sort\",\n // misc\n pinLeft: \"Pin left\",\n pinRight: \"Pin right\",\n unpin: \"Unpin\",\n hideColumn: \"Hide column\",\n};\n\nexport function resolveDataGridStrings(\n override: Partial<DataGridStrings> | undefined,\n): DataGridStrings {\n if (!override) return DATA_GRID_DEFAULT_STRINGS;\n return { ...DATA_GRID_DEFAULT_STRINGS, ...override };\n}\n"],"mappings":";AAEA,MAAa,4BAA6C;CAExD,mBAAmB;CACnB,SAAS;CACT,QAAQ;CACR,SAAS;CAET,SAAS;CACT,SAAS;CACT,cAAc;CAEd,YAAY;CACZ,oBAAoB;CACpB,oBAAoB;CAEpB,eAAe,UAAU,GAAG,MAAM,MAAM,UAAU,IAAI,KAAK,IAAI;CAE/D,aAAa;CACb,SAAS,MAAM,UAAU,GAAG,KAAK,MAAM;CAEvC,QAAQ;CACR,SAAS;CACT,aAAa;CAEb,WAAW;CACX,cAAc;CAEd,SAAS;CACT,UAAU;CACV,QAAQ;CAER,SAAS;CACT,UAAU;CACV,OAAO;CACP,YAAY;CACb;AAED,SAAgB,uBACd,UACiB;AACjB,KAAI,CAAC,SAAU,QAAO;AACtB,QAAO;EAAE,GAAG;EAA2B,GAAG;EAAU"}
@@ -0,0 +1,278 @@
1
+ import { ReactNode } from "react";
2
+
3
+ //#region src/components/data-grid/types.d.ts
4
+ /** Every row must be uniquely identifiable. The grid resolves identity
5
+ * through the top-level `getRowId` prop. */
6
+ type RowId = string;
7
+ type DataGridColumnType = "string" | "number" | "date" | "dateTime" | "boolean" | "singleSelect" | "custom";
8
+ type DataGridColumnAlign = "left" | "center" | "right";
9
+ type DataGridColumnPin = "left" | "right" | false;
10
+ /** How `date` / `dateTime` cells render their value. `"relative"` shows
11
+ * "1 day ago"–style text with the full datetime in a tooltip; `"absolute"`
12
+ * shows the full datetime inline. */
13
+ type DataGridDateDisplay = "relative" | "absolute";
14
+ /** Per-column overrides for how a `date` / `dateTime` cell is formatted.
15
+ * If either function is omitted the grid falls back to its default
16
+ * (Intl.RelativeTimeFormat + `toLocaleString()`). */
17
+ type DataGridDateFormat = {
18
+ relative?: (date: Date) => string;
19
+ absolute?: (date: Date) => string;
20
+ };
21
+ /** Context passed to `renderCell`. */
22
+ type DataGridCellContext<TRow> = {
23
+ row: TRow;
24
+ rowId: RowId;
25
+ rowIndex: number;
26
+ value: unknown;
27
+ columnId: string;
28
+ isSelected: boolean;
29
+ /** Current date display mode — consumers writing custom `renderCell`
30
+ * for `date` / `dateTime` columns should branch on this to match the
31
+ * grid's built-in behaviour. */
32
+ dateDisplay: DataGridDateDisplay;
33
+ };
34
+ /** Context passed to `renderHeader`. */
35
+ type DataGridHeaderContext<TRow> = {
36
+ columnId: string;
37
+ columnDef: DataGridColumnDef<TRow>;
38
+ isSorted: false | "asc" | "desc";
39
+ sortIndex: number | null;
40
+ };
41
+ /** A single column's full configuration. Generic over the row type. */
42
+ type DataGridColumnDef<TRow> = {
43
+ /** Unique identifier for this column. */id: string; /** Display label. If a function is given it receives the header context. */
44
+ header: string | ((ctx: DataGridHeaderContext<TRow>) => ReactNode);
45
+ /** Accessor — either a key of TRow or a function. If omitted, `id` is
46
+ * used as the key. */
47
+ accessor?: keyof TRow | ((row: TRow) => unknown); /** Custom cell renderer. Falls back to plain text of the resolved value. */
48
+ renderCell?: (ctx: DataGridCellContext<TRow>) => ReactNode; /** Initial width in pixels. Defaults to 150. */
49
+ width?: number; /** Minimum width during resize. Defaults to 50. */
50
+ minWidth?: number; /** Maximum width during resize. Defaults to 800. */
51
+ maxWidth?: number;
52
+ /** Flex grow factor. When set, remaining space is distributed among flex
53
+ * columns proportionally. */
54
+ flex?: number;
55
+ sortable?: boolean;
56
+ resizable?: boolean;
57
+ hideable?: boolean; /** Pin position. Defaults to `false` (unpinned). */
58
+ pin?: DataGridColumnPin;
59
+ align?: DataGridColumnAlign; /** Column type affects default sorting. */
60
+ type?: DataGridColumnType; /** For `singleSelect` type — available value options. */
61
+ valueOptions?: readonly DataGridSelectOption[];
62
+ /** How cell content handles overflow.
63
+ * - `"truncate"` (default): single-line with text-overflow ellipsis.
64
+ * - `"wrap"`: content wraps naturally. When combined with
65
+ * `rowHeight="auto"` on the grid, the row grows to fit. With a
66
+ * fixed `rowHeight`, wrapped content is clipped at the row boundary. */
67
+ cellOverflow?: "truncate" | "wrap";
68
+ /** Custom sort comparator. Receives two resolved cell values.
69
+ * Return negative if a < b, positive if a > b, 0 if equal. */
70
+ sortComparator?: (a: unknown, b: unknown) => number;
71
+ /** Format a cell value to a plain string — used for export and
72
+ * clipboard copy. Defaults to `String(value)`. */
73
+ formatValue?: (value: unknown, row: TRow) => string;
74
+ /** Parse a raw cell value into a `Date`. Only consulted when `type` is
75
+ * `"date"` or `"dateTime"`. Defaults to `new Date(value)` with graceful
76
+ * handling of `null` / `undefined` / invalid dates. Override for
77
+ * non-standard formats (e.g. ClickHouse's space-separated UTC strings). */
78
+ parseValue?: (value: unknown) => Date | null; /** Per-column override for the relative / absolute date formatters. */
79
+ dateFormat?: DataGridDateFormat; /** Fired when a cell in this column is clicked. */
80
+ onCellClick?: (ctx: DataGridCellContext<TRow>, event: React.MouseEvent) => void; /** Fired when a cell in this column is double-clicked. */
81
+ onCellDoubleClick?: (ctx: DataGridCellContext<TRow>, event: React.MouseEvent) => void;
82
+ };
83
+ type DataGridSelectOption = {
84
+ value: string;
85
+ label: string;
86
+ };
87
+ type DataGridSortItem = {
88
+ columnId: string;
89
+ direction: "asc" | "desc";
90
+ };
91
+ type DataGridSortModel = readonly DataGridSortItem[];
92
+ type DataGridSelectionMode = "none" | "single" | "multiple";
93
+ type DataGridSelectionModel = {
94
+ selectedIds: ReadonlySet<RowId>; /** Tracks the last-clicked row for shift-range selection. */
95
+ anchorId: RowId | null;
96
+ };
97
+ type DataGridColumnVisibility = Record<string, boolean>;
98
+ type DataGridColumnPinning = {
99
+ left: readonly string[];
100
+ right: readonly string[];
101
+ };
102
+ /** UI display mode — "paginated" shows page controls, "infinite" shows scroll sentinel. */
103
+ type DataGridPaginationMode = "paginated" | "infinite";
104
+ /** Data-fetching strategy used by `useDataSource`. */
105
+ type DataGridDataPaginationMode = "client" | "server" | "infinite";
106
+ type DataGridPaginationModel = {
107
+ pageIndex: number;
108
+ pageSize: number;
109
+ };
110
+ type DataGridState = {
111
+ sorting: DataGridSortModel;
112
+ columnVisibility: DataGridColumnVisibility;
113
+ columnWidths: Record<string, number>;
114
+ columnPinning: DataGridColumnPinning;
115
+ columnOrder: readonly string[];
116
+ pagination: DataGridPaginationModel;
117
+ selection: DataGridSelectionModel;
118
+ /** How `date` / `dateTime` columns render. Defaults to `"relative"`
119
+ * via `createDefaultDataGridState`. Toggled from the Columns popover
120
+ * whenever the grid has at least one date column. */
121
+ dateDisplay: DataGridDateDisplay;
122
+ /** Current quick-search text. Written by the built-in search input in
123
+ * the toolbar. `useDataSource` in client mode auto-filters by this
124
+ * value (via `applyQuickSearch`); in async mode it's passed through
125
+ * to the generator as `params.quickSearch`, where the consumer owns
126
+ * the "how do I match?" decision (typically by modifying the backend
127
+ * query). Defaults to `""`. */
128
+ quickSearch: string;
129
+ };
130
+ /** Params sent to the async data source on each fetch. */
131
+ type DataGridFetchParams = {
132
+ sorting: DataGridSortModel;
133
+ pagination: DataGridPaginationModel;
134
+ /** Current quick-search text. Passed through from `state.quickSearch`
135
+ * so the async generator can fold it into its query (e.g. a SQL WHERE
136
+ * clause). Empty string when the search box is empty. A change in
137
+ * this value triggers a refetch, same mechanism as sorting. */
138
+ quickSearch: string; /** For cursor-based: the last row of the previous page. */
139
+ cursor: unknown;
140
+ };
141
+ /** Return type from a data source fetch. */
142
+ type DataGridFetchResult<TRow> = {
143
+ rows: TRow[]; /** Total row count if known. `-1` or `undefined` for unknown (infinite). */
144
+ totalRowCount?: number; /** Cursor for the next page (for cursor-based pagination). */
145
+ nextCursor?: unknown; /** If `false`, there are no more pages. */
146
+ hasMore?: boolean;
147
+ };
148
+ /** An async-generator data source yields pages of rows. The generator
149
+ * receives fetch params as its argument and yields pages. Yielding
150
+ * allows the grid to display partial results during loading. */
151
+ type DataGridDataSource<TRow> = (params: DataGridFetchParams) => AsyncGenerator<DataGridFetchResult<TRow>, void, undefined>;
152
+ type DataGridCallbacks<TRow> = {
153
+ onRowClick?: (row: TRow, rowId: RowId, event: React.MouseEvent) => void;
154
+ onRowDoubleClick?: (row: TRow, rowId: RowId, event: React.MouseEvent) => void;
155
+ onCellClick?: (row: TRow, columnId: string, value: unknown, event: React.MouseEvent) => void;
156
+ /**
157
+ * Fires when the selection set changes. **Page-scoped:** the header "select
158
+ * all" checkbox and `selectedRows` only cover the rows currently rendered
159
+ * (the visible page in paginated mode, or the loaded prefix in infinite
160
+ * mode). The grid does not load other pages to satisfy the selection — if
161
+ * you need cross-page selection, drive `selectedIds` from your own state
162
+ * and load all rows you care about up-front.
163
+ */
164
+ onSelectionChange?: (selectedIds: ReadonlySet<RowId>, selectedRows: TRow[]) => void;
165
+ onSortChange?: (model: DataGridSortModel) => void;
166
+ onColumnResize?: (columnId: string, width: number) => void;
167
+ onColumnVisibilityChange?: (model: DataGridColumnVisibility) => void;
168
+ };
169
+ type DataGridProps<TRow> = {
170
+ /** Column definitions. */columns: readonly DataGridColumnDef<TRow>[];
171
+ /** The rows to display. The consumer is responsible for sorting
172
+ * and paginating before passing them in. */
173
+ rows: readonly TRow[]; /** Extract a unique identifier from each row. */
174
+ getRowId: (row: TRow) => RowId; /** Total row count across all pages (used for pagination UI). */
175
+ totalRowCount?: number; /** True while the initial data load is in progress (shows skeleton). */
176
+ isLoading?: boolean; /** True during a background refetch (shows subtle indicator, keeps rows). */
177
+ isRefetching?: boolean; /** Whether more rows can be loaded (shows infinite scroll sentinel). */
178
+ hasMore?: boolean; /** True while loading the next page of infinite scroll. */
179
+ isLoadingMore?: boolean; /** Called when the infinite scroll sentinel becomes visible. */
180
+ onLoadMore?: () => void;
181
+ state: DataGridState;
182
+ onChange: React.Dispatch<React.SetStateAction<DataGridState>>;
183
+ /** UI mode for pagination. "paginated" shows page controls in the
184
+ * footer. "infinite" shows a scroll sentinel instead. Defaults to
185
+ * "paginated". */
186
+ paginationMode?: "paginated" | "infinite"; /** Selection behaviour. Defaults to "none". */
187
+ selectionMode?: DataGridSelectionMode; /** Whether columns can be resized by dragging. Defaults to true. */
188
+ resizable?: boolean;
189
+ /** Row height in pixels, or `"auto"` for dynamic measurement.
190
+ *
191
+ * - **number** (default `44`): every row is exactly this tall.
192
+ * Fast and predictable; content that overflows is clipped.
193
+ * - **`"auto"`**: each row is measured by the browser after render
194
+ * and the virtualizer adjusts positions accordingly. Columns
195
+ * with `cellOverflow: "wrap"` will push the row taller; columns
196
+ * with `cellOverflow: "truncate"` (or the default) stay
197
+ * single-line. Use `estimatedRowHeight` to reduce scroll-jank
198
+ * when rows haven't been measured yet. */
199
+ rowHeight?: number | "auto";
200
+ /** Estimated row height used by the virtualizer when
201
+ * `rowHeight="auto"`. Better estimates = less scroll-position
202
+ * jank before rows are measured. Defaults to 44. Ignored when
203
+ * `rowHeight` is a number. */
204
+ estimatedRowHeight?: number; /** Header row height in pixels. Defaults to 44. */
205
+ headerHeight?: number; /** Number of rows to render outside the visible area. Defaults to 5. */
206
+ overscan?: number; /** Grid max height. If omitted, grid takes available space (when `fillHeight`). */
207
+ maxHeight?: number | string;
208
+ /**
209
+ * When `true` (default), the grid uses `h-full` and the row area scrolls inside the grid.
210
+ * When `false`, the grid is only as tall as toolbar + header + rows (`h-auto`), so sibling
211
+ * content (e.g. metadata) sits directly under the table without a large empty gap.
212
+ */
213
+ fillHeight?: boolean; /** Top offset for the sticky toolbar + header (px or CSS string). */
214
+ stickyTop?: number | string;
215
+ } & DataGridCallbacks<TRow> & {
216
+ /** Custom toolbar renderer. When `false`, toolbar is hidden entirely. */toolbar?: false | ((ctx: DataGridToolbarContext<TRow>) => ReactNode);
217
+ /** Extra content rendered inside the default toolbar row, to the left of
218
+ * the built-in columns / export actions. Use this to slot in
219
+ * refresh buttons, custom toggles, row counts, etc. without giving up
220
+ * the built-in actions. Ignored if a custom `toolbar` render function
221
+ * is provided — that function owns the entire row. */
222
+ toolbarExtra?: ReactNode | ((ctx: DataGridToolbarContext<TRow>) => ReactNode); /** Custom empty state. Defaults to a centered "No data" message. */
223
+ emptyState?: ReactNode; /** Custom loading state. Defaults to skeleton rows. */
224
+ loadingState?: ReactNode; /** Custom footer. When `false`, footer is hidden. */
225
+ footer?: false | ((ctx: DataGridFooterContext<TRow>) => ReactNode); /** Extra content rendered to the right of the default footer info. */
226
+ footerExtra?: ReactNode | ((ctx: DataGridFooterContext<TRow>) => ReactNode); /** Filename stem for CSV export (without extension). */
227
+ exportFilename?: string; /** i18n overrides. */
228
+ strings?: Partial<DataGridStrings>;
229
+ className?: string;
230
+ };
231
+ type DataGridToolbarContext<TRow> = {
232
+ state: DataGridState;
233
+ onChange: React.Dispatch<React.SetStateAction<DataGridState>>;
234
+ columns: readonly DataGridColumnDef<TRow>[];
235
+ visibleColumns: readonly DataGridColumnDef<TRow>[];
236
+ totalRowCount: number | undefined;
237
+ selectedRowCount: number;
238
+ strings: DataGridStrings; /** Trigger a CSV export. */
239
+ exportCsv: () => void;
240
+ };
241
+ type DataGridFooterContext<TRow> = {
242
+ state: DataGridState;
243
+ totalRowCount: number | undefined;
244
+ visibleRowCount: number;
245
+ selectedRowCount: number;
246
+ paginationMode: DataGridPaginationMode;
247
+ strings: DataGridStrings;
248
+ };
249
+ type DataGridStrings = {
250
+ searchPlaceholder: string;
251
+ columns: string;
252
+ export: string;
253
+ density: string;
254
+ showAll: string;
255
+ hideAll: string;
256
+ resetColumns: string;
257
+ dateFormat: string;
258
+ dateFormatRelative: string;
259
+ dateFormatAbsolute: string;
260
+ rowsSelected: (count: number) => string;
261
+ rowsPerPage: string;
262
+ pageOf: (page: number, total: number) => string;
263
+ noData: string;
264
+ loading: string;
265
+ loadingMore: string;
266
+ exportCsv: string;
267
+ exportCopied: string;
268
+ sortAsc: string;
269
+ sortDesc: string;
270
+ unsort: string;
271
+ pinLeft: string;
272
+ pinRight: string;
273
+ unpin: string;
274
+ hideColumn: string;
275
+ };
276
+ //#endregion
277
+ export { DataGridCallbacks, DataGridCellContext, DataGridColumnAlign, DataGridColumnDef, DataGridColumnPin, DataGridColumnPinning, DataGridColumnType, DataGridColumnVisibility, DataGridDataPaginationMode, DataGridDataSource, DataGridDateDisplay, DataGridDateFormat, DataGridFetchParams, DataGridFetchResult, DataGridFooterContext, DataGridHeaderContext, DataGridPaginationMode, DataGridPaginationModel, DataGridProps, DataGridSelectOption, DataGridSelectionMode, DataGridSelectionModel, DataGridSortItem, DataGridSortModel, DataGridState, DataGridStrings, DataGridToolbarContext, RowId };
278
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/components/data-grid/types.ts"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,85 @@
1
+ import { DataGridColumnDef, DataGridDataPaginationMode, DataGridDataSource, DataGridPaginationModel, DataGridSortModel, RowId } from "./types";
2
+
3
+ //#region src/components/data-grid/use-data-source.d.ts
4
+ type UseDataSourceResult<TRow> = {
5
+ /** All rows currently loaded (for infinite mode, the accumulated set). */rows: readonly TRow[]; /** Total row count if known. */
6
+ totalRowCount: number | undefined; /** Whether the initial load is in progress (no data at all yet). */
7
+ isLoading: boolean; /** Whether a background refetch is happening (data already shown). */
8
+ isRefetching: boolean; /** Whether more rows are being fetched (infinite scroll). */
9
+ isLoadingMore: boolean; /** Request the next page (infinite scroll). */
10
+ loadMore: () => void; /** Whether there are more pages to load. */
11
+ hasMore: boolean; /** Reload from scratch. */
12
+ reload: () => void;
13
+ /**
14
+ * Error from the most recent async fetch, if any. Consumers should render
15
+ * an error UI and offer a `reload()` button when this is non-null. Client
16
+ * mode never sets this (no fetching). Cleared on next successful fetch.
17
+ */
18
+ error: Error | null;
19
+ };
20
+ /**
21
+ * Hook that processes raw data through the grid's sort/pagination state
22
+ * and returns the `rows` slice ready to pass to `DataGrid`. This is the
23
+ * only correct way to feed client-side data into a grid.
24
+ *
25
+ * Two modes, picked by which prop you pass:
26
+ * - `data: TRow[]` → client-side mode. In-memory sort + paginate.
27
+ * - `dataSource: (params) => AsyncGenerator` → server / infinite mode.
28
+ * The generator yields pages as you scroll or change pages.
29
+ *
30
+ * ```tsx
31
+ * // Client-side (most common):
32
+ * const gridData = useDataSource({
33
+ * data: users,
34
+ * columns,
35
+ * getRowId: (row) => row.id,
36
+ * sorting: gridState.sorting,
37
+ * quickSearch: gridState.quickSearch,
38
+ * pagination: gridState.pagination,
39
+ * paginationMode: "client",
40
+ * });
41
+ *
42
+ * <DataGrid
43
+ * columns={columns}
44
+ * rows={gridData.rows}
45
+ * totalRowCount={gridData.totalRowCount}
46
+ * isLoading={gridData.isLoading}
47
+ * state={gridState}
48
+ * onChange={setGridState}
49
+ * getRowId={(row) => row.id}
50
+ * />
51
+ * ```
52
+ *
53
+ * Rules:
54
+ * - Call this hook unconditionally at the top level, before any early return.
55
+ * - `rows` on `DataGrid` must ALWAYS be `gridData.rows`, never your raw array.
56
+ * - For server or infinite pagination, use `dataSource` — see the
57
+ * `DataGridDataSource` type for the generator signature.
58
+ *
59
+ * Quick search:
60
+ * - Client mode (`data` prop): the hook auto-filters rows via
61
+ * `applyQuickSearch` using a default case-insensitive substring match
62
+ * across every column. Override with `matchRow` for custom matching
63
+ * (fuzzy, weighted, field-specific, etc.).
64
+ * - Async mode (`dataSource` prop): the hook passes `quickSearch` into
65
+ * `params.quickSearch` and re-runs the generator whenever the search
66
+ * string changes. The consumer owns the matching logic (typically by
67
+ * folding it into a backend query). The grid performs NO client-side
68
+ * filtering in async mode.
69
+ */
70
+ declare function useDataSource<TRow>(opts: {
71
+ data?: readonly TRow[];
72
+ dataSource?: DataGridDataSource<TRow>;
73
+ columns: readonly DataGridColumnDef<TRow>[];
74
+ getRowId: (row: TRow) => RowId;
75
+ sorting: DataGridSortModel; /** Current quick-search text, typically `gridState.quickSearch`. */
76
+ quickSearch: string;
77
+ /** Override the default client-mode matcher. Ignored in async mode
78
+ * (there the generator is the matcher). */
79
+ matchRow?: (row: TRow, query: string, columns: readonly DataGridColumnDef<TRow>[]) => boolean;
80
+ pagination: DataGridPaginationModel;
81
+ paginationMode: DataGridDataPaginationMode;
82
+ }): UseDataSourceResult<TRow>;
83
+ //#endregion
84
+ export { UseDataSourceResult, useDataSource };
85
+ //# sourceMappingURL=use-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-data-source.d.ts","names":[],"sources":["../../../../src/components/data-grid/use-data-source.ts"],"mappings":";;;KAiBY,mBAAA;4EAEV,IAAA,WAAe,IAAA,IAFc;EAI7B,aAAA,sBAkBY;EAhBZ,SAAA,WAJA;EAMA,YAAA,WAJA;EAMA,aAAA,WAFA;EAIA,QAAA;EAEA,OAAA,WAEA;EAAA,MAAA;EAMO;;;AAkST;;EAlSE,KAAA,EAAO,KAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkSO,aAAA,MAAA,CAAoB,IAAA;EAClC,IAAA,YAAgB,IAAA;EAChB,UAAA,GAAa,kBAAA,CAAmB,IAAA;EAChC,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EACpC,QAAA,GAAW,GAAA,EAAK,IAAA,KAAS,KAAA;EACzB,OAAA,EAAS,iBAAA;EAET,WAAA;;;EAGA,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EAEtC,UAAA,EAAY,uBAAA;EACZ,cAAA,EAAgB,0BAAA;AAAA,IACd,mBAAA,CAAoB,IAAA"}