@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 @@
1
+ {"version":3,"file":"use-url-state.test.js","names":[],"sources":["../../../../src/components/data-grid/use-url-state.test.tsx"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { act, renderHook } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport type { DataGridColumnDef } from \"./types\";\nimport { useDataGridUrlState } from \"./use-url-state\";\n\ntype Row = { id: string };\n\nconst columns: DataGridColumnDef<Row>[] = [\n { id: \"name\", header: \"Name\", accessor: () => \"\", width: 160, minWidth: 80, type: \"string\" },\n { id: \"email\", header: \"Email\", accessor: () => \"\", width: 200, minWidth: 80, type: \"string\" },\n];\n\nfunction setUrl(search: string) {\n window.history.replaceState(null, \"\", `/${search ? `?${search}` : \"\"}`);\n}\n\nbeforeEach(() => {\n setUrl(\"\");\n});\n\nafterEach(() => {\n setUrl(\"\");\n});\n\ndescribe(\"useDataGridUrlState\", () => {\n it(\"initializes from existing URL params\", () => {\n setUrl(\"grid_w=name:240&grid_h=email\");\n const { result } = renderHook(() => useDataGridUrlState(columns));\n const [state] = result.current;\n expect(state.columnWidths.name).toBe(240);\n expect(state.columnVisibility.email).toBe(false);\n });\n\n it(\"writes width changes back to the URL (after debounce)\", async () => {\n const { result } = renderHook(() => useDataGridUrlState(columns));\n\n act(() => {\n const [, setState] = result.current;\n setState((prev) => ({\n ...prev,\n columnWidths: { ...prev.columnWidths, name: 250 },\n }));\n });\n\n // Debounce is 100ms.\n await new Promise((resolve) => setTimeout(resolve, 150));\n const params = new URLSearchParams(window.location.search);\n expect(params.get(\"grid_w\")).toBe(\"name:250\");\n });\n\n it(\"resets column widths to defaults when a popstate clears the URL\", () => {\n setUrl(\"grid_w=name:300\");\n const { result } = renderHook(() => useDataGridUrlState(columns));\n expect(result.current[0].columnWidths.name).toBe(300);\n\n act(() => {\n setUrl(\"\");\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n });\n\n // Default for \"name\" column is its declared width of 160.\n expect(result.current[0].columnWidths.name).toBe(160);\n });\n\n it(\"isolates two grids on the same page via paramPrefix\", async () => {\n const { result: a } = renderHook(() => useDataGridUrlState(columns, { paramPrefix: \"users\" }));\n const { result: b } = renderHook(() => useDataGridUrlState(columns, { paramPrefix: \"teams\" }));\n\n act(() => {\n a.current[1]((prev) => ({ ...prev, columnWidths: { ...prev.columnWidths, name: 222 } }));\n });\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n const params = new URLSearchParams(window.location.search);\n expect(params.get(\"users_w\")).toBe(\"name:222\");\n expect(params.get(\"teams_w\")).toBeNull();\n expect(b.current[0].columnWidths.name).toBe(160); // unaffected\n });\n\n it(\"ignores malformed entries in the URL param without throwing\", () => {\n setUrl(\"grid_w=:,name:abc,name:240,bogusid:99\");\n const { result } = renderHook(() => useDataGridUrlState(columns));\n // Only the well-formed `name:240` should land; junk is dropped silently.\n expect(result.current[0].columnWidths.name).toBe(240);\n });\n});\n"],"mappings":";;;;;;AASA,MAAM,UAAoC,CACxC;CAAE,IAAI;CAAQ,QAAQ;CAAQ,gBAAgB;CAAI,OAAO;CAAK,UAAU;CAAI,MAAM;CAAU,EAC5F;CAAE,IAAI;CAAS,QAAQ;CAAS,gBAAgB;CAAI,OAAO;CAAK,UAAU;CAAI,MAAM;CAAU,CAC/F;AAED,SAAS,OAAO,QAAgB;AAC9B,QAAO,QAAQ,aAAa,MAAM,IAAI,IAAI,SAAS,IAAI,WAAW,KAAK;;AAGzE,iBAAiB;AACf,QAAO,GAAG;EACV;AAEF,gBAAgB;AACd,QAAO,GAAG;EACV;AAEF,SAAS,6BAA6B;AACpC,IAAG,8CAA8C;AAC/C,SAAO,+BAA+B;EACtC,MAAM,EAAE,WAAW,iBAAiB,oBAAoB,QAAQ,CAAC;EACjE,MAAM,CAAC,SAAS,OAAO;AACvB,SAAO,MAAM,aAAa,KAAK,CAAC,KAAK,IAAI;AACzC,SAAO,MAAM,iBAAiB,MAAM,CAAC,KAAK,MAAM;GAChD;AAEF,IAAG,yDAAyD,YAAY;EACtE,MAAM,EAAE,WAAW,iBAAiB,oBAAoB,QAAQ,CAAC;AAEjE,YAAU;GACR,MAAM,GAAG,YAAY,OAAO;AAC5B,aAAU,UAAU;IAClB,GAAG;IACH,cAAc;KAAE,GAAG,KAAK;KAAc,MAAM;KAAK;IAClD,EAAE;IACH;AAGF,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;AAExD,SADe,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAC5C,IAAI,SAAS,CAAC,CAAC,KAAK,WAAW;GAC7C;AAEF,IAAG,yEAAyE;AAC1E,SAAO,kBAAkB;EACzB,MAAM,EAAE,WAAW,iBAAiB,oBAAoB,QAAQ,CAAC;AACjE,SAAO,OAAO,QAAQ,GAAG,aAAa,KAAK,CAAC,KAAK,IAAI;AAErD,YAAU;AACR,UAAO,GAAG;AACV,UAAO,cAAc,IAAI,cAAc,WAAW,CAAC;IACnD;AAGF,SAAO,OAAO,QAAQ,GAAG,aAAa,KAAK,CAAC,KAAK,IAAI;GACrD;AAEF,IAAG,uDAAuD,YAAY;EACpE,MAAM,EAAE,QAAQ,MAAM,iBAAiB,oBAAoB,SAAS,EAAE,aAAa,SAAS,CAAC,CAAC;EAC9F,MAAM,EAAE,QAAQ,MAAM,iBAAiB,oBAAoB,SAAS,EAAE,aAAa,SAAS,CAAC,CAAC;AAE9F,YAAU;AACR,KAAE,QAAQ,IAAI,UAAU;IAAE,GAAG;IAAM,cAAc;KAAE,GAAG,KAAK;KAAc,MAAM;KAAK;IAAE,EAAE;IACxF;AACF,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;EAExD,MAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,OAAO;AAC1D,SAAO,OAAO,IAAI,UAAU,CAAC,CAAC,KAAK,WAAW;AAC9C,SAAO,OAAO,IAAI,UAAU,CAAC,CAAC,UAAU;AACxC,SAAO,EAAE,QAAQ,GAAG,aAAa,KAAK,CAAC,KAAK,IAAI;GAChD;AAEF,IAAG,qEAAqE;AACtE,SAAO,wCAAwC;EAC/C,MAAM,EAAE,WAAW,iBAAiB,oBAAoB,QAAQ,CAAC;AAEjE,SAAO,OAAO,QAAQ,GAAG,aAAa,KAAK,CAAC,KAAK,IAAI;GACrD;EACF"}
@@ -0,0 +1,67 @@
1
+ import { Dialog } from "@hexclave/ui";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import React from "react";
4
+ import * as _radix_ui_react_dialog0 from "@radix-ui/react-dialog";
5
+
6
+ //#region src/components/dialog.d.ts
7
+ type DesignDialogSize = "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl" | "5xl" | "6xl" | "7xl" | "full";
8
+ type DesignDialogVariant = "glassmorphic" | "plain";
9
+ type DesignDialogIcon = React.ElementType<{
10
+ className?: string;
11
+ }>;
12
+ type DesignDialogRootProps = Omit<React.ComponentProps<typeof Dialog>, "children">;
13
+ type DesignDialogProps = {
14
+ trigger?: React.ReactElement;
15
+ size?: DesignDialogSize;
16
+ variant?: DesignDialogVariant;
17
+ icon?: DesignDialogIcon | null;
18
+ title?: React.ReactNode;
19
+ description?: React.ReactNode;
20
+ headerContent?: React.ReactNode;
21
+ customHeader?: React.ReactNode;
22
+ footer?: React.ReactNode;
23
+ noBodyPadding?: boolean;
24
+ hideTopCloseButton?: boolean;
25
+ className?: string;
26
+ overlayClassName?: string;
27
+ headerClassName?: string;
28
+ bodyClassName?: string;
29
+ footerClassName?: string;
30
+ children?: React.ReactNode;
31
+ } & DesignDialogRootProps;
32
+ /**
33
+ * Canonical dashboard modal surface. This wraps the base dialog primitives with
34
+ * a reusable glassmorphic shell and consistent header/body/footer regions.
35
+ */
36
+ declare function DesignDialog({
37
+ trigger,
38
+ size,
39
+ variant,
40
+ icon: Icon,
41
+ title,
42
+ description,
43
+ headerContent,
44
+ customHeader,
45
+ footer,
46
+ noBodyPadding,
47
+ hideTopCloseButton,
48
+ className,
49
+ overlayClassName,
50
+ headerClassName,
51
+ bodyClassName,
52
+ footerClassName,
53
+ children,
54
+ ...dialogRootProps
55
+ }: DesignDialogProps): react_jsx_runtime0.JSX.Element;
56
+ declare const DesignDialogRoot: React.FC<_radix_ui_react_dialog0.DialogProps>;
57
+ declare const DesignDialogTrigger: React.ForwardRefExoticComponent<_radix_ui_react_dialog0.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
58
+ declare const DesignDialogClose: React.ForwardRefExoticComponent<_radix_ui_react_dialog0.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
59
+ declare const DesignDialogTitle: React.FC<Omit<_radix_ui_react_dialog0.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & {
60
+ ref?: React.Ref<HTMLHeadingElement> | undefined;
61
+ }>;
62
+ declare const DesignDialogDescription: React.FC<Omit<_radix_ui_react_dialog0.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & {
63
+ ref?: React.Ref<HTMLParagraphElement> | undefined;
64
+ }>;
65
+ //#endregion
66
+ export { DesignDialog, DesignDialogClose, DesignDialogDescription, DesignDialogProps, DesignDialogRoot, DesignDialogSize, DesignDialogTitle, DesignDialogTrigger, DesignDialogVariant };
67
+ //# sourceMappingURL=dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.d.ts","names":[],"sources":["../../../src/components/dialog.tsx"],"mappings":";;;;;;KAgBY,gBAAA;AAAA,KAaA,mBAAA;AAAA,KA0BP,gBAAA,GAAmB,KAAA,CAAM,WAAA;EAAc,SAAA;AAAA;AAAA,KAEvC,qBAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,cAAA,QAAsB,MAAA;AAAA,KAElD,iBAAA;EACV,OAAA,GAAU,KAAA,CAAM,YAAA;EAChB,IAAA,GAAO,gBAAA;EACP,OAAA,GAAU,mBAAA;EACV,IAAA,GAAO,gBAAA;EACP,KAAA,GAAQ,KAAA,CAAM,SAAA;EACd,WAAA,GAAc,KAAA,CAAM,SAAA;EACpB,aAAA,GAAgB,KAAA,CAAM,SAAA;EACtB,YAAA,GAAe,KAAA,CAAM,SAAA;EACrB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,aAAA;EACA,kBAAA;EACA,SAAA;EACA,gBAAA;EACA,eAAA;EACA,aAAA;EACA,eAAA;EACA,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA,IACf,qBAAA;;;;;iBAMY,YAAA,CAAA;EACd,OAAA;EACA,IAAA;EACA,OAAA;EACA,IAAA,EAAM,IAAA;EACN,KAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,MAAA;EACA,aAAA;EACA,kBAAA;EACA,SAAA;EACA,gBAAA;EACA,eAAA;EACA,aAAA;EACA,eAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,iBAAA,GAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAoGP,gBAAA,EAAgB,KAAA,CAAA,EAAA,CAAS,uBAAA,CAAT,WAAA;AAAA,cAChB,mBAAA,EAAmB,KAAA,CAAA,yBAAA,CAAgB,uBAAA,CAAhB,kBAAA,GAAA,KAAA,CAAA,aAAA,CAAA,iBAAA;AAAA,cACnB,iBAAA,EAAiB,KAAA,CAAA,yBAAA,CAAc,uBAAA,CAAd,gBAAA,GAAA,KAAA,CAAA,aAAA,CAAA,iBAAA;AAAA,cACjB,iBAAA,EAAiB,KAAA,CAAA,EAAA,CAAA,IAAA,CAAc,uBAAA,CAAd,gBAAA,GAAA,KAAA,CAAA,aAAA,CAAA,kBAAA;;;cACjB,uBAAA,EAAuB,KAAA,CAAA,EAAA,CAAA,IAAA,CAAoB,uBAAA,CAApB,sBAAA,GAAA,KAAA,CAAA,aAAA,CAAA,oBAAA"}
@@ -0,0 +1,92 @@
1
+ "use client";
2
+
3
+ import { Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, cn } from "@hexclave/ui";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import React from "react";
6
+
7
+ //#region src/components/dialog.tsx
8
+ const dialogSizeClasses = new Map([
9
+ ["sm", "max-w-sm"],
10
+ ["md", "max-w-md"],
11
+ ["lg", "max-w-lg"],
12
+ ["xl", "max-w-xl"],
13
+ ["2xl", "max-w-2xl"],
14
+ ["3xl", "max-w-3xl"],
15
+ ["4xl", "max-w-4xl"],
16
+ ["5xl", "max-w-5xl"],
17
+ ["6xl", "max-w-6xl"],
18
+ ["7xl", "max-w-7xl"],
19
+ ["full", "max-w-[calc(100vw-2rem)]"]
20
+ ]);
21
+ const dialogSurfaceClasses = new Map([["glassmorphic", "border-0 sm:rounded-2xl bg-background/85 backdrop-blur-2xl ring-1 ring-foreground/[0.06] shadow-[0_24px_48px_-12px_rgba(0,0,0,0.25),0_4px_24px_-8px_rgba(0,0,0,0.12)] dark:bg-background/80 dark:ring-white/[0.06]"], ["plain", "border bg-background shadow-lg sm:rounded-lg"]]);
22
+ const dialogOverlayClasses = new Map([["glassmorphic", "bg-black/50 backdrop-blur-sm"], ["plain", void 0]]);
23
+ /**
24
+ * Canonical dashboard modal surface. This wraps the base dialog primitives with
25
+ * a reusable glassmorphic shell and consistent header/body/footer regions.
26
+ */
27
+ function DesignDialog({ trigger, size = "lg", variant = "glassmorphic", icon: Icon = null, title, description, headerContent, customHeader, footer, noBodyPadding = false, hideTopCloseButton = false, className, overlayClassName, headerClassName, bodyClassName, footerClassName, children, ...dialogRootProps }) {
28
+ const resolvedSizeClass = dialogSizeClasses.get(size) ?? "max-w-lg";
29
+ const resolvedSurfaceClass = dialogSurfaceClasses.get(variant) ?? dialogSurfaceClasses.get("glassmorphic");
30
+ const resolvedOverlayClass = cn(dialogOverlayClasses.get(variant), overlayClassName);
31
+ const shouldRenderTopHeaderRow = Icon != null || title != null || description != null;
32
+ const shouldRenderHeader = customHeader != null || shouldRenderTopHeaderRow || headerContent != null;
33
+ const shouldRenderBody = React.Children.toArray(children).filter(Boolean).length > 0;
34
+ const needsAccessibleTitleFallback = !(title != null) && customHeader == null;
35
+ if (process.env.NODE_ENV !== "production" && needsAccessibleTitleFallback) console.warn("[DesignDialog] Rendered without a `title` or `customHeader`. Every dialog needs an accessible name — pass `title`, or render a `DialogTitle` inside `customHeader`.");
36
+ return /* @__PURE__ */ jsxs(Dialog, {
37
+ ...dialogRootProps,
38
+ children: [trigger != null && /* @__PURE__ */ jsx(DialogTrigger, {
39
+ asChild: true,
40
+ children: trigger
41
+ }), /* @__PURE__ */ jsxs(DialogContent, {
42
+ className: cn("gap-0 p-0 overflow-hidden", resolvedSizeClass, resolvedSurfaceClass, className),
43
+ overlayProps: resolvedOverlayClass ? { className: resolvedOverlayClass } : void 0,
44
+ noCloseButton: hideTopCloseButton,
45
+ children: [
46
+ needsAccessibleTitleFallback && /* @__PURE__ */ jsx(DialogTitle, {
47
+ className: "sr-only",
48
+ children: "Dialog"
49
+ }),
50
+ shouldRenderHeader && /* @__PURE__ */ jsx(DialogHeader, {
51
+ className: cn("px-6 pt-6 pb-4 border-b border-foreground/[0.06]", headerClassName),
52
+ children: customHeader ?? /* @__PURE__ */ jsxs(Fragment, { children: [shouldRenderTopHeaderRow && /* @__PURE__ */ jsxs("div", {
53
+ className: cn("flex items-start gap-3", Icon == null && "gap-0"),
54
+ children: [Icon != null && /* @__PURE__ */ jsx("div", {
55
+ className: "h-9 w-9 rounded-xl bg-primary/10 ring-1 ring-primary/15 flex items-center justify-center shrink-0",
56
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 text-primary" })
57
+ }), (title != null || description != null) && /* @__PURE__ */ jsxs("div", {
58
+ className: "flex-1 min-w-0 space-y-1",
59
+ children: [title != null ? /* @__PURE__ */ jsx(DialogTitle, {
60
+ className: "text-base",
61
+ children: title
62
+ }) : null, description != null ? /* @__PURE__ */ jsx(DialogDescription, {
63
+ className: "text-xs",
64
+ children: description
65
+ }) : null]
66
+ })]
67
+ }), headerContent != null ? /* @__PURE__ */ jsx("div", {
68
+ className: cn(shouldRenderTopHeaderRow && "mt-4"),
69
+ children: headerContent
70
+ }) : null] })
71
+ }),
72
+ shouldRenderBody && /* @__PURE__ */ jsx(DialogBody, {
73
+ className: cn("mx-0 my-0 w-auto", noBodyPadding ? "px-0 py-0" : "px-6 py-4", bodyClassName),
74
+ children
75
+ }),
76
+ footer != null ? /* @__PURE__ */ jsx(DialogFooter, {
77
+ className: cn("px-6 py-3 border-t border-foreground/[0.06] bg-foreground/[0.02]", footerClassName),
78
+ children: footer
79
+ }) : null
80
+ ]
81
+ })]
82
+ });
83
+ }
84
+ const DesignDialogRoot = Dialog;
85
+ const DesignDialogTrigger = DialogTrigger;
86
+ const DesignDialogClose = DialogClose;
87
+ const DesignDialogTitle = DialogTitle;
88
+ const DesignDialogDescription = DialogDescription;
89
+
90
+ //#endregion
91
+ export { DesignDialog, DesignDialogClose, DesignDialogDescription, DesignDialogRoot, DesignDialogTitle, DesignDialogTrigger };
92
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.js","names":[],"sources":["../../../src/components/dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Dialog,\n DialogBody,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n cn,\n} from \"@stackframe/stack-ui\";\nimport React from \"react\";\n\nexport type DesignDialogSize =\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"5xl\"\n | \"6xl\"\n | \"7xl\"\n | \"full\";\n\nexport type DesignDialogVariant = \"glassmorphic\" | \"plain\";\n\nconst dialogSizeClasses = new Map<DesignDialogSize, string>([\n [\"sm\", \"max-w-sm\"],\n [\"md\", \"max-w-md\"],\n [\"lg\", \"max-w-lg\"],\n [\"xl\", \"max-w-xl\"],\n [\"2xl\", \"max-w-2xl\"],\n [\"3xl\", \"max-w-3xl\"],\n [\"4xl\", \"max-w-4xl\"],\n [\"5xl\", \"max-w-5xl\"],\n [\"6xl\", \"max-w-6xl\"],\n [\"7xl\", \"max-w-7xl\"],\n [\"full\", \"max-w-[calc(100vw-2rem)]\"],\n]);\n\nconst dialogSurfaceClasses = new Map<DesignDialogVariant, string>([\n [\"glassmorphic\", \"border-0 sm:rounded-2xl bg-background/85 backdrop-blur-2xl ring-1 ring-foreground/[0.06] shadow-[0_24px_48px_-12px_rgba(0,0,0,0.25),0_4px_24px_-8px_rgba(0,0,0,0.12)] dark:bg-background/80 dark:ring-white/[0.06]\"],\n [\"plain\", \"border bg-background shadow-lg sm:rounded-lg\"],\n]);\n\nconst dialogOverlayClasses = new Map<DesignDialogVariant, string | undefined>([\n [\"glassmorphic\", \"bg-black/50 backdrop-blur-sm\"],\n [\"plain\", undefined],\n]);\n\ntype DesignDialogIcon = React.ElementType<{ className?: string }>;\n\ntype DesignDialogRootProps = Omit<React.ComponentProps<typeof Dialog>, \"children\">;\n\nexport type DesignDialogProps = {\n trigger?: React.ReactElement,\n size?: DesignDialogSize,\n variant?: DesignDialogVariant,\n icon?: DesignDialogIcon | null,\n title?: React.ReactNode,\n description?: React.ReactNode,\n headerContent?: React.ReactNode,\n customHeader?: React.ReactNode,\n footer?: React.ReactNode,\n noBodyPadding?: boolean,\n hideTopCloseButton?: boolean,\n className?: string,\n overlayClassName?: string,\n headerClassName?: string,\n bodyClassName?: string,\n footerClassName?: string,\n children?: React.ReactNode,\n} & DesignDialogRootProps;\n\n/**\n * Canonical dashboard modal surface. This wraps the base dialog primitives with\n * a reusable glassmorphic shell and consistent header/body/footer regions.\n */\nexport function DesignDialog({\n trigger,\n size = \"lg\",\n variant = \"glassmorphic\",\n icon: Icon = null,\n title,\n description,\n headerContent,\n customHeader,\n footer,\n noBodyPadding = false,\n hideTopCloseButton = false,\n className,\n overlayClassName,\n headerClassName,\n bodyClassName,\n footerClassName,\n children,\n ...dialogRootProps\n}: DesignDialogProps) {\n const resolvedSizeClass = dialogSizeClasses.get(size) ?? \"max-w-lg\";\n const resolvedSurfaceClass = dialogSurfaceClasses.get(variant) ?? dialogSurfaceClasses.get(\"glassmorphic\");\n const resolvedOverlayClass = cn(dialogOverlayClasses.get(variant), overlayClassName);\n const shouldRenderTopHeaderRow = Icon != null || title != null || description != null;\n const shouldRenderHeader = customHeader != null || shouldRenderTopHeaderRow || headerContent != null;\n // Use toArray + filter(Boolean) instead of Children.count so that\n // expressions like `{condition && <Foo/>}` resolving to `false` don't\n // produce an empty DialogBody (which would still render padding/borders).\n const shouldRenderBody = React.Children.toArray(children).filter(Boolean).length > 0;\n const hasStandardTitle = title != null;\n const needsAccessibleTitleFallback = !hasStandardTitle && customHeader == null;\n\n if (process.env.NODE_ENV !== \"production\" && needsAccessibleTitleFallback) {\n console.warn(\n \"[DesignDialog] Rendered without a `title` or `customHeader`. Every dialog needs an accessible name — pass `title`, or render a `DialogTitle` inside `customHeader`.\",\n );\n }\n\n return (\n <Dialog {...dialogRootProps}>\n {trigger != null && (\n <DialogTrigger asChild>\n {trigger}\n </DialogTrigger>\n )}\n\n <DialogContent\n className={cn(\n \"gap-0 p-0 overflow-hidden\",\n resolvedSizeClass,\n resolvedSurfaceClass,\n className\n )}\n overlayProps={resolvedOverlayClass ? { className: resolvedOverlayClass } : undefined}\n noCloseButton={hideTopCloseButton}\n >\n {needsAccessibleTitleFallback && (\n <DialogTitle className=\"sr-only\">Dialog</DialogTitle>\n )}\n {shouldRenderHeader && (\n <DialogHeader className={cn(\"px-6 pt-6 pb-4 border-b border-foreground/[0.06]\", headerClassName)}>\n {customHeader ?? (\n <>\n {shouldRenderTopHeaderRow && (\n <div className={cn(\"flex items-start gap-3\", Icon == null && \"gap-0\")}>\n {Icon != null && (\n <div className=\"h-9 w-9 rounded-xl bg-primary/10 ring-1 ring-primary/15 flex items-center justify-center shrink-0\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </div>\n )}\n {(title != null || description != null) && (\n <div className=\"flex-1 min-w-0 space-y-1\">\n {title != null ? (\n <DialogTitle className=\"text-base\">\n {title}\n </DialogTitle>\n ) : null}\n {description != null ? (\n <DialogDescription className=\"text-xs\">\n {description}\n </DialogDescription>\n ) : null}\n </div>\n )}\n </div>\n )}\n\n {headerContent != null ? (\n <div className={cn(shouldRenderTopHeaderRow && \"mt-4\")}>\n {headerContent}\n </div>\n ) : null}\n </>\n )}\n </DialogHeader>\n )}\n\n {shouldRenderBody && (\n <DialogBody\n className={cn(\n \"mx-0 my-0 w-auto\",\n noBodyPadding ? \"px-0 py-0\" : \"px-6 py-4\",\n bodyClassName\n )}\n >\n {children}\n </DialogBody>\n )}\n\n {footer != null ? (\n <DialogFooter className={cn(\"px-6 py-3 border-t border-foreground/[0.06] bg-foreground/[0.02]\", footerClassName)}>\n {footer}\n </DialogFooter>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n\nexport const DesignDialogRoot = Dialog;\nexport const DesignDialogTrigger = DialogTrigger;\nexport const DesignDialogClose = DialogClose;\nexport const DesignDialogTitle = DialogTitle;\nexport const DesignDialogDescription = DialogDescription;\n"],"mappings":";;;;;;;AA+BA,MAAM,oBAAoB,IAAI,IAA8B;CAC1D,CAAC,MAAM,WAAW;CAClB,CAAC,MAAM,WAAW;CAClB,CAAC,MAAM,WAAW;CAClB,CAAC,MAAM,WAAW;CAClB,CAAC,OAAO,YAAY;CACpB,CAAC,OAAO,YAAY;CACpB,CAAC,OAAO,YAAY;CACpB,CAAC,OAAO,YAAY;CACpB,CAAC,OAAO,YAAY;CACpB,CAAC,OAAO,YAAY;CACpB,CAAC,QAAQ,2BAA2B;CACrC,CAAC;AAEF,MAAM,uBAAuB,IAAI,IAAiC,CAChE,CAAC,gBAAgB,qNAAqN,EACtO,CAAC,SAAS,+CAA+C,CAC1D,CAAC;AAEF,MAAM,uBAAuB,IAAI,IAA6C,CAC5E,CAAC,gBAAgB,+BAA+B,EAChD,CAAC,SAAS,OAAU,CACrB,CAAC;;;;;AA8BF,SAAgB,aAAa,EAC3B,SACA,OAAO,MACP,UAAU,gBACV,MAAM,OAAO,MACb,OACA,aACA,eACA,cACA,QACA,gBAAgB,OAChB,qBAAqB,OACrB,WACA,kBACA,iBACA,eACA,iBACA,UACA,GAAG,mBACiB;CACpB,MAAM,oBAAoB,kBAAkB,IAAI,KAAK,IAAI;CACzD,MAAM,uBAAuB,qBAAqB,IAAI,QAAQ,IAAI,qBAAqB,IAAI,eAAe;CAC1G,MAAM,uBAAuB,GAAG,qBAAqB,IAAI,QAAQ,EAAE,iBAAiB;CACpF,MAAM,2BAA2B,QAAQ,QAAQ,SAAS,QAAQ,eAAe;CACjF,MAAM,qBAAqB,gBAAgB,QAAQ,4BAA4B,iBAAiB;CAIhG,MAAM,mBAAmB,MAAM,SAAS,QAAQ,SAAS,CAAC,OAAO,QAAQ,CAAC,SAAS;CAEnF,MAAM,+BAA+B,EADZ,SAAS,SACwB,gBAAgB;AAE1E,KAAI,QAAQ,IAAI,aAAa,gBAAgB,6BAC3C,SAAQ,KACN,sKACD;AAGH,QACE,qBAAC;EAAO,GAAI;aACT,WAAW,QACV,oBAAC;GAAc;aACZ;IACa,EAGlB,qBAAC;GACC,WAAW,GACT,6BACA,mBACA,sBACA,UACD;GACD,cAAc,uBAAuB,EAAE,WAAW,sBAAsB,GAAG;GAC3E,eAAe;;IAEd,gCACC,oBAAC;KAAY,WAAU;eAAU;MAAoB;IAEtD,sBACC,oBAAC;KAAa,WAAW,GAAG,oDAAoD,gBAAgB;eAC7F,gBACC,4CACG,4BACC,qBAAC;MAAI,WAAW,GAAG,0BAA0B,QAAQ,QAAQ,QAAQ;iBAClE,QAAQ,QACP,oBAAC;OAAI,WAAU;iBACb,oBAAC,QAAK,WAAU,yBAAyB;QACrC,GAEN,SAAS,QAAQ,eAAe,SAChC,qBAAC;OAAI,WAAU;kBACZ,SAAS,OACR,oBAAC;QAAY,WAAU;kBACpB;SACW,GACZ,MACH,eAAe,OACd,oBAAC;QAAkB,WAAU;kBAC1B;SACiB,GAClB;QACA;OAEJ,EAGP,iBAAiB,OAChB,oBAAC;MAAI,WAAW,GAAG,4BAA4B,OAAO;gBACnD;OACG,GACJ,QACH;MAEQ;IAGhB,oBACC,oBAAC;KACC,WAAW,GACT,oBACA,gBAAgB,cAAc,aAC9B,cACD;KAEA;MACU;IAGd,UAAU,OACT,oBAAC;KAAa,WAAW,GAAG,oEAAoE,gBAAgB;eAC7G;MACY,GACb;;IACU;GACT;;AAIb,MAAa,mBAAmB;AAChC,MAAa,sBAAsB;AACnC,MAAa,oBAAoB;AACjC,MAAa,oBAAoB;AACjC,MAAa,0BAA0B"}
@@ -0,0 +1,12 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+
3
+ //#region src/components/edit-mode.d.ts
4
+ declare function DesignEditMode({
5
+ children
6
+ }: {
7
+ children: React.ReactNode;
8
+ }): react_jsx_runtime0.JSX.Element;
9
+ declare function useDesignEditMode(): boolean;
10
+ //#endregion
11
+ export { DesignEditMode, useDesignEditMode };
12
+ //# sourceMappingURL=edit-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-mode.d.ts","names":[],"sources":["../../../src/components/edit-mode.tsx"],"mappings":";;;iBAMgB,cAAA,CAAA;EAAiB;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAQ1D,iBAAA,CAAA"}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { createContext, useContext } from "react";
5
+
6
+ //#region src/components/edit-mode.tsx
7
+ const DesignEditModeContext = createContext(false);
8
+ function DesignEditMode({ children }) {
9
+ return /* @__PURE__ */ jsx(DesignEditModeContext.Provider, {
10
+ value: true,
11
+ children
12
+ });
13
+ }
14
+ function useDesignEditMode() {
15
+ return useContext(DesignEditModeContext);
16
+ }
17
+
18
+ //#endregion
19
+ export { DesignEditMode, useDesignEditMode };
20
+ //# sourceMappingURL=edit-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-mode.js","names":[],"sources":["../../../src/components/edit-mode.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nconst DesignEditModeContext = createContext(false);\n\nexport function DesignEditMode({ children }: { children: React.ReactNode }) {\n return (\n <DesignEditModeContext.Provider value={true}>\n {children}\n </DesignEditModeContext.Provider>\n );\n}\n\nexport function useDesignEditMode(): boolean {\n return useContext(DesignEditModeContext);\n}\n"],"mappings":";;;;;;AAIA,MAAM,wBAAwB,cAAc,MAAM;AAElD,SAAgB,eAAe,EAAE,YAA2C;AAC1E,QACE,oBAAC,sBAAsB;EAAS,OAAO;EACpC;GAC8B;;AAIrC,SAAgB,oBAA6B;AAC3C,QAAO,WAAW,sBAAsB"}
@@ -0,0 +1,37 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import React from "react";
3
+
4
+ //#region src/components/empty-state.d.ts
5
+ type DesignEmptyStateProps = {
6
+ icon?: React.ElementType;
7
+ title?: string;
8
+ description?: string;
9
+ children?: React.ReactNode;
10
+ className?: string;
11
+ };
12
+ /**
13
+ * Centered "no data" placeholder. Show this inside a `DataGrid` via the
14
+ * `emptyState` prop, inside a chart when a query returns zero rows, or
15
+ * inside a card when a section has nothing to display.
16
+ *
17
+ * ```tsx
18
+ * <DesignEmptyState
19
+ * icon={SearchIcon}
20
+ * title="No results"
21
+ * description="Try adjusting your filters."
22
+ * />
23
+ * ```
24
+ *
25
+ * Prefer this over a raw "No data" div — it handles spacing, typography,
26
+ * and the optional icon for you. `icon` is a component type, not a rendered node.
27
+ */
28
+ declare function DesignEmptyState({
29
+ icon: Icon,
30
+ title,
31
+ description,
32
+ children,
33
+ className
34
+ }: DesignEmptyStateProps): react_jsx_runtime0.JSX.Element;
35
+ //#endregion
36
+ export { DesignEmptyState, DesignEmptyStateProps };
37
+ //# sourceMappingURL=empty-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-state.d.ts","names":[],"sources":["../../../src/components/empty-state.tsx"],"mappings":";;;;KAKY,qBAAA;EACV,IAAA,GAAO,KAAA,CAAM,WAAA;EACb,KAAA;EACA,WAAA;EACA,QAAA,GAAW,KAAA,CAAM,SAAA;EACjB,SAAA;AAAA;;;;;;;;;;;;AAmBF;;;;;iBAAgB,gBAAA,CAAA;EACd,IAAA,EAAM,IAAA;EACN,KAAA;EACA,WAAA;EACA,QAAA;EACA;AAAA,GACC,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,50 @@
1
+ "use client";
2
+
3
+ import { cn } from "@hexclave/ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import React from "react";
6
+
7
+ //#region src/components/empty-state.tsx
8
+ /**
9
+ * Centered "no data" placeholder. Show this inside a `DataGrid` via the
10
+ * `emptyState` prop, inside a chart when a query returns zero rows, or
11
+ * inside a card when a section has nothing to display.
12
+ *
13
+ * ```tsx
14
+ * <DesignEmptyState
15
+ * icon={SearchIcon}
16
+ * title="No results"
17
+ * description="Try adjusting your filters."
18
+ * />
19
+ * ```
20
+ *
21
+ * Prefer this over a raw "No data" div — it handles spacing, typography,
22
+ * and the optional icon for you. `icon` is a component type, not a rendered node.
23
+ */
24
+ function DesignEmptyState({ icon: Icon, title = "No data available", description, children, className }) {
25
+ return /* @__PURE__ */ jsxs("div", {
26
+ className: cn("flex flex-col items-center justify-center py-12 px-6 text-center", className),
27
+ children: [
28
+ Icon && /* @__PURE__ */ jsx("div", {
29
+ className: "mb-4",
30
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-10 w-10 text-muted-foreground/30" })
31
+ }),
32
+ /* @__PURE__ */ jsx("h3", {
33
+ className: "text-sm font-medium text-foreground",
34
+ children: title
35
+ }),
36
+ description && /* @__PURE__ */ jsx("p", {
37
+ className: "mt-1 text-xs text-muted-foreground max-w-[280px]",
38
+ children: description
39
+ }),
40
+ children && /* @__PURE__ */ jsx("div", {
41
+ className: "mt-4",
42
+ children
43
+ })
44
+ ]
45
+ });
46
+ }
47
+
48
+ //#endregion
49
+ export { DesignEmptyState };
50
+ //# sourceMappingURL=empty-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-state.js","names":[],"sources":["../../../src/components/empty-state.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\nimport React from \"react\";\n\nexport type DesignEmptyStateProps = {\n icon?: React.ElementType,\n title?: string,\n description?: string,\n children?: React.ReactNode,\n className?: string,\n};\n\n/**\n * Centered \"no data\" placeholder. Show this inside a `DataGrid` via the\n * `emptyState` prop, inside a chart when a query returns zero rows, or\n * inside a card when a section has nothing to display.\n *\n * ```tsx\n * <DesignEmptyState\n * icon={SearchIcon}\n * title=\"No results\"\n * description=\"Try adjusting your filters.\"\n * />\n * ```\n *\n * Prefer this over a raw \"No data\" div — it handles spacing, typography,\n * and the optional icon for you. `icon` is a component type, not a rendered node.\n */\nexport function DesignEmptyState({\n icon: Icon,\n title = \"No data available\",\n description,\n children,\n className,\n}: DesignEmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-12 px-6 text-center\",\n className\n )}\n >\n {Icon && (\n <div className=\"mb-4\">\n <Icon className=\"h-10 w-10 text-muted-foreground/30\" />\n </div>\n )}\n <h3 className=\"text-sm font-medium text-foreground\">\n {title}\n </h3>\n {description && (\n <p className=\"mt-1 text-xs text-muted-foreground max-w-[280px]\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-4\">\n {children}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,iBAAiB,EAC/B,MAAM,MACN,QAAQ,qBACR,aACA,UACA,aACwB;AACxB,QACE,qBAAC;EACC,WAAW,GACT,oEACA,UACD;;GAEA,QACC,oBAAC;IAAI,WAAU;cACb,oBAAC,QAAK,WAAU,uCAAuC;KACnD;GAER,oBAAC;IAAG,WAAU;cACX;KACE;GACJ,eACC,oBAAC;IAAE,WAAU;cACV;KACC;GAEL,YACC,oBAAC;IAAI,WAAU;IACZ;KACG;;GAEJ"}
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+
3
+ //#region src/components/input.d.ts
4
+ type DesignInputProps = {
5
+ prefixItem?: React.ReactNode;
6
+ leadingIcon?: React.ReactNode;
7
+ size?: "sm" | "md" | "lg";
8
+ } & Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">;
9
+ declare const DesignInput: React.FC<{
10
+ prefixItem?: React.ReactNode;
11
+ leadingIcon?: React.ReactNode;
12
+ size?: "sm" | "md" | "lg";
13
+ } & Omit<React.InputHTMLAttributes<HTMLInputElement>, "size"> & {
14
+ ref?: React.Ref<HTMLInputElement> | undefined;
15
+ }>;
16
+ //#endregion
17
+ export { DesignInput, DesignInputProps };
18
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","names":[],"sources":["../../../src/components/input.tsx"],"mappings":";;;KAOY,gBAAA;EACV,UAAA,GAAa,KAAA,CAAM,SAAA;EACnB,WAAA,GAAc,KAAA,CAAM,SAAA;EACpB,IAAA;AAAA,IACE,IAAA,CAAK,KAAA,CAAM,mBAAA,CAAoB,gBAAA;AAAA,cAEtB,WAAA,EAAW,KAAA,CAAA,EAAA;eALT,KAAA,CAAM,SAAA;gBACL,KAAA,CAAM,SAAA"}
@@ -0,0 +1,50 @@
1
+ "use client";
2
+
3
+ import { cn } from "@hexclave/ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { forwardRefIfNeeded } from "@hexclave/shared/dist/utils/react";
6
+ import React from "react";
7
+
8
+ //#region src/components/input.tsx
9
+ const DesignInput = forwardRefIfNeeded(({ className, type, prefixItem, leadingIcon, size = "md", ...props }, ref) => {
10
+ const sizeClasses = size === "sm" ? "h-7 px-2 text-xs" : size === "lg" ? "h-10 px-4 text-sm" : "h-9 px-3 text-sm";
11
+ const baseClasses = cn("stack-scope flex w-full rounded-xl border border-black/[0.08] dark:border-white/[0.06] bg-white/80 dark:bg-foreground/[0.03] shadow-sm ring-1 ring-black/[0.08] dark:ring-white/[0.06]", "file:border-0 file:bg-transparent file:text-sm file:font-medium", "placeholder:text-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-foreground/[0.1]", "disabled:cursor-not-allowed disabled:opacity-50", "transition-all duration-150 hover:transition-none hover:bg-white dark:hover:bg-foreground/[0.06]", sizeClasses);
12
+ if (prefixItem) return /* @__PURE__ */ jsxs("div", {
13
+ className: "flex flex-row items-center flex-1 rounded-xl border border-black/[0.08] dark:border-white/[0.06] bg-white/80 dark:bg-foreground/[0.03] shadow-sm ring-1 ring-black/[0.08] dark:ring-white/[0.06] overflow-hidden transition-all duration-150 hover:transition-none hover:bg-white dark:hover:bg-foreground/[0.06] focus-within:ring-1 focus-within:ring-foreground/[0.1]",
14
+ children: [/* @__PURE__ */ jsx("div", {
15
+ className: cn("flex self-stretch items-center justify-center select-none text-muted-foreground/70 border-r border-black/[0.06] dark:border-white/[0.06] bg-black/[0.03] dark:bg-white/[0.02]", size === "sm" ? "px-2.5 text-xs" : size === "lg" ? "px-3.5 text-sm" : "px-3 text-sm"),
16
+ children: prefixItem
17
+ }), /* @__PURE__ */ jsx("input", {
18
+ type,
19
+ className: cn("stack-scope flex w-full bg-transparent", "file:border-0 file:bg-transparent file:text-sm file:font-medium", "placeholder:text-muted-foreground/50 focus-visible:outline-none", "disabled:cursor-not-allowed disabled:opacity-50", sizeClasses, "rounded-none border-0 shadow-none ring-0 focus-visible:ring-0", className),
20
+ ref,
21
+ ...props
22
+ })]
23
+ });
24
+ if (leadingIcon) return /* @__PURE__ */ jsxs("div", {
25
+ className: "relative flex flex-row items-center flex-1",
26
+ children: [/* @__PURE__ */ jsx("div", {
27
+ className: "pointer-events-none absolute left-2.5 flex items-center text-muted-foreground",
28
+ children: leadingIcon
29
+ }), /* @__PURE__ */ jsx("input", {
30
+ type,
31
+ className: cn(baseClasses, "pl-8", className),
32
+ ref,
33
+ ...props
34
+ })]
35
+ });
36
+ return /* @__PURE__ */ jsx("div", {
37
+ className: "flex flex-row items-center flex-1",
38
+ children: /* @__PURE__ */ jsx("input", {
39
+ type,
40
+ className: cn(baseClasses, className),
41
+ ref,
42
+ ...props
43
+ })
44
+ });
45
+ });
46
+ DesignInput.displayName = "DesignInput";
47
+
48
+ //#endregion
49
+ export { DesignInput };
50
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","names":[],"sources":["../../../src/components/input.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRefIfNeeded } from \"@stackframe/stack-shared/dist/utils/react\";\nimport React from \"react\";\n\nimport { cn } from \"@stackframe/stack-ui\";\n\nexport type DesignInputProps = {\n prefixItem?: React.ReactNode,\n leadingIcon?: React.ReactNode,\n size?: \"sm\" | \"md\" | \"lg\",\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">;\n\nexport const DesignInput = forwardRefIfNeeded<HTMLInputElement, DesignInputProps>(\n ({ className, type, prefixItem, leadingIcon, size = \"md\", ...props }, ref) => {\n const sizeClasses = size === \"sm\"\n ? \"h-7 px-2 text-xs\"\n : size === \"lg\"\n ? \"h-10 px-4 text-sm\"\n : \"h-9 px-3 text-sm\";\n const baseClasses = cn(\n \"stack-scope flex w-full rounded-xl border border-black/[0.08] dark:border-white/[0.06] bg-white/80 dark:bg-foreground/[0.03] shadow-sm ring-1 ring-black/[0.08] dark:ring-white/[0.06]\",\n \"file:border-0 file:bg-transparent file:text-sm file:font-medium\",\n \"placeholder:text-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-foreground/[0.1]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"transition-all duration-150 hover:transition-none hover:bg-white dark:hover:bg-foreground/[0.06]\",\n sizeClasses\n );\n\n if (prefixItem) {\n return (\n <div className=\"flex flex-row items-center flex-1 rounded-xl border border-black/[0.08] dark:border-white/[0.06] bg-white/80 dark:bg-foreground/[0.03] shadow-sm ring-1 ring-black/[0.08] dark:ring-white/[0.06] overflow-hidden transition-all duration-150 hover:transition-none hover:bg-white dark:hover:bg-foreground/[0.06] focus-within:ring-1 focus-within:ring-foreground/[0.1]\">\n <div className={cn(\n \"flex self-stretch items-center justify-center select-none text-muted-foreground/70 border-r border-black/[0.06] dark:border-white/[0.06] bg-black/[0.03] dark:bg-white/[0.02]\",\n size === \"sm\" ? \"px-2.5 text-xs\" : size === \"lg\" ? \"px-3.5 text-sm\" : \"px-3 text-sm\"\n )}>\n {prefixItem}\n </div>\n <input\n type={type}\n className={cn(\n \"stack-scope flex w-full bg-transparent\",\n \"file:border-0 file:bg-transparent file:text-sm file:font-medium\",\n \"placeholder:text-muted-foreground/50 focus-visible:outline-none\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n sizeClasses,\n \"rounded-none border-0 shadow-none ring-0 focus-visible:ring-0\",\n className\n )}\n ref={ref}\n {...props}\n />\n </div>\n );\n }\n\n if (leadingIcon) {\n return (\n <div className=\"relative flex flex-row items-center flex-1\">\n <div className=\"pointer-events-none absolute left-2.5 flex items-center text-muted-foreground\">\n {leadingIcon}\n </div>\n <input\n type={type}\n className={cn(baseClasses, \"pl-8\", className)}\n ref={ref}\n {...props}\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-row items-center flex-1\">\n <input\n type={type}\n className={cn(baseClasses, className)}\n ref={ref}\n {...props}\n />\n </div>\n );\n }\n);\nDesignInput.displayName = \"DesignInput\";\n"],"mappings":";;;;;;;;AAaA,MAAa,cAAc,oBACxB,EAAE,WAAW,MAAM,YAAY,aAAa,OAAO,MAAM,GAAG,SAAS,QAAQ;CAC5E,MAAM,cAAc,SAAS,OACzB,qBACA,SAAS,OACP,sBACA;CACN,MAAM,cAAc,GAClB,0LACA,mEACA,4HACA,mDACA,oGACA,YACD;AAED,KAAI,WACF,QACE,qBAAC;EAAI,WAAU;aACb,oBAAC;GAAI,WAAW,GACd,iLACA,SAAS,OAAO,mBAAmB,SAAS,OAAO,mBAAmB,eACvE;aACE;IACG,EACN,oBAAC;GACO;GACN,WAAW,GACT,0CACA,mEACA,mEACA,mDACA,aACA,iEACA,UACD;GACI;GACL,GAAI;IACJ;GACE;AAIV,KAAI,YACF,QACE,qBAAC;EAAI,WAAU;aACb,oBAAC;GAAI,WAAU;aACZ;IACG,EACN,oBAAC;GACO;GACN,WAAW,GAAG,aAAa,QAAQ,UAAU;GACxC;GACL,GAAI;IACJ;GACE;AAIV,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GACO;GACN,WAAW,GAAG,aAAa,UAAU;GAChC;GACL,GAAI;IACJ;GACE;EAGX;AACD,YAAY,cAAc"}
@@ -0,0 +1,55 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import React from "react";
3
+
4
+ //#region src/components/metric-card.d.ts
5
+ type DesignMetricCardGradient = "blue" | "cyan" | "purple" | "green" | "orange" | "default";
6
+ type DesignMetricCardTrend = {
7
+ value: number;
8
+ direction: "up" | "down";
9
+ label?: string;
10
+ };
11
+ type DesignMetricCardProps = {
12
+ label: string;
13
+ value: string | number;
14
+ description?: string;
15
+ trend?: DesignMetricCardTrend;
16
+ icon?: React.ElementType;
17
+ gradient?: DesignMetricCardGradient;
18
+ } & Omit<React.ComponentProps<"div">, "children">;
19
+ /**
20
+ * KPI card for big-number metrics (users, revenue, signups, etc.).
21
+ * Use this instead of a plain `DesignCard` when the value is the focal point.
22
+ *
23
+ * ```tsx
24
+ * <DesignMetricCard
25
+ * label="Total Users"
26
+ * value="1,234"
27
+ * description="+12% from last month"
28
+ * trend={{ direction: "up", value: 12, label: "vs. last period" }}
29
+ * icon={UsersIcon}
30
+ * gradient="blue"
31
+ * />
32
+ * ```
33
+ *
34
+ * Notes:
35
+ * - `label` is the short caption (NOT `title`).
36
+ * - `value` can be a pre-formatted string ("1,234") or a number — prefer
37
+ * strings so you control the format.
38
+ * - `description` is the subline (NOT `subtitle`).
39
+ * - `trend.value` is a NUMBER, not a pre-formatted "12%" string. The card
40
+ * renders the arrow and formatting.
41
+ * - `icon` is a component type (e.g. `UsersIcon`), not a rendered node.
42
+ */
43
+ declare function DesignMetricCard({
44
+ label,
45
+ value,
46
+ description,
47
+ trend,
48
+ icon: Icon,
49
+ gradient,
50
+ className,
51
+ ...props
52
+ }: DesignMetricCardProps): react_jsx_runtime0.JSX.Element;
53
+ //#endregion
54
+ export { DesignMetricCard, DesignMetricCardProps, DesignMetricCardTrend };
55
+ //# sourceMappingURL=metric-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-card.d.ts","names":[],"sources":["../../../src/components/metric-card.tsx"],"mappings":";;;;KAKK,wBAAA;AAAA,KAWO,qBAAA;EACV,KAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,KAGU,qBAAA;EACV,KAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA,GAAQ,qBAAA;EACR,IAAA,GAAO,KAAA,CAAM,WAAA;EACb,QAAA,GAAW,wBAAA;AAAA,IACT,IAAA,CAAK,KAAA,CAAM,cAAA;;;;AAPf;;;;;;;;;;;;;;;;;;;;;iBAiCgB,gBAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;EACA,IAAA,EAAM,IAAA;EACN,QAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,109 @@
1
+ "use client";
2
+
3
+ import { cn } from "@hexclave/ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import React from "react";
6
+
7
+ //#region src/components/metric-card.tsx
8
+ const hoverTintClasses = new Map([
9
+ ["blue", "group-hover:bg-blue-500/[0.03]"],
10
+ ["cyan", "group-hover:bg-cyan-500/[0.03]"],
11
+ ["purple", "group-hover:bg-purple-500/[0.03]"],
12
+ ["green", "group-hover:bg-emerald-500/[0.03]"],
13
+ ["orange", "group-hover:bg-orange-500/[0.03]"],
14
+ ["default", "group-hover:bg-slate-500/[0.02]"]
15
+ ]);
16
+ /**
17
+ * KPI card for big-number metrics (users, revenue, signups, etc.).
18
+ * Use this instead of a plain `DesignCard` when the value is the focal point.
19
+ *
20
+ * ```tsx
21
+ * <DesignMetricCard
22
+ * label="Total Users"
23
+ * value="1,234"
24
+ * description="+12% from last month"
25
+ * trend={{ direction: "up", value: 12, label: "vs. last period" }}
26
+ * icon={UsersIcon}
27
+ * gradient="blue"
28
+ * />
29
+ * ```
30
+ *
31
+ * Notes:
32
+ * - `label` is the short caption (NOT `title`).
33
+ * - `value` can be a pre-formatted string ("1,234") or a number — prefer
34
+ * strings so you control the format.
35
+ * - `description` is the subline (NOT `subtitle`).
36
+ * - `trend.value` is a NUMBER, not a pre-formatted "12%" string. The card
37
+ * renders the arrow and formatting.
38
+ * - `icon` is a component type (e.g. `UsersIcon`), not a rendered node.
39
+ */
40
+ function DesignMetricCard({ label, value, description, trend, icon: Icon, gradient = "default", className, ...props }) {
41
+ const hoverTintClass = hoverTintClasses.get(gradient) ?? "group-hover:bg-slate-500/[0.02]";
42
+ return /* @__PURE__ */ jsxs("div", {
43
+ className: cn("group relative rounded-2xl bg-white/90 dark:bg-background/60 backdrop-blur-xl transition-all duration-150 hover:transition-none overflow-hidden", "ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]", "shadow-sm hover:shadow-md", className),
44
+ ...props,
45
+ children: [
46
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl" }),
47
+ /* @__PURE__ */ jsx("div", { className: cn("absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl", hoverTintClass) }),
48
+ /* @__PURE__ */ jsx("div", {
49
+ className: "relative p-5",
50
+ children: /* @__PURE__ */ jsx("div", {
51
+ className: "flex items-start justify-between gap-3",
52
+ children: /* @__PURE__ */ jsxs("div", {
53
+ className: "flex-1 min-w-0",
54
+ children: [
55
+ /* @__PURE__ */ jsxs("div", {
56
+ className: "flex items-center gap-2",
57
+ children: [Icon && /* @__PURE__ */ jsx("div", {
58
+ className: "p-1.5 rounded-lg bg-foreground/[0.06] dark:bg-foreground/[0.04]",
59
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5 text-foreground/70 dark:text-muted-foreground" })
60
+ }), /* @__PURE__ */ jsx("span", {
61
+ className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider",
62
+ children: label
63
+ })]
64
+ }),
65
+ /* @__PURE__ */ jsxs("div", {
66
+ className: "mt-3 flex items-baseline gap-2",
67
+ children: [/* @__PURE__ */ jsx("span", {
68
+ className: "text-3xl font-bold tabular-nums text-foreground",
69
+ children: typeof value === "number" ? value.toLocaleString() : value
70
+ }), trend && /* @__PURE__ */ jsxs("span", {
71
+ className: cn("inline-flex items-center gap-0.5 text-xs font-medium", trend.direction === "up" ? "text-emerald-600 dark:text-emerald-400" : "text-red-600 dark:text-red-400"),
72
+ children: [
73
+ /* @__PURE__ */ jsx("svg", {
74
+ className: cn("h-3 w-3", trend.direction === "down" && "rotate-180"),
75
+ viewBox: "0 0 12 12",
76
+ fill: "none",
77
+ xmlns: "http://www.w3.org/2000/svg",
78
+ children: /* @__PURE__ */ jsx("path", {
79
+ d: "M6 2.5V9.5M6 2.5L3 5.5M6 2.5L9 5.5",
80
+ stroke: "currentColor",
81
+ strokeWidth: "1.5",
82
+ strokeLinecap: "round",
83
+ strokeLinejoin: "round"
84
+ })
85
+ }),
86
+ trend.value,
87
+ "%",
88
+ trend.label && /* @__PURE__ */ jsx("span", {
89
+ className: "text-muted-foreground ml-0.5",
90
+ children: trend.label
91
+ })
92
+ ]
93
+ })]
94
+ }),
95
+ description && /* @__PURE__ */ jsx("p", {
96
+ className: "mt-1 text-xs text-muted-foreground",
97
+ children: description
98
+ })
99
+ ]
100
+ })
101
+ })
102
+ })
103
+ ]
104
+ });
105
+ }
106
+
107
+ //#endregion
108
+ export { DesignMetricCard };
109
+ //# sourceMappingURL=metric-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-card.js","names":[],"sources":["../../../src/components/metric-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\nimport React from \"react\";\n\ntype DesignMetricCardGradient = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"default\";\n\nconst hoverTintClasses = new Map<DesignMetricCardGradient, string>([\n [\"blue\", \"group-hover:bg-blue-500/[0.03]\"],\n [\"cyan\", \"group-hover:bg-cyan-500/[0.03]\"],\n [\"purple\", \"group-hover:bg-purple-500/[0.03]\"],\n [\"green\", \"group-hover:bg-emerald-500/[0.03]\"],\n [\"orange\", \"group-hover:bg-orange-500/[0.03]\"],\n [\"default\", \"group-hover:bg-slate-500/[0.02]\"],\n]);\n\nexport type DesignMetricCardTrend = {\n value: number,\n direction: \"up\" | \"down\",\n label?: string,\n};\n\nexport type DesignMetricCardProps = {\n label: string,\n value: string | number,\n description?: string,\n trend?: DesignMetricCardTrend,\n icon?: React.ElementType,\n gradient?: DesignMetricCardGradient,\n} & Omit<React.ComponentProps<\"div\">, \"children\">;\n\n/**\n * KPI card for big-number metrics (users, revenue, signups, etc.).\n * Use this instead of a plain `DesignCard` when the value is the focal point.\n *\n * ```tsx\n * <DesignMetricCard\n * label=\"Total Users\"\n * value=\"1,234\"\n * description=\"+12% from last month\"\n * trend={{ direction: \"up\", value: 12, label: \"vs. last period\" }}\n * icon={UsersIcon}\n * gradient=\"blue\"\n * />\n * ```\n *\n * Notes:\n * - `label` is the short caption (NOT `title`).\n * - `value` can be a pre-formatted string (\"1,234\") or a number — prefer\n * strings so you control the format.\n * - `description` is the subline (NOT `subtitle`).\n * - `trend.value` is a NUMBER, not a pre-formatted \"12%\" string. The card\n * renders the arrow and formatting.\n * - `icon` is a component type (e.g. `UsersIcon`), not a rendered node.\n */\nexport function DesignMetricCard({\n label,\n value,\n description,\n trend,\n icon: Icon,\n gradient = \"default\",\n className,\n ...props\n}: DesignMetricCardProps) {\n const hoverTintClass = hoverTintClasses.get(gradient) ?? \"group-hover:bg-slate-500/[0.02]\";\n\n return (\n <div\n className={cn(\n \"group relative rounded-2xl bg-white/90 dark:bg-background/60 backdrop-blur-xl transition-all duration-150 hover:transition-none overflow-hidden\",\n \"ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]\",\n \"shadow-sm hover:shadow-md\",\n className\n )}\n {...props}\n >\n <div className=\"absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl\" />\n <div\n className={cn(\n \"absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl\",\n hoverTintClass\n )}\n />\n <div className=\"relative p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {Icon && (\n <div className=\"p-1.5 rounded-lg bg-foreground/[0.06] dark:bg-foreground/[0.04]\">\n <Icon className=\"h-3.5 w-3.5 text-foreground/70 dark:text-muted-foreground\" />\n </div>\n )}\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {label}\n </span>\n </div>\n <div className=\"mt-3 flex items-baseline gap-2\">\n <span className=\"text-3xl font-bold tabular-nums text-foreground\">\n {typeof value === \"number\" ? value.toLocaleString() : value}\n </span>\n {trend && (\n <span\n className={cn(\n \"inline-flex items-center gap-0.5 text-xs font-medium\",\n trend.direction === \"up\"\n ? \"text-emerald-600 dark:text-emerald-400\"\n : \"text-red-600 dark:text-red-400\"\n )}\n >\n <svg\n className={cn(\"h-3 w-3\", trend.direction === \"down\" && \"rotate-180\")}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 2.5V9.5M6 2.5L3 5.5M6 2.5L9 5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {trend.value}%\n {trend.label && (\n <span className=\"text-muted-foreground ml-0.5\">{trend.label}</span>\n )}\n </span>\n )}\n </div>\n {description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAOA,MAAM,mBAAmB,IAAI,IAAsC;CACjE,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,SAAS,oCAAoC;CAC9C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,WAAW,kCAAkC;CAC/C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAyCF,SAAgB,iBAAiB,EAC/B,OACA,OACA,aACA,OACA,MAAM,MACN,WAAW,WACX,WACA,GAAG,SACqB;CACxB,MAAM,iBAAiB,iBAAiB,IAAI,SAAS,IAAI;AAEzD,QACE,qBAAC;EACC,WAAW,GACT,mJACA,sGACA,6BACA,UACD;EACD,GAAI;;GAEJ,oBAAC,SAAI,WAAU,yIAAyI;GACxJ,oBAAC,SACC,WAAW,GACT,+GACA,eACD,GACD;GACF,oBAAC;IAAI,WAAU;cACb,oBAAC;KAAI,WAAU;eACb,qBAAC;MAAI,WAAU;;OACb,qBAAC;QAAI,WAAU;mBACZ,QACC,oBAAC;SAAI,WAAU;mBACb,oBAAC,QAAK,WAAU,8DAA8D;UAC1E,EAER,oBAAC;SAAK,WAAU;mBACb;UACI;SACH;OACN,qBAAC;QAAI,WAAU;mBACb,oBAAC;SAAK,WAAU;mBACb,OAAO,UAAU,WAAW,MAAM,gBAAgB,GAAG;UACjD,EACN,SACC,qBAAC;SACC,WAAW,GACT,wDACA,MAAM,cAAc,OAChB,2CACA,iCACL;;UAED,oBAAC;WACC,WAAW,GAAG,WAAW,MAAM,cAAc,UAAU,aAAa;WACpE,SAAQ;WACR,MAAK;WACL,OAAM;qBAEN,oBAAC;YACC,GAAE;YACF,QAAO;YACP,aAAY;YACZ,eAAc;YACd,gBAAe;aACf;YACE;UACL,MAAM;UAAM;UACZ,MAAM,SACL,oBAAC;WAAK,WAAU;qBAAgC,MAAM;YAAa;;UAEhE;SAEL;OACL,eACC,oBAAC;QAAE,WAAU;kBACV;SACC;;OAEF;MACF;KACF;;GACF"}