@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,37 @@
1
+ "use client";
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_chunk = require('../chunk-BE-pF4vm.js');
5
+ let _stackframe_stack_ui = require("@hexclave/ui");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let react = require("react");
8
+ react = require_chunk.__toESM(react);
9
+ let __chart_container_js = require("./chart-container.js");
10
+
11
+ //#region src/components/chart-legend.tsx
12
+ const DesignChartLegendContent = react.forwardRef(({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey }, ref) => {
13
+ const { config } = (0, __chart_container_js.useDesignChart)();
14
+ if (!payload?.length) return null;
15
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
16
+ ref,
17
+ className: (0, _stackframe_stack_ui.cn)("flex flex-wrap items-center justify-center gap-2", verticalAlign === "top" ? "pb-3" : "pt-3", className),
18
+ children: payload.map((item) => {
19
+ const itemConfig = (0, __chart_container_js.getPayloadConfigFromPayload)(config, item, `${nameKey || item.dataKey || "value"}`);
20
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
21
+ className: (0, _stackframe_stack_ui.cn)("flex items-center gap-1.5 rounded-full bg-foreground/[0.03] ring-1 ring-foreground/[0.06] px-3 py-1.5 text-xs", "transition-colors duration-150 hover:transition-none hover:bg-foreground/[0.05]"),
22
+ children: [itemConfig?.icon && !hideIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(itemConfig.icon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23
+ className: "h-2 w-2 shrink-0 rounded-full",
24
+ style: { backgroundColor: item.color }
25
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
26
+ className: "font-medium text-foreground",
27
+ children: itemConfig?.label || item.value
28
+ })]
29
+ }, item.value);
30
+ })
31
+ });
32
+ });
33
+ DesignChartLegendContent.displayName = "DesignChartLegendContent";
34
+
35
+ //#endregion
36
+ exports.DesignChartLegendContent = DesignChartLegendContent;
37
+ //# sourceMappingURL=chart-legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-legend.js","names":["React"],"sources":["../../src/components/chart-legend.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport { cn } from \"@stackframe/stack-ui\";\nimport { useDesignChart, getPayloadConfigFromPayload } from \"./chart-container\";\n\nexport const DesignChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> &\n Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n hideIcon?: boolean,\n nameKey?: string,\n }\n>(\n (\n { className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey },\n ref\n ) => {\n const { config } = useDesignChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center justify-center gap-2\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload.map((item) => {\n const key = `${nameKey || item.dataKey || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn(\n \"flex items-center gap-1.5 rounded-full bg-foreground/[0.03] ring-1 ring-foreground/[0.06] px-3 py-1.5 text-xs\",\n \"transition-colors duration-150 hover:transition-none hover:bg-foreground/[0.05]\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span className=\"font-medium text-foreground\">\n {itemConfig?.label || item.value}\n </span>\n </div>\n );\n })}\n </div>\n );\n }\n);\nDesignChartLegendContent.displayName = \"DesignChartLegendContent\";\n"],"mappings":";;;;;;;;;;;AAOA,MAAa,2BAA2BA,MAAM,YAS1C,EAAE,WAAW,WAAW,OAAO,SAAS,gBAAgB,UAAU,WAClE,QACG;CACH,MAAM,EAAE,qDAA2B;AAEnC,KAAI,CAAC,SAAS,OACZ,QAAO;AAGT,QACE,2CAAC;EACM;EACL,wCACE,oDACA,kBAAkB,QAAQ,SAAS,QACnC,UACD;YAEA,QAAQ,KAAK,SAAS;GAErB,MAAM,mEAAyC,QAAQ,MAD3C,GAAG,WAAW,KAAK,WAAW,UACuB;AAEjE,UACE,4CAAC;IAEC,wCACE,iHACA,kFACD;eAEA,YAAY,QAAQ,CAAC,WACpB,2CAAC,WAAW,SAAO,GAEnB,2CAAC;KACC,WAAU;KACV,OAAO,EAAE,iBAAiB,KAAK,OAAO;MACtC,EAEJ,2CAAC;KAAK,WAAU;eACb,YAAY,SAAS,KAAK;MACtB;MAhBF,KAAK,MAiBN;IAER;GACE;EAGX;AACD,yBAAyB,cAAc"}
@@ -0,0 +1,26 @@
1
+ //#region src/components/chart-theme.d.ts
2
+ type DesignChartColorEntry = {
3
+ light: string;
4
+ dark: string;
5
+ };
6
+ /**
7
+ * Design-system-consistent chart colors that work in light and dark mode.
8
+ * Maps to the gradient system used across the dashboard design components.
9
+ */
10
+ declare const DESIGN_CHART_COLORS: readonly DesignChartColorEntry[];
11
+ type DesignChartColorName = "blue" | "cyan" | "purple" | "green" | "orange" | "red";
12
+ /**
13
+ * Get a chart color by index (wraps around) or by name.
14
+ */
15
+ declare function getDesignChartColor(indexOrName: number | DesignChartColorName, mode?: "light" | "dark"): string;
16
+ /**
17
+ * Recharts-compatible grid/axis styling constants that match the design system.
18
+ */
19
+ declare const DESIGN_CHART_GRID_COLOR = "hsl(0 0% 50% / 0.12)";
20
+ declare const DESIGN_CHART_AXIS_TICK_STYLE: {
21
+ readonly fill: "hsl(0 0% 50% / 0.5)";
22
+ readonly fontSize: 11;
23
+ };
24
+ //#endregion
25
+ export { DESIGN_CHART_AXIS_TICK_STYLE, DESIGN_CHART_COLORS, DESIGN_CHART_GRID_COLOR, DesignChartColorEntry, DesignChartColorName, getDesignChartColor };
26
+ //# sourceMappingURL=chart-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-theme.d.ts","names":[],"sources":["../../src/components/chart-theme.tsx"],"mappings":";KAEY,qBAAA;EACV,KAAA;EACA,IAAA;AAAA;;;AAOF;;cAAa,mBAAA,WAA8B,qBAAA;AAAA,KAS/B,oBAAA;;AAAZ;;iBAcgB,mBAAA,CACd,WAAA,WAAsB,oBAAA,EACtB,IAAA;;;AAFF;cAaa,uBAAA;AAAA,cACA,4BAAA;EAAA,SAGH,IAAA;EAAA,SAAA,QAAA;AAAA"}
@@ -0,0 +1,64 @@
1
+ "use client";
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ //#region src/components/chart-theme.tsx
6
+ /**
7
+ * Design-system-consistent chart colors that work in light and dark mode.
8
+ * Maps to the gradient system used across the dashboard design components.
9
+ */
10
+ const DESIGN_CHART_COLORS = [
11
+ {
12
+ light: "hsl(221, 83%, 53%)",
13
+ dark: "hsl(217, 91%, 60%)"
14
+ },
15
+ {
16
+ light: "hsl(192, 91%, 36%)",
17
+ dark: "hsl(188, 94%, 43%)"
18
+ },
19
+ {
20
+ light: "hsl(271, 91%, 65%)",
21
+ dark: "hsl(270, 95%, 75%)"
22
+ },
23
+ {
24
+ light: "hsl(160, 84%, 39%)",
25
+ dark: "hsl(160, 84%, 45%)"
26
+ },
27
+ {
28
+ light: "hsl(38, 92%, 50%)",
29
+ dark: "hsl(38, 92%, 50%)"
30
+ },
31
+ {
32
+ light: "hsl(0, 84%, 60%)",
33
+ dark: "hsl(0, 84%, 65%)"
34
+ }
35
+ ];
36
+ const colorNameIndexMap = new Map([
37
+ ["blue", 0],
38
+ ["cyan", 1],
39
+ ["purple", 2],
40
+ ["green", 3],
41
+ ["orange", 4],
42
+ ["red", 5]
43
+ ]);
44
+ /**
45
+ * Get a chart color by index (wraps around) or by name.
46
+ */
47
+ function getDesignChartColor(indexOrName, mode = "dark") {
48
+ return DESIGN_CHART_COLORS[typeof indexOrName === "string" ? colorNameIndexMap.get(indexOrName) ?? 0 : indexOrName % DESIGN_CHART_COLORS.length][mode];
49
+ }
50
+ /**
51
+ * Recharts-compatible grid/axis styling constants that match the design system.
52
+ */
53
+ const DESIGN_CHART_GRID_COLOR = "hsl(0 0% 50% / 0.12)";
54
+ const DESIGN_CHART_AXIS_TICK_STYLE = {
55
+ fill: "hsl(0 0% 50% / 0.5)",
56
+ fontSize: 11
57
+ };
58
+
59
+ //#endregion
60
+ exports.DESIGN_CHART_AXIS_TICK_STYLE = DESIGN_CHART_AXIS_TICK_STYLE;
61
+ exports.DESIGN_CHART_COLORS = DESIGN_CHART_COLORS;
62
+ exports.DESIGN_CHART_GRID_COLOR = DESIGN_CHART_GRID_COLOR;
63
+ exports.getDesignChartColor = getDesignChartColor;
64
+ //# sourceMappingURL=chart-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-theme.js","names":[],"sources":["../../src/components/chart-theme.tsx"],"sourcesContent":["\"use client\";\n\nexport type DesignChartColorEntry = {\n light: string,\n dark: string,\n};\n\n/**\n * Design-system-consistent chart colors that work in light and dark mode.\n * Maps to the gradient system used across the dashboard design components.\n */\nexport const DESIGN_CHART_COLORS: readonly DesignChartColorEntry[] = [\n { light: \"hsl(221, 83%, 53%)\", dark: \"hsl(217, 91%, 60%)\" }, // blue\n { light: \"hsl(192, 91%, 36%)\", dark: \"hsl(188, 94%, 43%)\" }, // cyan\n { light: \"hsl(271, 91%, 65%)\", dark: \"hsl(270, 95%, 75%)\" }, // purple\n { light: \"hsl(160, 84%, 39%)\", dark: \"hsl(160, 84%, 45%)\" }, // emerald/green\n { light: \"hsl(38, 92%, 50%)\", dark: \"hsl(38, 92%, 50%)\" }, // amber/orange\n { light: \"hsl(0, 84%, 60%)\", dark: \"hsl(0, 84%, 65%)\" }, // red\n] as const;\n\nexport type DesignChartColorName = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"red\";\n\nconst colorNameIndexMap = new Map<DesignChartColorName, number>([\n [\"blue\", 0],\n [\"cyan\", 1],\n [\"purple\", 2],\n [\"green\", 3],\n [\"orange\", 4],\n [\"red\", 5],\n]);\n\n/**\n * Get a chart color by index (wraps around) or by name.\n */\nexport function getDesignChartColor(\n indexOrName: number | DesignChartColorName,\n mode: \"light\" | \"dark\" = \"dark\",\n): string {\n const index = typeof indexOrName === \"string\"\n ? colorNameIndexMap.get(indexOrName) ?? 0\n : indexOrName % DESIGN_CHART_COLORS.length;\n return DESIGN_CHART_COLORS[index][mode];\n}\n\n/**\n * Recharts-compatible grid/axis styling constants that match the design system.\n */\nexport const DESIGN_CHART_GRID_COLOR = \"hsl(0 0% 50% / 0.12)\";\nexport const DESIGN_CHART_AXIS_TICK_STYLE = {\n fill: \"hsl(0 0% 50% / 0.5)\",\n fontSize: 11,\n} as const;\n"],"mappings":";;;;;;;;;AAWA,MAAa,sBAAwD;CACnE;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAqB;CAC1D;EAAE,OAAO;EAAsB,MAAM;EAAoB;CAC1D;AAID,MAAM,oBAAoB,IAAI,IAAkC;CAC9D,CAAC,QAAQ,EAAE;CACX,CAAC,QAAQ,EAAE;CACX,CAAC,UAAU,EAAE;CACb,CAAC,SAAS,EAAE;CACZ,CAAC,UAAU,EAAE;CACb,CAAC,OAAO,EAAE;CACX,CAAC;;;;AAKF,SAAgB,oBACd,aACA,OAAyB,QACjB;AAIR,QAAO,oBAHO,OAAO,gBAAgB,WACjC,kBAAkB,IAAI,YAAY,IAAI,IACtC,cAAc,oBAAoB,QACJ;;;;;AAMpC,MAAa,0BAA0B;AACvC,MAAa,+BAA+B;CAC1C,MAAM;CACN,UAAU;CACX"}
@@ -0,0 +1,41 @@
1
+ import * as React$1 from "react";
2
+ import * as RechartsPrimitive from "recharts";
3
+ import * as recharts_types_component_DefaultTooltipContent0 from "recharts/types/component/DefaultTooltipContent";
4
+ import * as recharts_types_util_types0 from "recharts/types/util/types";
5
+ import * as recharts_types_component_Tooltip0 from "recharts/types/component/Tooltip";
6
+ import * as recharts_types_util_payload_getUniqPayload0 from "recharts/types/util/payload/getUniqPayload";
7
+
8
+ //#region src/components/chart-tooltip.d.ts
9
+ declare const DesignChartTooltip: typeof RechartsPrimitive.Tooltip;
10
+ declare const DesignChartTooltipContent: React$1.ForwardRefExoticComponent<Omit<RechartsPrimitive.DefaultTooltipContentProps<recharts_types_component_DefaultTooltipContent0.ValueType, recharts_types_component_DefaultTooltipContent0.NameType> & {
11
+ accessibilityLayer?: boolean;
12
+ active?: boolean | undefined;
13
+ includeHidden?: boolean | undefined;
14
+ allowEscapeViewBox?: recharts_types_util_types0.AllowInDimension;
15
+ animationDuration?: recharts_types_util_types0.AnimationDuration;
16
+ animationEasing?: recharts_types_util_types0.AnimationTiming;
17
+ content?: recharts_types_component_Tooltip0.ContentType<recharts_types_component_DefaultTooltipContent0.ValueType, recharts_types_component_DefaultTooltipContent0.NameType> | undefined;
18
+ coordinate?: Partial<recharts_types_util_types0.Coordinate>;
19
+ cursor?: boolean | React$1.ReactElement | React$1.SVGProps<SVGElement>;
20
+ filterNull?: boolean;
21
+ defaultIndex?: number;
22
+ isAnimationActive?: boolean;
23
+ offset?: number;
24
+ payloadUniqBy?: recharts_types_util_payload_getUniqPayload0.UniqueOption<recharts_types_component_DefaultTooltipContent0.Payload<recharts_types_component_DefaultTooltipContent0.ValueType, recharts_types_component_DefaultTooltipContent0.NameType>> | undefined;
25
+ position?: Partial<recharts_types_util_types0.Coordinate>;
26
+ reverseDirection?: recharts_types_util_types0.AllowInDimension;
27
+ shared?: boolean;
28
+ trigger?: "hover" | "click";
29
+ useTranslate3d?: boolean;
30
+ viewBox?: recharts_types_util_types0.CartesianViewBox;
31
+ wrapperStyle?: React$1.CSSProperties;
32
+ } & React$1.ClassAttributes<HTMLDivElement> & React$1.HTMLAttributes<HTMLDivElement> & {
33
+ hideLabel?: boolean;
34
+ hideIndicator?: boolean;
35
+ indicator?: "line" | "dot" | "dashed";
36
+ nameKey?: string;
37
+ labelKey?: string;
38
+ }, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
39
+ //#endregion
40
+ export { DesignChartTooltip, DesignChartTooltipContent };
41
+ //# sourceMappingURL=chart-tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-tooltip.d.ts","names":[],"sources":["../../src/components/chart-tooltip.tsx"],"mappings":";;;;;;;;cAOa,kBAAA,SAAkB,iBAAA,CAAA,OAAA;AAAA,cAElB,yBAAA,EAAyB,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,iBAAA,CAAA,0BAAA,CA0JrC,+CAAA,CA1JqC,SAAA,EAAA,+CAAA,CAAA,QAAA;;;;uBAAA,0BAAA,CAAA,gBAAA"}
@@ -0,0 +1,89 @@
1
+ "use client";
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_chunk = require('../chunk-BE-pF4vm.js');
5
+ let _stackframe_stack_ui = require("@hexclave/ui");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let react = require("react");
8
+ react = require_chunk.__toESM(react);
9
+ let recharts = require("recharts");
10
+ recharts = require_chunk.__toESM(recharts);
11
+ let __chart_container_js = require("./chart-container.js");
12
+
13
+ //#region src/components/chart-tooltip.tsx
14
+ const DesignChartTooltip = recharts.Tooltip;
15
+ const DesignChartTooltipContent = react.forwardRef(({ active, payload, className, indicator = "dot", hideLabel = false, hideIndicator = false, label, labelFormatter, labelClassName, formatter, color, nameKey, labelKey }, ref) => {
16
+ const { config } = (0, __chart_container_js.useDesignChart)();
17
+ const tooltipLabel = react.useMemo(() => {
18
+ if (hideLabel || !payload?.length) return null;
19
+ const [item] = payload;
20
+ const itemConfig = (0, __chart_container_js.getPayloadConfigFromPayload)(config, item, `${labelKey || item.dataKey || item.name || "value"}`);
21
+ const configEntry = typeof label === "string" ? config[label] : void 0;
22
+ const value = !labelKey && typeof label === "string" ? configEntry?.label ?? label : itemConfig?.label;
23
+ if (labelFormatter) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
24
+ className: (0, _stackframe_stack_ui.cn)("font-medium text-muted-foreground tracking-wide", labelClassName),
25
+ children: labelFormatter(value, payload)
26
+ });
27
+ if (!value) return null;
28
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
29
+ className: (0, _stackframe_stack_ui.cn)("font-medium text-muted-foreground tracking-wide", labelClassName),
30
+ children: value
31
+ });
32
+ }, [
33
+ label,
34
+ labelFormatter,
35
+ payload,
36
+ hideLabel,
37
+ labelClassName,
38
+ config,
39
+ labelKey
40
+ ]);
41
+ if (!active || !payload?.length) return null;
42
+ const nestLabel = payload.length === 1 && indicator !== "dot";
43
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
44
+ ref,
45
+ className: (0, _stackframe_stack_ui.cn)("grid min-w-[8rem] items-start gap-1.5 rounded-xl bg-background/95 px-3.5 py-2.5 text-xs shadow-lg backdrop-blur-xl ring-1 ring-foreground/[0.08]", className),
46
+ style: { zIndex: 9999 },
47
+ children: [!nestLabel ? tooltipLabel : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
48
+ className: "grid gap-1.5",
49
+ children: payload.map((item, index) => {
50
+ const itemConfig = (0, __chart_container_js.getPayloadConfigFromPayload)(config, item, `${nameKey || item.name || item.dataKey || "value"}`);
51
+ const indicatorColor = color || item.payload.fill || item.color;
52
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
53
+ className: (0, _stackframe_stack_ui.cn)("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground", indicator === "dot" && "items-center"),
54
+ children: formatter && item.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [itemConfig?.icon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
55
+ className: (0, _stackframe_stack_ui.cn)("shrink-0 rounded-full", {
56
+ "h-2 w-2 ring-2 ring-white/20": indicator === "dot",
57
+ "w-1 rounded-[2px]": indicator === "line",
58
+ "w-0 border-[1.5px] border-dashed bg-transparent rounded-[2px]": indicator === "dashed",
59
+ "my-0.5": nestLabel && indicator === "dashed"
60
+ }),
61
+ style: {
62
+ "--color-bg": indicatorColor,
63
+ "--color-border": indicatorColor,
64
+ backgroundColor: indicator === "dot" ? indicatorColor : void 0
65
+ }
66
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
67
+ className: (0, _stackframe_stack_ui.cn)("flex flex-1 justify-between leading-none", nestLabel ? "items-end" : "items-center"),
68
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
69
+ className: "grid gap-1.5",
70
+ children: [nestLabel ? tooltipLabel : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
71
+ className: "text-[11px] text-muted-foreground",
72
+ children: itemConfig?.label || item.name
73
+ })]
74
+ }), item.value != null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
75
+ className: "ml-auto font-mono text-xs font-semibold tabular-nums text-foreground",
76
+ children: typeof item.value === "number" ? item.value.toLocaleString() : item.value
77
+ })]
78
+ })] })
79
+ }, item.dataKey);
80
+ })
81
+ })]
82
+ });
83
+ });
84
+ DesignChartTooltipContent.displayName = "DesignChartTooltipContent";
85
+
86
+ //#endregion
87
+ exports.DesignChartTooltip = DesignChartTooltip;
88
+ exports.DesignChartTooltipContent = DesignChartTooltipContent;
89
+ //# sourceMappingURL=chart-tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-tooltip.js","names":["RechartsPrimitive","React"],"sources":["../../src/components/chart-tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport { cn } from \"@stackframe/stack-ui\";\nimport { useDesignChart, getPayloadConfigFromPayload } from \"./chart-container\";\n\nexport const DesignChartTooltip = RechartsPrimitive.Tooltip;\n\nexport const DesignChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean,\n hideIndicator?: boolean,\n indicator?: \"line\" | \"dot\" | \"dashed\",\n nameKey?: string,\n labelKey?: string,\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n },\n ref\n ) => {\n const { config } = useDesignChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item.dataKey || item.name || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const configEntry = typeof label === \"string\" ? config[label as keyof typeof config] : undefined;\n const value =\n !labelKey && typeof label === \"string\"\n ? configEntry?.label ?? label\n : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium text-muted-foreground tracking-wide\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn(\"font-medium text-muted-foreground tracking-wide\", labelClassName)}>{value}</div>;\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"grid min-w-[8rem] items-start gap-1.5 rounded-xl bg-background/95 px-3.5 py-2.5 text-xs shadow-lg backdrop-blur-xl ring-1 ring-foreground/[0.08]\",\n className\n )}\n style={{ zIndex: 9999 }}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-full\",\n {\n \"h-2 w-2 ring-2 ring-white/20\": indicator === \"dot\",\n \"w-1 rounded-[2px]\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent rounded-[2px]\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n backgroundColor: indicator === \"dot\" ? indicatorColor : undefined,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-[11px] text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"ml-auto font-mono text-xs font-semibold tabular-nums text-foreground\">\n {typeof item.value === \"number\" ? item.value.toLocaleString() : item.value}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n);\nDesignChartTooltipContent.displayName = \"DesignChartTooltipContent\";\n"],"mappings":";;;;;;;;;;;;;AAOA,MAAa,qBAAqBA,SAAkB;AAEpD,MAAa,4BAA4BC,MAAM,YAY3C,EACE,QACA,SACA,WACA,YAAY,OACZ,YAAY,OACZ,gBAAgB,OAChB,OACA,gBACA,gBACA,WACA,OACA,SACA,YAEF,QACG;CACH,MAAM,EAAE,qDAA2B;CAEnC,MAAM,eAAeA,MAAM,cAAc;AACvC,MAAI,aAAa,CAAC,SAAS,OACzB,QAAO;EAGT,MAAM,CAAC,QAAQ;EAEf,MAAM,mEAAyC,QAAQ,MAD3C,GAAG,YAAY,KAAK,WAAW,KAAK,QAAQ,UACS;EACjE,MAAM,cAAc,OAAO,UAAU,WAAW,OAAO,SAAgC;EACvF,MAAM,QACJ,CAAC,YAAY,OAAO,UAAU,WAC1B,aAAa,SAAS,QACtB,YAAY;AAElB,MAAI,eACF,QACE,2CAAC;GAAI,wCAAc,mDAAmD,eAAe;aAClF,eAAe,OAAO,QAAQ;IAC3B;AAIV,MAAI,CAAC,MACH,QAAO;AAGT,SAAO,2CAAC;GAAI,wCAAc,mDAAmD,eAAe;aAAG;IAAY;IAC1G;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,KAAI,CAAC,UAAU,CAAC,SAAS,OACvB,QAAO;CAGT,MAAM,YAAY,QAAQ,WAAW,KAAK,cAAc;AAExD,QACE,4CAAC;EACM;EACL,wCACE,oJACA,UACD;EACD,OAAO,EAAE,QAAQ,MAAM;aAEtB,CAAC,YAAY,eAAe,MAC7B,2CAAC;GAAI,WAAU;aACZ,QAAQ,KAAK,MAAM,UAAU;IAE5B,MAAM,mEAAyC,QAAQ,MAD3C,GAAG,WAAW,KAAK,QAAQ,KAAK,WAAW,UACU;IACjE,MAAM,iBAAiB,SAAS,KAAK,QAAQ,QAAQ,KAAK;AAE1D,WACE,2CAAC;KAEC,wCACE,uGACA,cAAc,SAAS,eACxB;eAEA,aAAa,KAAK,UAAU,UAAa,KAAK,OAC7C,UAAU,KAAK,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,QAAQ,GAE3D,qFACG,YAAY,OACX,2CAAC,WAAW,SAAO,GAEnB,CAAC,iBACC,2CAAC;MACC,wCACE,yBACA;OACE,gCAAgC,cAAc;OAC9C,qBAAqB,cAAc;OACnC,iEACE,cAAc;OAChB,UAAU,aAAa,cAAc;OACtC,CACF;MACD,OACE;OACE,cAAc;OACd,kBAAkB;OAClB,iBAAiB,cAAc,QAAQ,iBAAiB;OACzD;OAEH,EAGN,4CAAC;MACC,wCACE,4CACA,YAAY,cAAc,eAC3B;iBAED,4CAAC;OAAI,WAAU;kBACZ,YAAY,eAAe,MAC5B,2CAAC;QAAK,WAAU;kBACb,YAAY,SAAS,KAAK;SACtB;QACH,EACL,KAAK,SAAS,QACb,2CAAC;OAAK,WAAU;iBACb,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,gBAAgB,GAAG,KAAK;QAChE;OAEL,IACL;OArDA,KAAK,QAuDN;KAER;IACE;GACF;EAGX;AACD,0BAA0B,cAAc"}
@@ -0,0 +1,27 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+
3
+ //#region src/components/cursor-blast-effect.d.ts
4
+ type CursorBlastEffectProps = {
5
+ /** Lifetime of each blast animation in ms. Default: 720 */blastLifetimeMs?: number; /** Maximum number of concurrent active blasts. Default: 18 */
6
+ maxActiveBlasts?: number; /** Minimum rapid clicks in the time window to trigger a blast. Default: 3 */
7
+ rageClickThreshold?: number; /** Time window (ms) for counting rage clicks. Default: 600 */
8
+ rageClickWindowMs?: number; /** Max distance (px) between clicks to count as same-spot rage clicking. Default: 60 */
9
+ rageClickRadiusPx?: number;
10
+ /**
11
+ * When provided, the blast effect is scoped to this container element.
12
+ * Clicks are only detected within the container and blasts are positioned
13
+ * relative to the container rather than the viewport.
14
+ */
15
+ containerRef?: React.RefObject<HTMLElement | null>;
16
+ };
17
+ declare function CursorBlastEffect({
18
+ blastLifetimeMs,
19
+ maxActiveBlasts,
20
+ rageClickThreshold,
21
+ rageClickWindowMs,
22
+ rageClickRadiusPx,
23
+ containerRef
24
+ }?: CursorBlastEffectProps): react_jsx_runtime0.JSX.Element | null;
25
+ //#endregion
26
+ export { CursorBlastEffect, CursorBlastEffectProps };
27
+ //# sourceMappingURL=cursor-blast-effect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-blast-effect.d.ts","names":[],"sources":["../../src/components/cursor-blast-effect.tsx"],"mappings":";;;KA6BY,sBAAA;6DAEV,eAAA,WAFU;EAIV,eAAA;EAEA,kBAAA,WAJA;EAMA,iBAAA,WAFA;EAIA,iBAAA;EAAA;;;;;EAMA,YAAA,GAAe,KAAA,CAAM,SAAA,CAAU,WAAA;AAAA;AAAA,iBAGjB,iBAAA,CAAA;EACd,eAAA;EACA,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,iBAAA;EACA;AAAA,IACC,sBAAA,GAA2B,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,244 @@
1
+ "use client";
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_chunk = require('../chunk-BE-pF4vm.js');
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ let react = require("react");
7
+ let react_dom = require("react-dom");
8
+
9
+ //#region src/components/cursor-blast-effect.tsx
10
+ const DEFAULT_BLAST_LIFETIME_MS = 720;
11
+ const DEFAULT_MAX_ACTIVE_BLASTS = 18;
12
+ /** Minimum rapid clicks in the time window to count as a rage click */
13
+ const DEFAULT_RAGE_CLICK_THRESHOLD = 3;
14
+ /** Time window (ms) in which clicks must occur to be considered rage clicking */
15
+ const DEFAULT_RAGE_CLICK_WINDOW_MS = 600;
16
+ /** Max distance (px) between clicks to still count as same-spot rage clicking */
17
+ const DEFAULT_RAGE_CLICK_RADIUS_PX = 60;
18
+ function CursorBlastEffect({ blastLifetimeMs = DEFAULT_BLAST_LIFETIME_MS, maxActiveBlasts = DEFAULT_MAX_ACTIVE_BLASTS, rageClickThreshold = DEFAULT_RAGE_CLICK_THRESHOLD, rageClickWindowMs = DEFAULT_RAGE_CLICK_WINDOW_MS, rageClickRadiusPx = DEFAULT_RAGE_CLICK_RADIUS_PX, containerRef } = {}) {
19
+ const [blasts, setBlasts] = (0, react.useState)([]);
20
+ const [mounted, setMounted] = (0, react.useState)(false);
21
+ const idCounterRef = (0, react.useRef)(0);
22
+ const timeoutIdsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
23
+ const recentClicksRef = (0, react.useRef)([]);
24
+ const configRef = (0, react.useRef)({
25
+ blastLifetimeMs,
26
+ maxActiveBlasts,
27
+ rageClickThreshold,
28
+ rageClickWindowMs,
29
+ rageClickRadiusPx
30
+ });
31
+ configRef.current = {
32
+ blastLifetimeMs,
33
+ maxActiveBlasts,
34
+ rageClickThreshold,
35
+ rageClickWindowMs,
36
+ rageClickRadiusPx
37
+ };
38
+ (0, react.useEffect)(() => {
39
+ setMounted(true);
40
+ }, []);
41
+ (0, react.useEffect)(() => {
42
+ const removeBlast = (id) => {
43
+ setBlasts((prev) => prev.filter((blast) => blast.id !== id));
44
+ const timeoutId = timeoutIdsRef.current.get(id);
45
+ if (timeoutId !== void 0) {
46
+ window.clearTimeout(timeoutId);
47
+ timeoutIdsRef.current.delete(id);
48
+ }
49
+ };
50
+ const spawnBlast = (x, y) => {
51
+ const cfg = configRef.current;
52
+ const nextId = idCounterRef.current;
53
+ idCounterRef.current += 1;
54
+ const nextBlast = {
55
+ id: nextId,
56
+ x,
57
+ y,
58
+ size: 44 + Math.random() * 20,
59
+ hue: 185 + Math.random() * 35
60
+ };
61
+ setBlasts((prev) => {
62
+ const next = [...prev, nextBlast];
63
+ if (next.length <= cfg.maxActiveBlasts) return next;
64
+ return next.slice(next.length - cfg.maxActiveBlasts);
65
+ });
66
+ const timeoutId = window.setTimeout(() => removeBlast(nextId), cfg.blastLifetimeMs);
67
+ timeoutIdsRef.current.set(nextId, timeoutId);
68
+ };
69
+ const onClick = (event) => {
70
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
71
+ const cfg = configRef.current;
72
+ const now = performance.now();
73
+ let x;
74
+ let y;
75
+ if (containerRef?.current) {
76
+ const rect = containerRef.current.getBoundingClientRect();
77
+ x = event.clientX - rect.left;
78
+ y = event.clientY - rect.top;
79
+ } else {
80
+ x = event.clientX;
81
+ y = event.clientY;
82
+ }
83
+ recentClicksRef.current = recentClicksRef.current.filter((click) => now - click.time < cfg.rageClickWindowMs);
84
+ recentClicksRef.current.push({
85
+ time: now,
86
+ x,
87
+ y
88
+ });
89
+ if (recentClicksRef.current.filter((click) => {
90
+ const dx = click.x - x;
91
+ const dy = click.y - y;
92
+ return Math.sqrt(dx * dx + dy * dy) <= cfg.rageClickRadiusPx;
93
+ }).length >= cfg.rageClickThreshold) spawnBlast(x, y);
94
+ };
95
+ const target = containerRef?.current ?? window;
96
+ const timeoutIds = timeoutIdsRef.current;
97
+ target.addEventListener("click", onClick);
98
+ return () => {
99
+ target.removeEventListener("click", onClick);
100
+ for (const timeoutId of timeoutIds.values()) window.clearTimeout(timeoutId);
101
+ timeoutIds.clear();
102
+ };
103
+ }, [containerRef]);
104
+ if (!mounted) return null;
105
+ const blastElements = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [blasts.map((blast) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
106
+ style: {
107
+ position: "absolute",
108
+ left: blast.x,
109
+ top: blast.y,
110
+ width: blast.size,
111
+ height: blast.size,
112
+ transform: "translate(-50%, -50%)",
113
+ willChange: "transform, opacity",
114
+ filter: `hue-rotate(${blast.hue}deg)`
115
+ },
116
+ children: [
117
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "cursor-blast-ring" }),
118
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "cursor-blast-core" }),
119
+ Array.from({ length: 10 }).map((_, index) => {
120
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
121
+ className: "cursor-blast-shard-wrap",
122
+ style: {
123
+ transform: `translate(-50%, -50%) rotate(${360 / 10 * index}deg)`,
124
+ animationDelay: `${index * 16}ms`
125
+ },
126
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "cursor-blast-shard" })
127
+ }, `${blast.id}-${index}`);
128
+ })
129
+ ]
130
+ }, blast.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", { dangerouslySetInnerHTML: { __html: `
131
+ .cursor-blast-ring {
132
+ position: absolute;
133
+ inset: 0;
134
+ border-radius: 999px;
135
+ border: 2px solid hsl(197 98% 67% / 0.9);
136
+ box-shadow:
137
+ 0 0 22px hsl(191 100% 72% / 0.6),
138
+ inset 0 0 12px hsl(204 100% 77% / 0.65);
139
+ animation: blast-ring 560ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
140
+ }
141
+
142
+ .cursor-blast-core {
143
+ position: absolute;
144
+ left: 50%;
145
+ top: 50%;
146
+ width: 10px;
147
+ height: 10px;
148
+ border-radius: 999px;
149
+ transform: translate(-50%, -50%);
150
+ background: hsl(196 100% 85%);
151
+ box-shadow:
152
+ 0 0 26px hsl(193 100% 72% / 0.9),
153
+ 0 0 10px hsl(201 100% 85% / 0.9);
154
+ animation: blast-core 420ms ease-out forwards;
155
+ }
156
+
157
+ .cursor-blast-shard-wrap {
158
+ position: absolute;
159
+ left: 50%;
160
+ top: 50%;
161
+ width: 0;
162
+ height: 0;
163
+ }
164
+
165
+ .cursor-blast-shard {
166
+ position: absolute;
167
+ left: 0;
168
+ top: -1.5px;
169
+ width: 12px;
170
+ height: 3px;
171
+ border-radius: 999px;
172
+ background: linear-gradient(90deg, hsl(190 100% 84%), hsl(197 98% 67%));
173
+ box-shadow: 0 0 12px hsl(195 100% 70% / 0.8);
174
+ animation: blast-shard 680ms cubic-bezier(0.22, 1, 0.36, 1) forwards;
175
+ }
176
+
177
+ @keyframes blast-ring {
178
+ 0% {
179
+ transform: scale(0.2);
180
+ opacity: 0.95;
181
+ }
182
+ 100% {
183
+ transform: scale(1.6);
184
+ opacity: 0;
185
+ }
186
+ }
187
+
188
+ @keyframes blast-core {
189
+ 0% {
190
+ transform: translate(-50%, -50%) scale(0.5);
191
+ opacity: 1;
192
+ }
193
+ 100% {
194
+ transform: translate(-50%, -50%) scale(2.2);
195
+ opacity: 0;
196
+ }
197
+ }
198
+
199
+ @keyframes blast-shard {
200
+ 0% {
201
+ transform: translateX(0) scaleX(0.7);
202
+ opacity: 1;
203
+ }
204
+ 100% {
205
+ transform: translateX(46px) scaleX(1.1);
206
+ opacity: 0;
207
+ }
208
+ }
209
+
210
+ @media (prefers-reduced-motion: reduce) {
211
+ .cursor-blast-ring,
212
+ .cursor-blast-core,
213
+ .cursor-blast-shard {
214
+ animation-duration: 1ms;
215
+ }
216
+ }
217
+ ` } })] });
218
+ if (containerRef) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
219
+ "aria-hidden": true,
220
+ style: {
221
+ position: "absolute",
222
+ inset: 0,
223
+ zIndex: 2147483647,
224
+ pointerEvents: "none",
225
+ overflow: "hidden",
226
+ borderRadius: "inherit"
227
+ },
228
+ children: blastElements
229
+ });
230
+ return (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
231
+ "aria-hidden": true,
232
+ style: {
233
+ position: "fixed",
234
+ inset: 0,
235
+ zIndex: 2147483647,
236
+ pointerEvents: "none"
237
+ },
238
+ children: blastElements
239
+ }), document.body);
240
+ }
241
+
242
+ //#endregion
243
+ exports.CursorBlastEffect = CursorBlastEffect;
244
+ //# sourceMappingURL=cursor-blast-effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-blast-effect.js","names":[],"sources":["../../src/components/cursor-blast-effect.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype Blast = {\n id: number,\n x: number,\n y: number,\n size: number,\n hue: number,\n};\n\nconst DEFAULT_BLAST_LIFETIME_MS = 720;\nconst DEFAULT_MAX_ACTIVE_BLASTS = 18;\n\n/** Minimum rapid clicks in the time window to count as a rage click */\nconst DEFAULT_RAGE_CLICK_THRESHOLD = 3;\n/** Time window (ms) in which clicks must occur to be considered rage clicking */\nconst DEFAULT_RAGE_CLICK_WINDOW_MS = 600;\n/** Max distance (px) between clicks to still count as same-spot rage clicking */\nconst DEFAULT_RAGE_CLICK_RADIUS_PX = 60;\n\ntype RecentClick = {\n time: number,\n x: number,\n y: number,\n};\n\nexport type CursorBlastEffectProps = {\n /** Lifetime of each blast animation in ms. Default: 720 */\n blastLifetimeMs?: number,\n /** Maximum number of concurrent active blasts. Default: 18 */\n maxActiveBlasts?: number,\n /** Minimum rapid clicks in the time window to trigger a blast. Default: 3 */\n rageClickThreshold?: number,\n /** Time window (ms) for counting rage clicks. Default: 600 */\n rageClickWindowMs?: number,\n /** Max distance (px) between clicks to count as same-spot rage clicking. Default: 60 */\n rageClickRadiusPx?: number,\n /**\n * When provided, the blast effect is scoped to this container element.\n * Clicks are only detected within the container and blasts are positioned\n * relative to the container rather than the viewport.\n */\n containerRef?: React.RefObject<HTMLElement | null>,\n};\n\nexport function CursorBlastEffect({\n blastLifetimeMs = DEFAULT_BLAST_LIFETIME_MS,\n maxActiveBlasts = DEFAULT_MAX_ACTIVE_BLASTS,\n rageClickThreshold = DEFAULT_RAGE_CLICK_THRESHOLD,\n rageClickWindowMs = DEFAULT_RAGE_CLICK_WINDOW_MS,\n rageClickRadiusPx = DEFAULT_RAGE_CLICK_RADIUS_PX,\n containerRef,\n}: CursorBlastEffectProps = {}) {\n const [blasts, setBlasts] = useState<Blast[]>([]);\n const [mounted, setMounted] = useState(false);\n const idCounterRef = useRef(0);\n const timeoutIdsRef = useRef<Map<number, number>>(new Map());\n const recentClicksRef = useRef<RecentClick[]>([]);\n\n // Store latest config in refs so the effect callback always reads current values\n const configRef = useRef({\n blastLifetimeMs,\n maxActiveBlasts,\n rageClickThreshold,\n rageClickWindowMs,\n rageClickRadiusPx,\n });\n configRef.current = {\n blastLifetimeMs,\n maxActiveBlasts,\n rageClickThreshold,\n rageClickWindowMs,\n rageClickRadiusPx,\n };\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const removeBlast = (id: number) => {\n setBlasts((prev) => prev.filter((blast) => blast.id !== id));\n const timeoutId = timeoutIdsRef.current.get(id);\n if (timeoutId !== undefined) {\n window.clearTimeout(timeoutId);\n timeoutIdsRef.current.delete(id);\n }\n };\n\n const spawnBlast = (x: number, y: number) => {\n const cfg = configRef.current;\n const nextId = idCounterRef.current;\n idCounterRef.current += 1;\n\n const nextBlast: Blast = {\n id: nextId,\n x,\n y,\n size: 44 + Math.random() * 20,\n hue: 185 + Math.random() * 35,\n };\n\n setBlasts((prev) => {\n const next = [...prev, nextBlast];\n if (next.length <= cfg.maxActiveBlasts) {\n return next;\n }\n return next.slice(next.length - cfg.maxActiveBlasts);\n });\n\n const timeoutId = window.setTimeout(() => removeBlast(nextId), cfg.blastLifetimeMs);\n timeoutIdsRef.current.set(nextId, timeoutId);\n };\n\n const onClick = (event: MouseEvent) => {\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n return;\n }\n\n const cfg = configRef.current;\n const now = performance.now();\n\n let x: number;\n let y: number;\n\n if (containerRef?.current) {\n const rect = containerRef.current.getBoundingClientRect();\n x = event.clientX - rect.left;\n y = event.clientY - rect.top;\n } else {\n x = event.clientX;\n y = event.clientY;\n }\n\n // Prune clicks outside the time window\n recentClicksRef.current = recentClicksRef.current.filter(\n (click) => now - click.time < cfg.rageClickWindowMs,\n );\n\n recentClicksRef.current.push({ time: now, x, y });\n\n // Count how many recent clicks are within the radius of the current click\n const nearbyCount = recentClicksRef.current.filter((click) => {\n const dx = click.x - x;\n const dy = click.y - y;\n return Math.sqrt(dx * dx + dy * dy) <= cfg.rageClickRadiusPx;\n }).length;\n\n if (nearbyCount >= cfg.rageClickThreshold) {\n spawnBlast(x, y);\n }\n };\n\n const target = containerRef?.current ?? window;\n const timeoutIds = timeoutIdsRef.current;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- EventTarget union requires cast\n (target as EventTarget).addEventListener(\"click\", onClick as EventListener);\n return () => {\n (target as EventTarget).removeEventListener(\"click\", onClick as EventListener);\n for (const timeoutId of timeoutIds.values()) {\n window.clearTimeout(timeoutId);\n }\n timeoutIds.clear();\n };\n }, [containerRef]);\n\n if (!mounted) {\n return null;\n }\n\n const blastElements = (\n <>\n {blasts.map((blast) => (\n <div\n key={blast.id}\n style={{\n position: \"absolute\",\n left: blast.x,\n top: blast.y,\n width: blast.size,\n height: blast.size,\n transform: \"translate(-50%, -50%)\",\n willChange: \"transform, opacity\",\n filter: `hue-rotate(${blast.hue}deg)`,\n }}\n >\n <span className=\"cursor-blast-ring\" />\n <span className=\"cursor-blast-core\" />\n {Array.from({ length: 10 }).map((_, index) => {\n const angle = (360 / 10) * index;\n return (\n <span\n key={`${blast.id}-${index}`}\n className=\"cursor-blast-shard-wrap\"\n style={{\n transform: `translate(-50%, -50%) rotate(${angle}deg)`,\n animationDelay: `${index * 16}ms`,\n }}\n >\n <span className=\"cursor-blast-shard\" />\n </span>\n );\n })}\n </div>\n ))}\n <style dangerouslySetInnerHTML={{ __html: `\n .cursor-blast-ring {\n position: absolute;\n inset: 0;\n border-radius: 999px;\n border: 2px solid hsl(197 98% 67% / 0.9);\n box-shadow:\n 0 0 22px hsl(191 100% 72% / 0.6),\n inset 0 0 12px hsl(204 100% 77% / 0.65);\n animation: blast-ring 560ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n }\n\n .cursor-blast-core {\n position: absolute;\n left: 50%;\n top: 50%;\n width: 10px;\n height: 10px;\n border-radius: 999px;\n transform: translate(-50%, -50%);\n background: hsl(196 100% 85%);\n box-shadow:\n 0 0 26px hsl(193 100% 72% / 0.9),\n 0 0 10px hsl(201 100% 85% / 0.9);\n animation: blast-core 420ms ease-out forwards;\n }\n\n .cursor-blast-shard-wrap {\n position: absolute;\n left: 50%;\n top: 50%;\n width: 0;\n height: 0;\n }\n\n .cursor-blast-shard {\n position: absolute;\n left: 0;\n top: -1.5px;\n width: 12px;\n height: 3px;\n border-radius: 999px;\n background: linear-gradient(90deg, hsl(190 100% 84%), hsl(197 98% 67%));\n box-shadow: 0 0 12px hsl(195 100% 70% / 0.8);\n animation: blast-shard 680ms cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes blast-ring {\n 0% {\n transform: scale(0.2);\n opacity: 0.95;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n }\n\n @keyframes blast-core {\n 0% {\n transform: translate(-50%, -50%) scale(0.5);\n opacity: 1;\n }\n 100% {\n transform: translate(-50%, -50%) scale(2.2);\n opacity: 0;\n }\n }\n\n @keyframes blast-shard {\n 0% {\n transform: translateX(0) scaleX(0.7);\n opacity: 1;\n }\n 100% {\n transform: translateX(46px) scaleX(1.1);\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .cursor-blast-ring,\n .cursor-blast-core,\n .cursor-blast-shard {\n animation-duration: 1ms;\n }\n }\n ` }} />\n </>\n );\n\n // When scoped to a container, render inline (the container must have position: relative)\n if (containerRef) {\n return (\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 2147483647,\n pointerEvents: \"none\",\n overflow: \"hidden\",\n borderRadius: \"inherit\",\n }}\n >\n {blastElements}\n </div>\n );\n }\n\n // Default: portal to body with fixed positioning (original behaviour)\n return createPortal(\n <div\n aria-hidden\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n pointerEvents: \"none\",\n }}\n >\n {blastElements}\n </div>,\n document.body,\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { DataGridColumnDef } from "./types.js";
2
+
3
+ //#region src/components/data-grid/data-grid-sizing.d.ts
4
+ declare const DEFAULT_MAX_COL_WIDTH = 800;
5
+ declare const DEFAULT_COL_WIDTH = 150;
6
+ /** Effective minimum column width. When `col.minWidth` is unset, derive
7
+ * one from the header label so it never gets clipped during resize. */
8
+ declare function getEffectiveMinWidth<TRow>(col: DataGridColumnDef<TRow>): number;
9
+ declare function getEffectiveMaxWidth<TRow>(col: DataGridColumnDef<TRow>): number;
10
+ declare function clampColumnWidth<TRow>(col: DataGridColumnDef<TRow>, width: number): number;
11
+ //#endregion
12
+ export { DEFAULT_COL_WIDTH, DEFAULT_MAX_COL_WIDTH, clampColumnWidth, getEffectiveMaxWidth, getEffectiveMinWidth };
13
+ //# sourceMappingURL=data-grid-sizing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-grid-sizing.d.ts","names":[],"sources":["../../../src/components/data-grid/data-grid-sizing.ts"],"mappings":";;;cAIa,qBAAA;AAAA,cACA,iBAAA;AADb;;AAAA,iBA+BgB,oBAAA,MAAA,CAA2B,GAAA,EAAK,iBAAA,CAAkB,IAAA;AAAA,iBASlD,oBAAA,MAAA,CAA2B,GAAA,EAAK,iBAAA,CAAkB,IAAA;AAAA,iBAIlD,gBAAA,MAAA,CAAuB,GAAA,EAAK,iBAAA,CAAkB,IAAA,GAAO,KAAA"}