@invergent/ui-sdk 0.0.0-stage → 2.19.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 (332) hide show
  1. package/README.md +62 -2
  2. package/dist/accordion.cjs +97 -0
  3. package/dist/accordion.cjs.map +1 -0
  4. package/dist/accordion.d.cts +10 -0
  5. package/dist/accordion.d.ts +10 -0
  6. package/dist/accordion.js +92 -0
  7. package/dist/accordion.js.map +1 -0
  8. package/dist/alert.cjs +82 -0
  9. package/dist/alert.cjs.map +1 -0
  10. package/dist/alert.d.cts +14 -0
  11. package/dist/alert.d.ts +14 -0
  12. package/dist/alert.js +77 -0
  13. package/dist/alert.js.map +1 -0
  14. package/dist/avatar.cjs +110 -0
  15. package/dist/avatar.cjs.map +1 -0
  16. package/dist/avatar.d.cts +14 -0
  17. package/dist/avatar.d.ts +14 -0
  18. package/dist/avatar.js +103 -0
  19. package/dist/avatar.js.map +1 -0
  20. package/dist/badge.cjs +47 -0
  21. package/dist/badge.cjs.map +1 -0
  22. package/dist/badge.d.cts +13 -0
  23. package/dist/badge.d.ts +13 -0
  24. package/dist/badge.js +44 -0
  25. package/dist/badge.js.map +1 -0
  26. package/dist/brand-beam.cjs +2303 -0
  27. package/dist/brand-beam.cjs.map +1 -0
  28. package/dist/brand-beam.d.cts +36 -0
  29. package/dist/brand-beam.d.ts +36 -0
  30. package/dist/brand-beam.js +2301 -0
  31. package/dist/brand-beam.js.map +1 -0
  32. package/dist/button.cjs +17 -0
  33. package/dist/button.cjs.map +1 -0
  34. package/dist/button.d.cts +14 -0
  35. package/dist/button.d.ts +14 -0
  36. package/dist/button.js +4 -0
  37. package/dist/button.js.map +1 -0
  38. package/dist/card.cjs +109 -0
  39. package/dist/card.cjs.map +1 -0
  40. package/dist/card.d.cts +14 -0
  41. package/dist/card.d.ts +14 -0
  42. package/dist/card.js +101 -0
  43. package/dist/card.js.map +1 -0
  44. package/dist/chart.cjs +275 -0
  45. package/dist/chart.cjs.map +1 -0
  46. package/dist/chart.d.cts +47 -0
  47. package/dist/chart.d.ts +47 -0
  48. package/dist/chart.js +247 -0
  49. package/dist/chart.js.map +1 -0
  50. package/dist/checkbox.cjs +41 -0
  51. package/dist/checkbox.cjs.map +1 -0
  52. package/dist/checkbox.d.cts +7 -0
  53. package/dist/checkbox.d.ts +7 -0
  54. package/dist/checkbox.js +39 -0
  55. package/dist/checkbox.js.map +1 -0
  56. package/dist/chip.cjs +92 -0
  57. package/dist/chip.cjs.map +1 -0
  58. package/dist/chip.d.cts +33 -0
  59. package/dist/chip.d.ts +33 -0
  60. package/dist/chip.js +86 -0
  61. package/dist/chip.js.map +1 -0
  62. package/dist/choice-card.cjs +127 -0
  63. package/dist/choice-card.cjs.map +1 -0
  64. package/dist/choice-card.d.cts +20 -0
  65. package/dist/choice-card.d.ts +20 -0
  66. package/dist/choice-card.js +124 -0
  67. package/dist/choice-card.js.map +1 -0
  68. package/dist/chunk-2UHRDVPT.cjs +183 -0
  69. package/dist/chunk-2UHRDVPT.cjs.map +1 -0
  70. package/dist/chunk-5CRE35VX.js +20 -0
  71. package/dist/chunk-5CRE35VX.js.map +1 -0
  72. package/dist/chunk-6ARYCL4L.cjs +30 -0
  73. package/dist/chunk-6ARYCL4L.cjs.map +1 -0
  74. package/dist/chunk-6JCVTRUK.js +21 -0
  75. package/dist/chunk-6JCVTRUK.js.map +1 -0
  76. package/dist/chunk-6YHDDRIM.cjs +13 -0
  77. package/dist/chunk-6YHDDRIM.cjs.map +1 -0
  78. package/dist/chunk-A44JJ6NH.js +58 -0
  79. package/dist/chunk-A44JJ6NH.js.map +1 -0
  80. package/dist/chunk-CPAFEXKR.js +63 -0
  81. package/dist/chunk-CPAFEXKR.js.map +1 -0
  82. package/dist/chunk-CTIEUG5L.js +28 -0
  83. package/dist/chunk-CTIEUG5L.js.map +1 -0
  84. package/dist/chunk-DSDDDYG3.cjs +60 -0
  85. package/dist/chunk-DSDDDYG3.cjs.map +1 -0
  86. package/dist/chunk-IB7LTHEQ.js +55 -0
  87. package/dist/chunk-IB7LTHEQ.js.map +1 -0
  88. package/dist/chunk-ID7MWMJO.cjs +162 -0
  89. package/dist/chunk-ID7MWMJO.cjs.map +1 -0
  90. package/dist/chunk-IVMZANP7.cjs +67 -0
  91. package/dist/chunk-IVMZANP7.cjs.map +1 -0
  92. package/dist/chunk-L73QIINW.js +157 -0
  93. package/dist/chunk-L73QIINW.js.map +1 -0
  94. package/dist/chunk-LZGII7SX.js +11 -0
  95. package/dist/chunk-LZGII7SX.js.map +1 -0
  96. package/dist/chunk-M677T75H.js +24 -0
  97. package/dist/chunk-M677T75H.js.map +1 -0
  98. package/dist/chunk-OAVCB3MR.cjs +26 -0
  99. package/dist/chunk-OAVCB3MR.cjs.map +1 -0
  100. package/dist/chunk-RVX6SN4U.cjs +23 -0
  101. package/dist/chunk-RVX6SN4U.cjs.map +1 -0
  102. package/dist/chunk-T74Z3WTK.js +151 -0
  103. package/dist/chunk-T74Z3WTK.js.map +1 -0
  104. package/dist/chunk-UOUXW63J.cjs +22 -0
  105. package/dist/chunk-UOUXW63J.cjs.map +1 -0
  106. package/dist/chunk-VBICNC43.cjs +61 -0
  107. package/dist/chunk-VBICNC43.cjs.map +1 -0
  108. package/dist/collapsible-header.cjs +66 -0
  109. package/dist/collapsible-header.cjs.map +1 -0
  110. package/dist/collapsible-header.d.cts +15 -0
  111. package/dist/collapsible-header.d.ts +15 -0
  112. package/dist/collapsible-header.js +63 -0
  113. package/dist/collapsible-header.js.map +1 -0
  114. package/dist/collapsible.cjs +38 -0
  115. package/dist/collapsible.cjs.map +1 -0
  116. package/dist/collapsible.d.cts +8 -0
  117. package/dist/collapsible.d.ts +8 -0
  118. package/dist/collapsible.js +34 -0
  119. package/dist/collapsible.js.map +1 -0
  120. package/dist/color-picker.cjs +60 -0
  121. package/dist/color-picker.cjs.map +1 -0
  122. package/dist/color-picker.d.cts +12 -0
  123. package/dist/color-picker.d.ts +12 -0
  124. package/dist/color-picker.js +57 -0
  125. package/dist/color-picker.js.map +1 -0
  126. package/dist/confirm-dialog.cjs +72 -0
  127. package/dist/confirm-dialog.cjs.map +1 -0
  128. package/dist/confirm-dialog.d.cts +19 -0
  129. package/dist/confirm-dialog.d.ts +19 -0
  130. package/dist/confirm-dialog.js +70 -0
  131. package/dist/confirm-dialog.js.map +1 -0
  132. package/dist/control-styles.cjs +16 -0
  133. package/dist/control-styles.cjs.map +1 -0
  134. package/dist/control-styles.d.cts +7 -0
  135. package/dist/control-styles.d.ts +7 -0
  136. package/dist/control-styles.js +10 -0
  137. package/dist/control-styles.js.map +1 -0
  138. package/dist/dialog.cjs +50 -0
  139. package/dist/dialog.cjs.map +1 -0
  140. package/dist/dialog.d.cts +20 -0
  141. package/dist/dialog.d.ts +20 -0
  142. package/dist/dialog.js +5 -0
  143. package/dist/dialog.js.map +1 -0
  144. package/dist/dropdown-menu.cjs +265 -0
  145. package/dist/dropdown-menu.cjs.map +1 -0
  146. package/dist/dropdown-menu.d.cts +32 -0
  147. package/dist/dropdown-menu.d.ts +32 -0
  148. package/dist/dropdown-menu.js +249 -0
  149. package/dist/dropdown-menu.js.map +1 -0
  150. package/dist/empty-state.cjs +50 -0
  151. package/dist/empty-state.cjs.map +1 -0
  152. package/dist/empty-state.d.cts +23 -0
  153. package/dist/empty-state.d.ts +23 -0
  154. package/dist/empty-state.js +47 -0
  155. package/dist/empty-state.js.map +1 -0
  156. package/dist/field.cjs +221 -0
  157. package/dist/field.cjs.map +1 -0
  158. package/dist/field.d.cts +30 -0
  159. package/dist/field.d.ts +30 -0
  160. package/dist/field.js +210 -0
  161. package/dist/field.js.map +1 -0
  162. package/dist/input-group.cjs +148 -0
  163. package/dist/input-group.cjs.map +1 -0
  164. package/dist/input-group.d.cts +20 -0
  165. package/dist/input-group.d.ts +20 -0
  166. package/dist/input-group.js +141 -0
  167. package/dist/input-group.js.map +1 -0
  168. package/dist/input.cjs +13 -0
  169. package/dist/input.cjs.map +1 -0
  170. package/dist/input.d.cts +6 -0
  171. package/dist/input.d.ts +6 -0
  172. package/dist/input.js +4 -0
  173. package/dist/input.js.map +1 -0
  174. package/dist/label.cjs +13 -0
  175. package/dist/label.cjs.map +1 -0
  176. package/dist/label.d.cts +7 -0
  177. package/dist/label.d.ts +7 -0
  178. package/dist/label.js +4 -0
  179. package/dist/label.js.map +1 -0
  180. package/dist/lib/utils.cjs +12 -0
  181. package/dist/lib/utils.cjs.map +1 -0
  182. package/dist/lib/utils.d.cts +5 -0
  183. package/dist/lib/utils.d.ts +5 -0
  184. package/dist/lib/utils.js +3 -0
  185. package/dist/lib/utils.js.map +1 -0
  186. package/dist/list-row.cjs +188 -0
  187. package/dist/list-row.cjs.map +1 -0
  188. package/dist/list-row.d.cts +51 -0
  189. package/dist/list-row.d.ts +51 -0
  190. package/dist/list-row.js +164 -0
  191. package/dist/list-row.js.map +1 -0
  192. package/dist/pill-tabs.cjs +109 -0
  193. package/dist/pill-tabs.cjs.map +1 -0
  194. package/dist/pill-tabs.d.cts +24 -0
  195. package/dist/pill-tabs.d.ts +24 -0
  196. package/dist/pill-tabs.js +107 -0
  197. package/dist/pill-tabs.js.map +1 -0
  198. package/dist/popover.cjs +88 -0
  199. package/dist/popover.cjs.map +1 -0
  200. package/dist/popover.d.cts +13 -0
  201. package/dist/popover.d.ts +13 -0
  202. package/dist/popover.js +80 -0
  203. package/dist/popover.js.map +1 -0
  204. package/dist/progress-bar.cjs +28 -0
  205. package/dist/progress-bar.cjs.map +1 -0
  206. package/dist/progress-bar.d.cts +11 -0
  207. package/dist/progress-bar.d.ts +11 -0
  208. package/dist/progress-bar.js +26 -0
  209. package/dist/progress-bar.js.map +1 -0
  210. package/dist/scroll-area.cjs +63 -0
  211. package/dist/scroll-area.cjs.map +1 -0
  212. package/dist/scroll-area.d.cts +8 -0
  213. package/dist/scroll-area.d.ts +8 -0
  214. package/dist/scroll-area.js +60 -0
  215. package/dist/scroll-area.js.map +1 -0
  216. package/dist/section-label.cjs +30 -0
  217. package/dist/section-label.cjs.map +1 -0
  218. package/dist/section-label.d.cts +13 -0
  219. package/dist/section-label.d.ts +13 -0
  220. package/dist/section-label.js +28 -0
  221. package/dist/section-label.js.map +1 -0
  222. package/dist/segmented-control.cjs +75 -0
  223. package/dist/segmented-control.cjs.map +1 -0
  224. package/dist/segmented-control.d.cts +26 -0
  225. package/dist/segmented-control.d.ts +26 -0
  226. package/dist/segmented-control.js +53 -0
  227. package/dist/segmented-control.js.map +1 -0
  228. package/dist/select.cjs +193 -0
  229. package/dist/select.cjs.map +1 -0
  230. package/dist/select.d.cts +18 -0
  231. package/dist/select.d.ts +18 -0
  232. package/dist/select.js +182 -0
  233. package/dist/select.js.map +1 -0
  234. package/dist/separator.cjs +13 -0
  235. package/dist/separator.cjs.map +1 -0
  236. package/dist/separator.d.cts +7 -0
  237. package/dist/separator.d.ts +7 -0
  238. package/dist/separator.js +4 -0
  239. package/dist/separator.js.map +1 -0
  240. package/dist/sidebar.cjs +29 -0
  241. package/dist/sidebar.cjs.map +1 -0
  242. package/dist/sidebar.d.cts +58 -0
  243. package/dist/sidebar.d.ts +58 -0
  244. package/dist/sidebar.js +4 -0
  245. package/dist/sidebar.js.map +1 -0
  246. package/dist/skeleton.cjs +19 -0
  247. package/dist/skeleton.cjs.map +1 -0
  248. package/dist/skeleton.d.cts +5 -0
  249. package/dist/skeleton.d.ts +5 -0
  250. package/dist/skeleton.js +17 -0
  251. package/dist/skeleton.js.map +1 -0
  252. package/dist/sonner.cjs +40 -0
  253. package/dist/sonner.cjs.map +1 -0
  254. package/dist/sonner.d.cts +6 -0
  255. package/dist/sonner.d.ts +6 -0
  256. package/dist/sonner.js +38 -0
  257. package/dist/sonner.js.map +1 -0
  258. package/dist/sparkline.cjs +44 -0
  259. package/dist/sparkline.cjs.map +1 -0
  260. package/dist/sparkline.d.cts +12 -0
  261. package/dist/sparkline.d.ts +12 -0
  262. package/dist/sparkline.js +42 -0
  263. package/dist/sparkline.js.map +1 -0
  264. package/dist/spinner.cjs +13 -0
  265. package/dist/spinner.cjs.map +1 -0
  266. package/dist/spinner.d.cts +5 -0
  267. package/dist/spinner.d.ts +5 -0
  268. package/dist/spinner.js +11 -0
  269. package/dist/spinner.js.map +1 -0
  270. package/dist/stat-card.cjs +65 -0
  271. package/dist/stat-card.cjs.map +1 -0
  272. package/dist/stat-card.d.cts +22 -0
  273. package/dist/stat-card.d.ts +22 -0
  274. package/dist/stat-card.js +61 -0
  275. package/dist/stat-card.js.map +1 -0
  276. package/dist/status-dot.cjs +32 -0
  277. package/dist/status-dot.cjs.map +1 -0
  278. package/dist/status-dot.d.cts +11 -0
  279. package/dist/status-dot.d.ts +11 -0
  280. package/dist/status-dot.js +29 -0
  281. package/dist/status-dot.js.map +1 -0
  282. package/dist/switch.cjs +38 -0
  283. package/dist/switch.cjs.map +1 -0
  284. package/dist/switch.d.cts +9 -0
  285. package/dist/switch.d.ts +9 -0
  286. package/dist/switch.js +36 -0
  287. package/dist/switch.js.map +1 -0
  288. package/dist/table.cjs +118 -0
  289. package/dist/table.cjs.map +1 -0
  290. package/dist/table.d.cts +13 -0
  291. package/dist/table.d.ts +13 -0
  292. package/dist/table.js +109 -0
  293. package/dist/table.js.map +1 -0
  294. package/dist/tabs.cjs +124 -0
  295. package/dist/tabs.cjs.map +1 -0
  296. package/dist/tabs.d.cts +15 -0
  297. package/dist/tabs.d.ts +15 -0
  298. package/dist/tabs.js +118 -0
  299. package/dist/tabs.js.map +1 -0
  300. package/dist/text-link.cjs +51 -0
  301. package/dist/text-link.cjs.map +1 -0
  302. package/dist/text-link.d.cts +15 -0
  303. package/dist/text-link.d.ts +15 -0
  304. package/dist/text-link.js +48 -0
  305. package/dist/text-link.js.map +1 -0
  306. package/dist/textarea.cjs +13 -0
  307. package/dist/textarea.cjs.map +1 -0
  308. package/dist/textarea.d.cts +6 -0
  309. package/dist/textarea.d.ts +6 -0
  310. package/dist/textarea.js +4 -0
  311. package/dist/textarea.js.map +1 -0
  312. package/dist/theme.css +109 -0
  313. package/dist/toggle-group.cjs +155 -0
  314. package/dist/toggle-group.cjs.map +1 -0
  315. package/dist/toggle-group.d.cts +31 -0
  316. package/dist/toggle-group.d.ts +31 -0
  317. package/dist/toggle-group.js +130 -0
  318. package/dist/toggle-group.js.map +1 -0
  319. package/dist/toggle.cjs +21 -0
  320. package/dist/toggle.cjs.map +1 -0
  321. package/dist/toggle.d.cts +23 -0
  322. package/dist/toggle.d.ts +23 -0
  323. package/dist/toggle.js +4 -0
  324. package/dist/toggle.js.map +1 -0
  325. package/dist/tokens.css +77 -0
  326. package/dist/tooltip.cjs +25 -0
  327. package/dist/tooltip.cjs.map +1 -0
  328. package/dist/tooltip.d.cts +10 -0
  329. package/dist/tooltip.d.ts +10 -0
  330. package/dist/tooltip.js +4 -0
  331. package/dist/tooltip.js.map +1 -0
  332. package/package.json +60 -4
@@ -0,0 +1,12 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface SparklineProps {
4
+ data: number[];
5
+ color?: string;
6
+ height?: number;
7
+ width?: number;
8
+ className?: string;
9
+ }
10
+ declare function Sparkline({ data, color, height, width, className, }: SparklineProps): react_jsx_runtime.JSX.Element;
11
+
12
+ export { Sparkline };
@@ -0,0 +1,42 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ // src/sparkline.tsx
4
+ function Sparkline({
5
+ data,
6
+ color = "var(--primary)",
7
+ height = 28,
8
+ width = 80,
9
+ className
10
+ }) {
11
+ const max = Math.max(...data);
12
+ const min = Math.min(...data);
13
+ const range = max - min || 1;
14
+ const points = data.map(
15
+ (v, i) => `${i / (data.length - 1) * width},${height - (v - min) / range * (height - 4) - 2}`
16
+ ).join(" ");
17
+ return /* @__PURE__ */ jsx(
18
+ "svg",
19
+ {
20
+ viewBox: `0 0 ${width} ${height}`,
21
+ width: className ? void 0 : width,
22
+ height,
23
+ preserveAspectRatio: "none",
24
+ className: className ?? "block",
25
+ children: /* @__PURE__ */ jsx(
26
+ "polyline",
27
+ {
28
+ points,
29
+ fill: "none",
30
+ stroke: color,
31
+ strokeWidth: "1.5",
32
+ strokeLinecap: "round",
33
+ strokeLinejoin: "round"
34
+ }
35
+ )
36
+ }
37
+ );
38
+ }
39
+
40
+ export { Sparkline };
41
+ //# sourceMappingURL=sparkline.js.map
42
+ //# sourceMappingURL=sparkline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sparkline.tsx"],"names":[],"mappings":";;;AAYO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,KAAA,GAAQ,gBAAA;AAAA,EACR,MAAA,GAAS,EAAA;AAAA,EACT,KAAA,GAAQ,EAAA;AAAA,EACR;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,IAAO,CAAA;AAC3B,EAAA,MAAM,SAAS,IAAA,CACZ,GAAA;AAAA,IACC,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,EAAI,CAAA,IAAK,KAAK,MAAA,GAAS,CAAA,CAAA,GAAM,KAAK,CAAA,CAAA,EAAI,UAAW,CAAA,GAAI,GAAA,IAAO,KAAA,IAAU,MAAA,GAAS,KAAK,CAAC,CAAA;AAAA,GACzF,CACC,KAAK,GAAG,CAAA;AAEX,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MAC/B,KAAA,EAAO,YAAY,MAAA,GAAY,KAAA;AAAA,MAC/B,MAAA;AAAA,MACA,mBAAA,EAAoB,MAAA;AAAA,MACpB,WAAW,SAAA,IAAa,OAAA;AAAA,MAExB,QAAA,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAQ,KAAA;AAAA,UACR,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ","file":"sparkline.js","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n\ninterface SparklineProps {\n data: number[];\n color?: string;\n height?: number;\n width?: number;\n className?: string;\n}\n\nexport function Sparkline({\n data,\n color = \"var(--primary)\",\n height = 28,\n width = 80,\n className,\n}: SparklineProps) {\n const max = Math.max(...data);\n const min = Math.min(...data);\n const range = max - min || 1;\n const points = data\n .map(\n (v, i) =>\n `${(i / (data.length - 1)) * width},${height - ((v - min) / range) * (height - 4) - 2}`,\n )\n .join(\" \");\n\n return (\n <svg\n viewBox={`0 0 ${width} ${height}`}\n width={className ? undefined : width}\n height={height}\n preserveAspectRatio=\"none\"\n className={className ?? \"block\"}\n >\n <polyline\n points={points}\n fill=\"none\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n"]}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var lucideReact = require('lucide-react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function Spinner({ className, ...props }) {
8
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2Icon, { role: "status", "aria-label": "Loading", className: chunk6YHDDRIM_cjs.cn("size-4 animate-spin", className), ...props });
9
+ }
10
+
11
+ exports.Spinner = Spinner;
12
+ //# sourceMappingURL=spinner.cjs.map
13
+ //# sourceMappingURL=spinner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spinner.tsx"],"names":["jsx","Loader2Icon","cn"],"mappings":";;;;;;AAGA,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACrE,EAAA,uBACEA,cAAA,CAACC,uBAAA,EAAA,EAAY,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,SAAA,EAAU,SAAA,EAAWC,oBAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAEhH","file":"spinner.cjs","sourcesContent":["import { cn } from \"./lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n"]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function Spinner({ className, ...props }: React.ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
4
+
5
+ export { Spinner };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function Spinner({ className, ...props }: React.ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
4
+
5
+ export { Spinner };
@@ -0,0 +1,11 @@
1
+ import { cn } from './chunk-LZGII7SX.js';
2
+ import { Loader2Icon } from 'lucide-react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function Spinner({ className, ...props }) {
6
+ return /* @__PURE__ */ jsx(Loader2Icon, { role: "status", "aria-label": "Loading", className: cn("size-4 animate-spin", className), ...props });
7
+ }
8
+
9
+ export { Spinner };
10
+ //# sourceMappingURL=spinner.js.map
11
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spinner.tsx"],"names":[],"mappings":";;;;AAGA,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACrE,EAAA,uBACE,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,SAAA,EAAU,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAEhH","file":"spinner.js","sourcesContent":["import { cn } from \"./lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n"]}
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ var chunkDSDDDYG3_cjs = require('./chunk-DSDDDYG3.cjs');
4
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
5
+ var lucideReact = require('lucide-react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function InfoHint({ text }) {
9
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkDSDDDYG3_cjs.TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ jsxRuntime.jsxs(chunkDSDDDYG3_cjs.Tooltip, { children: [
10
+ /* @__PURE__ */ jsxRuntime.jsx(chunkDSDDDYG3_cjs.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
11
+ "span",
12
+ {
13
+ "aria-label": "More info",
14
+ tabIndex: 0,
15
+ className: "inline-flex cursor-help text-muted-foreground/60",
16
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "size-3.5" })
17
+ }
18
+ ) }),
19
+ /* @__PURE__ */ jsxRuntime.jsx(chunkDSDDDYG3_cjs.TooltipContent, { className: "max-w-72 text-[12px] leading-relaxed", children: text })
20
+ ] }) });
21
+ }
22
+ function StatCard({
23
+ label,
24
+ info,
25
+ value,
26
+ hint,
27
+ detail,
28
+ className,
29
+ children
30
+ }) {
31
+ return (
32
+ // Label above value, always. Putting them on one line to save height
33
+ // only works while the tile is full-width; inside the 2-up phone grid
34
+ // the label wraps and the value collides with the info icon, which is
35
+ // how this tile ended up looking broken on the Metrics tab.
36
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "stat-card", className: chunk6YHDDRIM_cjs.cn("flex h-full flex-col", className), children: [
37
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
38
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11.5px] font-medium uppercase leading-tight tracking-wide text-muted-foreground/80", children: label }),
39
+ info && /* @__PURE__ */ jsxRuntime.jsx(InfoHint, { text: info })
40
+ ] }),
41
+ value !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1.5 flex items-baseline gap-2", children: [
42
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[22px] font-semibold leading-tight text-foreground", children: value }),
43
+ hint && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] text-muted-foreground", children: hint })
44
+ ] }),
45
+ children,
46
+ detail && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto pt-1.5 text-[12px] leading-snug text-muted-foreground", children: detail })
47
+ ] })
48
+ );
49
+ }
50
+ function ChannelChip({ label }) {
51
+ return /* @__PURE__ */ jsxRuntime.jsx(
52
+ "span",
53
+ {
54
+ "data-slot": "channel-chip",
55
+ className: "inline-flex items-center rounded-[6px] bg-foreground/[0.07] px-1.5 py-0.5 text-[10.5px] font-medium uppercase tracking-wide text-muted-foreground",
56
+ children: label
57
+ }
58
+ );
59
+ }
60
+
61
+ exports.ChannelChip = ChannelChip;
62
+ exports.InfoHint = InfoHint;
63
+ exports.StatCard = StatCard;
64
+ //# sourceMappingURL=stat-card.cjs.map
65
+ //# sourceMappingURL=stat-card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stat-card.tsx"],"names":["jsx","TooltipProvider","Tooltip","TooltipTrigger","Info","TooltipContent","jsxs","cn"],"mappings":";;;;;;;AAkBO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAwB;AACtD,EAAA,uBACEA,cAAA,CAACC,iCAAA,EAAA,EAAgB,aAAA,EAAe,GAAA,EAC9B,0CAACC,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAF,cAAA,CAACG,gCAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAH,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,WAAA;AAAA,QACX,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAU,kDAAA;AAAA,QAEV,QAAA,kBAAAA,cAAA,CAACI,gBAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,KAC7B,EACF,CAAA;AAAA,oBACAJ,cAAA,CAACK,gCAAA,EAAA,EAAe,SAAA,EAAU,sCAAA,EACvB,QAAA,EAAA,IAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKEC,eAAA,CAAC,SAAI,WAAA,EAAU,WAAA,EAAY,WAAWC,oBAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA,EACxE,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0FAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,IAAA,oBAAQA,cAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM;AAAA,OAAA,EACjC,CAAA;AAAA,MACC,KAAA,KAAU,MAAA,oBACTM,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,IAAA,oBACCA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAqC,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAE9D,CAAA;AAAA,MAED,QAAA;AAAA,MACA,MAAA,oBACCA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEACZ,QAAA,EAAA,MAAA,EACH;AAAA,KAAA,EAEJ;AAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAM,EAAsB;AACxD,EAAA,uBACEA,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAU,mJAAA;AAAA,MAET,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ","file":"stat-card.cjs","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Shared stat-tile primitives used by the agent Metrics tab and the\n// agent Users page: label / big value / baseline hint / bottom-pinned\n// detail, with an optional info tooltip on the label.\n\nimport { Info } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\nimport { cn } from \"./lib/utils\";\n\nexport function InfoHint({ text }: { text: ReactNode }) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"More info\"\n tabIndex={0}\n className=\"inline-flex cursor-help text-muted-foreground/60\"\n >\n <Info className=\"size-3.5\" />\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-72 text-[12px] leading-relaxed\">\n {text}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nexport function StatCard({\n label,\n info,\n value,\n hint,\n detail,\n className,\n children,\n}: {\n label: string;\n info?: ReactNode;\n value?: ReactNode;\n hint?: ReactNode;\n detail?: ReactNode;\n /** Card-shell classes (border, background, padding). Omit to render\n * the bare tile inside an existing card. */\n className?: string;\n children?: ReactNode;\n}) {\n return (\n // Label above value, always. Putting them on one line to save height\n // only works while the tile is full-width; inside the 2-up phone grid\n // the label wraps and the value collides with the info icon, which is\n // how this tile ended up looking broken on the Metrics tab.\n <div data-slot=\"stat-card\" className={cn(\"flex h-full flex-col\", className)}>\n <div className=\"flex items-center gap-1.5\">\n <p className=\"text-[11.5px] font-medium uppercase leading-tight tracking-wide text-muted-foreground/80\">\n {label}\n </p>\n {info && <InfoHint text={info} />}\n </div>\n {value !== undefined && (\n <div className=\"mt-1.5 flex items-baseline gap-2\">\n <span className=\"text-[22px] font-semibold leading-tight text-foreground\">\n {value}\n </span>\n {hint && (\n <span className=\"text-[12px] text-muted-foreground\">{hint}</span>\n )}\n </div>\n )}\n {children}\n {detail && (\n <div className=\"mt-auto pt-1.5 text-[12px] leading-snug text-muted-foreground\">\n {detail}\n </div>\n )}\n </div>\n );\n}\n\nexport function ChannelChip({ label }: { label: string }) {\n return (\n <span\n data-slot=\"channel-chip\"\n className=\"inline-flex items-center rounded-[6px] bg-foreground/[0.07] px-1.5 py-0.5 text-[10.5px] font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {label}\n </span>\n );\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ declare function InfoHint({ text }: {
5
+ text: ReactNode;
6
+ }): react_jsx_runtime.JSX.Element;
7
+ declare function StatCard({ label, info, value, hint, detail, className, children, }: {
8
+ label: string;
9
+ info?: ReactNode;
10
+ value?: ReactNode;
11
+ hint?: ReactNode;
12
+ detail?: ReactNode;
13
+ /** Card-shell classes (border, background, padding). Omit to render
14
+ * the bare tile inside an existing card. */
15
+ className?: string;
16
+ children?: ReactNode;
17
+ }): react_jsx_runtime.JSX.Element;
18
+ declare function ChannelChip({ label }: {
19
+ label: string;
20
+ }): react_jsx_runtime.JSX.Element;
21
+
22
+ export { ChannelChip, InfoHint, StatCard };
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ declare function InfoHint({ text }: {
5
+ text: ReactNode;
6
+ }): react_jsx_runtime.JSX.Element;
7
+ declare function StatCard({ label, info, value, hint, detail, className, children, }: {
8
+ label: string;
9
+ info?: ReactNode;
10
+ value?: ReactNode;
11
+ hint?: ReactNode;
12
+ detail?: ReactNode;
13
+ /** Card-shell classes (border, background, padding). Omit to render
14
+ * the bare tile inside an existing card. */
15
+ className?: string;
16
+ children?: ReactNode;
17
+ }): react_jsx_runtime.JSX.Element;
18
+ declare function ChannelChip({ label }: {
19
+ label: string;
20
+ }): react_jsx_runtime.JSX.Element;
21
+
22
+ export { ChannelChip, InfoHint, StatCard };
@@ -0,0 +1,61 @@
1
+ import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from './chunk-IB7LTHEQ.js';
2
+ import { cn } from './chunk-LZGII7SX.js';
3
+ import { Info } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function InfoHint({ text }) {
7
+ return /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
8
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
9
+ "span",
10
+ {
11
+ "aria-label": "More info",
12
+ tabIndex: 0,
13
+ className: "inline-flex cursor-help text-muted-foreground/60",
14
+ children: /* @__PURE__ */ jsx(Info, { className: "size-3.5" })
15
+ }
16
+ ) }),
17
+ /* @__PURE__ */ jsx(TooltipContent, { className: "max-w-72 text-[12px] leading-relaxed", children: text })
18
+ ] }) });
19
+ }
20
+ function StatCard({
21
+ label,
22
+ info,
23
+ value,
24
+ hint,
25
+ detail,
26
+ className,
27
+ children
28
+ }) {
29
+ return (
30
+ // Label above value, always. Putting them on one line to save height
31
+ // only works while the tile is full-width; inside the 2-up phone grid
32
+ // the label wraps and the value collides with the info icon, which is
33
+ // how this tile ended up looking broken on the Metrics tab.
34
+ /* @__PURE__ */ jsxs("div", { "data-slot": "stat-card", className: cn("flex h-full flex-col", className), children: [
35
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
36
+ /* @__PURE__ */ jsx("p", { className: "text-[11.5px] font-medium uppercase leading-tight tracking-wide text-muted-foreground/80", children: label }),
37
+ info && /* @__PURE__ */ jsx(InfoHint, { text: info })
38
+ ] }),
39
+ value !== void 0 && /* @__PURE__ */ jsxs("div", { className: "mt-1.5 flex items-baseline gap-2", children: [
40
+ /* @__PURE__ */ jsx("span", { className: "text-[22px] font-semibold leading-tight text-foreground", children: value }),
41
+ hint && /* @__PURE__ */ jsx("span", { className: "text-[12px] text-muted-foreground", children: hint })
42
+ ] }),
43
+ children,
44
+ detail && /* @__PURE__ */ jsx("div", { className: "mt-auto pt-1.5 text-[12px] leading-snug text-muted-foreground", children: detail })
45
+ ] })
46
+ );
47
+ }
48
+ function ChannelChip({ label }) {
49
+ return /* @__PURE__ */ jsx(
50
+ "span",
51
+ {
52
+ "data-slot": "channel-chip",
53
+ className: "inline-flex items-center rounded-[6px] bg-foreground/[0.07] px-1.5 py-0.5 text-[10.5px] font-medium uppercase tracking-wide text-muted-foreground",
54
+ children: label
55
+ }
56
+ );
57
+ }
58
+
59
+ export { ChannelChip, InfoHint, StatCard };
60
+ //# sourceMappingURL=stat-card.js.map
61
+ //# sourceMappingURL=stat-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stat-card.tsx"],"names":[],"mappings":";;;;;AAkBO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAwB;AACtD,EAAA,uBACE,GAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,GAAA,EAC9B,+BAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,WAAA;AAAA,QACX,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAU,kDAAA;AAAA,QAEV,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,KAC7B,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,sCAAA,EACvB,QAAA,EAAA,IAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKE,IAAA,CAAC,SAAI,WAAA,EAAU,WAAA,EAAY,WAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA,EACxE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0FAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,IAAA,oBAAQ,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM;AAAA,OAAA,EACjC,CAAA;AAAA,MACC,KAAA,KAAU,MAAA,oBACT,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,IAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAqC,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAE9D,CAAA;AAAA,MAED,QAAA;AAAA,MACA,MAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEACZ,QAAA,EAAA,MAAA,EACH;AAAA,KAAA,EAEJ;AAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAM,EAAsB;AACxD,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAU,mJAAA;AAAA,MAET,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ","file":"stat-card.js","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Shared stat-tile primitives used by the agent Metrics tab and the\n// agent Users page: label / big value / baseline hint / bottom-pinned\n// detail, with an optional info tooltip on the label.\n\nimport { Info } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\nimport { cn } from \"./lib/utils\";\n\nexport function InfoHint({ text }: { text: ReactNode }) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"More info\"\n tabIndex={0}\n className=\"inline-flex cursor-help text-muted-foreground/60\"\n >\n <Info className=\"size-3.5\" />\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-72 text-[12px] leading-relaxed\">\n {text}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nexport function StatCard({\n label,\n info,\n value,\n hint,\n detail,\n className,\n children,\n}: {\n label: string;\n info?: ReactNode;\n value?: ReactNode;\n hint?: ReactNode;\n detail?: ReactNode;\n /** Card-shell classes (border, background, padding). Omit to render\n * the bare tile inside an existing card. */\n className?: string;\n children?: ReactNode;\n}) {\n return (\n // Label above value, always. Putting them on one line to save height\n // only works while the tile is full-width; inside the 2-up phone grid\n // the label wraps and the value collides with the info icon, which is\n // how this tile ended up looking broken on the Metrics tab.\n <div data-slot=\"stat-card\" className={cn(\"flex h-full flex-col\", className)}>\n <div className=\"flex items-center gap-1.5\">\n <p className=\"text-[11.5px] font-medium uppercase leading-tight tracking-wide text-muted-foreground/80\">\n {label}\n </p>\n {info && <InfoHint text={info} />}\n </div>\n {value !== undefined && (\n <div className=\"mt-1.5 flex items-baseline gap-2\">\n <span className=\"text-[22px] font-semibold leading-tight text-foreground\">\n {value}\n </span>\n {hint && (\n <span className=\"text-[12px] text-muted-foreground\">{hint}</span>\n )}\n </div>\n )}\n {children}\n {detail && (\n <div className=\"mt-auto pt-1.5 text-[12px] leading-snug text-muted-foreground\">\n {detail}\n </div>\n )}\n </div>\n );\n}\n\nexport function ChannelChip({ label }: { label: string }) {\n return (\n <span\n data-slot=\"channel-chip\"\n className=\"inline-flex items-center rounded-[6px] bg-foreground/[0.07] px-1.5 py-0.5 text-[10.5px] font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {label}\n </span>\n );\n}\n"]}
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ var STATUS_COLORS = {
7
+ running: "#22C55E",
8
+ serving: "#22C55E",
9
+ completed: "#3B82F6",
10
+ deploying: "#F59E0B",
11
+ error: "#EF4444",
12
+ stopped: "#6B7280"
13
+ };
14
+ var GLOW_STATUSES = /* @__PURE__ */ new Set(["running", "serving"]);
15
+ function StatusDot({ status, className }) {
16
+ const color = STATUS_COLORS[status] ?? "#6B7280";
17
+ return /* @__PURE__ */ jsxRuntime.jsx(
18
+ "span",
19
+ {
20
+ className: chunk6YHDDRIM_cjs.cn("inline-block w-[7px] h-[7px] rounded-full shrink-0 mr-1.5", className),
21
+ style: {
22
+ backgroundColor: color,
23
+ boxShadow: GLOW_STATUSES.has(status) ? `0 0 6px ${color}` : "none"
24
+ }
25
+ }
26
+ );
27
+ }
28
+
29
+ exports.STATUS_COLORS = STATUS_COLORS;
30
+ exports.StatusDot = StatusDot;
31
+ //# sourceMappingURL=status-dot.cjs.map
32
+ //# sourceMappingURL=status-dot.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/status-dot.tsx"],"names":["jsx","cn"],"mappings":";;;;;AAaO,IAAM,aAAA,GAAwC;AAAA,EACnD,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,SAAA,EAAW,SAAA;AAAA,EACX,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,EAAS;AACX;AAEA,IAAM,gCAAgB,IAAI,GAAA,CAAY,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AAOrD,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAmB;AAC/D,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,MAAM,CAAA,IAAK,SAAA;AAEvC,EAAA,uBACEA,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,oBAAA,CAAG,2DAAA,EAA6D,SAAS,CAAA;AAAA,MACpF,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,KAAA;AAAA,QACjB,WAAW,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,GAAK;AAAA;AAC9D;AAAA,GACF;AAEJ","file":"status-dot.cjs","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { cn } from \"./lib/utils\";\n\ntype Status =\n | \"running\"\n | \"serving\"\n | \"completed\"\n | \"deploying\"\n | \"error\"\n | \"stopped\";\n\nexport const STATUS_COLORS: Record<Status, string> = {\n running: \"#22C55E\",\n serving: \"#22C55E\",\n completed: \"#3B82F6\",\n deploying: \"#F59E0B\",\n error: \"#EF4444\",\n stopped: \"#6B7280\",\n};\n\nconst GLOW_STATUSES = new Set<Status>([\"running\", \"serving\"]);\n\ninterface StatusDotProps {\n status: Status;\n className?: string;\n}\n\nexport function StatusDot({ status, className }: StatusDotProps) {\n const color = STATUS_COLORS[status] ?? \"#6B7280\";\n\n return (\n <span\n className={cn(\"inline-block w-[7px] h-[7px] rounded-full shrink-0 mr-1.5\", className)}\n style={{\n backgroundColor: color,\n boxShadow: GLOW_STATUSES.has(status) ? `0 0 6px ${color}` : \"none\",\n }}\n />\n );\n}\n\nexport type { Status };\n"]}
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type Status = "running" | "serving" | "completed" | "deploying" | "error" | "stopped";
4
+ declare const STATUS_COLORS: Record<Status, string>;
5
+ interface StatusDotProps {
6
+ status: Status;
7
+ className?: string;
8
+ }
9
+ declare function StatusDot({ status, className }: StatusDotProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { STATUS_COLORS, type Status, StatusDot };
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type Status = "running" | "serving" | "completed" | "deploying" | "error" | "stopped";
4
+ declare const STATUS_COLORS: Record<Status, string>;
5
+ interface StatusDotProps {
6
+ status: Status;
7
+ className?: string;
8
+ }
9
+ declare function StatusDot({ status, className }: StatusDotProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { STATUS_COLORS, type Status, StatusDot };
@@ -0,0 +1,29 @@
1
+ import { cn } from './chunk-LZGII7SX.js';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ var STATUS_COLORS = {
5
+ running: "#22C55E",
6
+ serving: "#22C55E",
7
+ completed: "#3B82F6",
8
+ deploying: "#F59E0B",
9
+ error: "#EF4444",
10
+ stopped: "#6B7280"
11
+ };
12
+ var GLOW_STATUSES = /* @__PURE__ */ new Set(["running", "serving"]);
13
+ function StatusDot({ status, className }) {
14
+ const color = STATUS_COLORS[status] ?? "#6B7280";
15
+ return /* @__PURE__ */ jsx(
16
+ "span",
17
+ {
18
+ className: cn("inline-block w-[7px] h-[7px] rounded-full shrink-0 mr-1.5", className),
19
+ style: {
20
+ backgroundColor: color,
21
+ boxShadow: GLOW_STATUSES.has(status) ? `0 0 6px ${color}` : "none"
22
+ }
23
+ }
24
+ );
25
+ }
26
+
27
+ export { STATUS_COLORS, StatusDot };
28
+ //# sourceMappingURL=status-dot.js.map
29
+ //# sourceMappingURL=status-dot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/status-dot.tsx"],"names":[],"mappings":";;;AAaO,IAAM,aAAA,GAAwC;AAAA,EACnD,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,SAAA,EAAW,SAAA;AAAA,EACX,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,EAAS;AACX;AAEA,IAAM,gCAAgB,IAAI,GAAA,CAAY,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AAOrD,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAmB;AAC/D,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,MAAM,CAAA,IAAK,SAAA;AAEvC,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,2DAAA,EAA6D,SAAS,CAAA;AAAA,MACpF,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,KAAA;AAAA,QACjB,WAAW,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,GAAK;AAAA;AAC9D;AAAA,GACF;AAEJ","file":"status-dot.js","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { cn } from \"./lib/utils\";\n\ntype Status =\n | \"running\"\n | \"serving\"\n | \"completed\"\n | \"deploying\"\n | \"error\"\n | \"stopped\";\n\nexport const STATUS_COLORS: Record<Status, string> = {\n running: \"#22C55E\",\n serving: \"#22C55E\",\n completed: \"#3B82F6\",\n deploying: \"#F59E0B\",\n error: \"#EF4444\",\n stopped: \"#6B7280\",\n};\n\nconst GLOW_STATUSES = new Set<Status>([\"running\", \"serving\"]);\n\ninterface StatusDotProps {\n status: Status;\n className?: string;\n}\n\nexport function StatusDot({ status, className }: StatusDotProps) {\n const color = STATUS_COLORS[status] ?? \"#6B7280\";\n\n return (\n <span\n className={cn(\"inline-block w-[7px] h-[7px] rounded-full shrink-0 mr-1.5\", className)}\n style={{\n backgroundColor: color,\n boxShadow: GLOW_STATUSES.has(status) ? `0 0 6px ${color}` : \"none\",\n }}\n />\n );\n}\n\nexport type { Status };\n"]}
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var radixUi = require('radix-ui');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function Switch({
8
+ className,
9
+ size = "default",
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsxRuntime.jsx(
13
+ radixUi.Switch.Root,
14
+ {
15
+ "data-slot": "switch",
16
+ "data-size": size,
17
+ className: chunk6YHDDRIM_cjs.cn(
18
+ // The track is 14–18px tall, far under the 44px touch minimum, so the
19
+ // ::after overlay carries the real hit area — widened further where the
20
+ // pointer is a finger.
21
+ "peer group/switch relative inline-flex shrink-0 items-center rounded-full border transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 pointer-coarse:after:-inset-x-4 pointer-coarse:after:-inset-y-3.5 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 data-[size=default]:h-4.5 data-[size=default]:w-8.25 data-[size=sm]:h-3.5 data-[size=sm]:w-6.25 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-amber-500 data-checked:bg-amber-500 data-unchecked:border-input/50 data-unchecked:bg-input data-disabled:cursor-not-allowed data-disabled:opacity-50",
22
+ className
23
+ ),
24
+ ...props,
25
+ children: /* @__PURE__ */ jsxRuntime.jsx(
26
+ radixUi.Switch.Thumb,
27
+ {
28
+ "data-slot": "switch-thumb",
29
+ className: "pointer-events-none block rounded-full bg-white ring-0 transition-transform group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5 data-checked:translate-x-[calc(100%+2px)] data-unchecked:translate-x-0.25"
30
+ }
31
+ )
32
+ }
33
+ );
34
+ }
35
+
36
+ exports.Switch = Switch;
37
+ //# sourceMappingURL=switch.cjs.map
38
+ //# sourceMappingURL=switch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/switch.tsx"],"names":["jsx","SwitchPrimitive","cn"],"mappings":";;;;;;AAKA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACEA,cAAA;AAAA,IAACC,cAAA,CAAgB,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWC,oBAAA;AAAA;AAAA;AAAA;AAAA,QAIT,utBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAF,cAAA;AAAA,QAACC,cAAA,CAAgB,KAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ","file":"switch.cjs","sourcesContent":["import * as React from \"react\"\nimport { Switch as SwitchPrimitive } from \"radix-ui\"\n\nimport { cn } from \"./lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n // The track is 14–18px tall, far under the 44px touch minimum, so the\n // ::after overlay carries the real hit area — widened further where the\n // pointer is a finger.\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 pointer-coarse:after:-inset-x-4 pointer-coarse:after:-inset-y-3.5 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 data-[size=default]:h-4.5 data-[size=default]:w-8.25 data-[size=sm]:h-3.5 data-[size=sm]:w-6.25 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-amber-500 data-checked:bg-amber-500 data-unchecked:border-input/50 data-unchecked:bg-input data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-white ring-0 transition-transform group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5 data-checked:translate-x-[calc(100%+2px)] data-unchecked:translate-x-0.25\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n"]}
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Switch as Switch$1 } from 'radix-ui';
4
+
5
+ declare function Switch({ className, size, ...props }: React.ComponentProps<typeof Switch$1.Root> & {
6
+ size?: "sm" | "default";
7
+ }): react_jsx_runtime.JSX.Element;
8
+
9
+ export { Switch };
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Switch as Switch$1 } from 'radix-ui';
4
+
5
+ declare function Switch({ className, size, ...props }: React.ComponentProps<typeof Switch$1.Root> & {
6
+ size?: "sm" | "default";
7
+ }): react_jsx_runtime.JSX.Element;
8
+
9
+ export { Switch };
package/dist/switch.js ADDED
@@ -0,0 +1,36 @@
1
+ import { cn } from './chunk-LZGII7SX.js';
2
+ import { Switch as Switch$1 } from 'radix-ui';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function Switch({
6
+ className,
7
+ size = "default",
8
+ ...props
9
+ }) {
10
+ return /* @__PURE__ */ jsx(
11
+ Switch$1.Root,
12
+ {
13
+ "data-slot": "switch",
14
+ "data-size": size,
15
+ className: cn(
16
+ // The track is 14–18px tall, far under the 44px touch minimum, so the
17
+ // ::after overlay carries the real hit area — widened further where the
18
+ // pointer is a finger.
19
+ "peer group/switch relative inline-flex shrink-0 items-center rounded-full border transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 pointer-coarse:after:-inset-x-4 pointer-coarse:after:-inset-y-3.5 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 data-[size=default]:h-4.5 data-[size=default]:w-8.25 data-[size=sm]:h-3.5 data-[size=sm]:w-6.25 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-amber-500 data-checked:bg-amber-500 data-unchecked:border-input/50 data-unchecked:bg-input data-disabled:cursor-not-allowed data-disabled:opacity-50",
20
+ className
21
+ ),
22
+ ...props,
23
+ children: /* @__PURE__ */ jsx(
24
+ Switch$1.Thumb,
25
+ {
26
+ "data-slot": "switch-thumb",
27
+ className: "pointer-events-none block rounded-full bg-white ring-0 transition-transform group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5 data-checked:translate-x-[calc(100%+2px)] data-unchecked:translate-x-0.25"
28
+ }
29
+ )
30
+ }
31
+ );
32
+ }
33
+
34
+ export { Switch };
35
+ //# sourceMappingURL=switch.js.map
36
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/switch.tsx"],"names":["SwitchPrimitive"],"mappings":";;;;AAKA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,GAAA;AAAA,IAACA,QAAA,CAAgB,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA,QAIT,utBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA;AAAA,QAACA,QAAA,CAAgB,KAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ","file":"switch.js","sourcesContent":["import * as React from \"react\"\nimport { Switch as SwitchPrimitive } from \"radix-ui\"\n\nimport { cn } from \"./lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n // The track is 14–18px tall, far under the 44px touch minimum, so the\n // ::after overlay carries the real hit area — widened further where the\n // pointer is a finger.\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 pointer-coarse:after:-inset-x-4 pointer-coarse:after:-inset-y-3.5 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 data-[size=default]:h-4.5 data-[size=default]:w-8.25 data-[size=sm]:h-3.5 data-[size=sm]:w-6.25 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-amber-500 data-checked:bg-amber-500 data-unchecked:border-input/50 data-unchecked:bg-input data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-white ring-0 transition-transform group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5 data-checked:translate-x-[calc(100%+2px)] data-unchecked:translate-x-0.25\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n"]}