kaleido-ui 0.2.2 → 0.2.4

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 (318) hide show
  1. package/README.md +37 -10
  2. package/dist/icon-AvUL0Cws.d.cts +135 -0
  3. package/dist/icon-AvUL0Cws.d.ts +135 -0
  4. package/dist/native/index.cjs +0 -126
  5. package/dist/native/index.js +0 -126
  6. package/dist/web/assets/kaleidoswap-brand.js +11 -0
  7. package/dist/web/assets/protocol-icons.js +7 -0
  8. package/dist/web/chunk-25RRZDZ2.js +269 -0
  9. package/dist/web/chunk-27CY5EHL.js +230 -0
  10. package/dist/web/chunk-2GNXC446.js +84 -0
  11. package/dist/web/chunk-2NCH2ZDU.js +129 -0
  12. package/dist/web/chunk-2OGYEUYV.js +220 -0
  13. package/dist/web/chunk-2Q5SSNFO.js +63 -0
  14. package/dist/web/chunk-2REWXJEN.js +96 -0
  15. package/dist/web/chunk-2VAS6VYJ.js +106 -0
  16. package/dist/web/chunk-2VKFRAX3.js +39 -0
  17. package/dist/web/chunk-2Z6KFK4Z.js +41 -0
  18. package/dist/web/chunk-4246Y2F2.js +276 -0
  19. package/dist/web/chunk-4MLPMRXA.js +85 -0
  20. package/dist/web/chunk-4QLR4ZNK.js +383 -0
  21. package/dist/web/chunk-4UMKXXAK.js +33 -0
  22. package/dist/web/chunk-563GMWFT.js +32 -0
  23. package/dist/web/chunk-5BNDC7M4.js +50 -0
  24. package/dist/web/chunk-5GBURTY4.js +33 -0
  25. package/dist/web/chunk-5MM5YGGG.js +43 -0
  26. package/dist/web/chunk-5PZ2XVWL.js +85 -0
  27. package/dist/web/chunk-5V2KMO56.js +55 -0
  28. package/dist/web/chunk-5WBAFYPH.js +62 -0
  29. package/dist/web/chunk-62HIDJCD.js +98 -0
  30. package/dist/web/chunk-6IBQJIHT.js +56 -0
  31. package/dist/web/chunk-6PNGSAJB.js +55 -0
  32. package/dist/web/chunk-6VKWG5FJ.js +159 -0
  33. package/dist/web/chunk-76DAZT7Q.js +107 -0
  34. package/dist/web/chunk-7NS5S2PG.js +126 -0
  35. package/dist/web/chunk-7OE6AXLY.js +27 -0
  36. package/dist/web/chunk-7YUPXESC.js +666 -0
  37. package/dist/web/chunk-A3TKIXSI.js +197 -0
  38. package/dist/web/chunk-A3XHFJ6J.js +120 -0
  39. package/dist/web/chunk-A6MSV4MA.js +83 -0
  40. package/dist/web/chunk-A7MPRLJL.js +169 -0
  41. package/dist/web/chunk-AP7Q2FCS.js +43 -0
  42. package/dist/web/chunk-ASHU5XNR.js +21 -0
  43. package/dist/web/chunk-BGUBHWIO.js +41 -0
  44. package/dist/web/chunk-BY2KCPTX.js +444 -0
  45. package/dist/web/chunk-C7YIQDGQ.js +57 -0
  46. package/dist/web/chunk-CBE7BT3M.js +87 -0
  47. package/dist/web/chunk-CJATW6EO.js +108 -0
  48. package/dist/web/chunk-CRDCVB5X.js +96 -0
  49. package/dist/web/chunk-CRMLYZIX.js +35 -0
  50. package/dist/web/chunk-CXMCWSWC.js +20 -0
  51. package/dist/web/chunk-CZPNI33A.js +31 -0
  52. package/dist/web/chunk-DCUAE6PX.js +202 -0
  53. package/dist/web/chunk-DDMDRAD6.js +403 -0
  54. package/dist/web/chunk-DH7VXKGM.js +247 -0
  55. package/dist/web/chunk-DNHRMPKI.js +63 -0
  56. package/dist/web/chunk-DXFFYCU3.js +83 -0
  57. package/dist/web/chunk-EK5N3ZPW.js +417 -0
  58. package/dist/web/chunk-F2LIZX5K.js +140 -0
  59. package/dist/web/chunk-FSQV54O4.js +61 -0
  60. package/dist/web/chunk-FWOIRFV5.js +73 -0
  61. package/dist/web/chunk-G2MJL3VP.js +54 -0
  62. package/dist/web/chunk-G2ZYNR3W.js +28 -0
  63. package/dist/web/chunk-G373WZMN.js +150 -0
  64. package/dist/web/chunk-GMJGTSCQ.js +82 -0
  65. package/dist/web/chunk-GX7GBHJ6.js +362 -0
  66. package/dist/web/chunk-GZZ5KVON.js +70 -0
  67. package/dist/web/chunk-H3GYLFHP.js +30 -0
  68. package/dist/web/chunk-HDLOPDFX.js +89 -0
  69. package/dist/web/chunk-HP25HN7Q.js +69 -0
  70. package/dist/web/chunk-HVKSBEZN.js +98 -0
  71. package/dist/web/chunk-HWKXZNBN.js +74 -0
  72. package/dist/web/chunk-HY3VMT27.js +64 -0
  73. package/dist/web/chunk-IK32AIOS.js +27 -0
  74. package/dist/web/chunk-IMER4KGH.js +151 -0
  75. package/dist/web/chunk-IV6AAVUE.js +177 -0
  76. package/dist/web/chunk-JWMFTRDC.js +254 -0
  77. package/dist/web/chunk-JY3H7ZAI.js +41 -0
  78. package/dist/web/chunk-JY73M73T.js +175 -0
  79. package/dist/web/chunk-JYM5NHBA.js +80 -0
  80. package/dist/web/chunk-JZ3BUM5L.js +368 -0
  81. package/dist/web/chunk-KIMWCG5N.js +108 -0
  82. package/dist/web/chunk-L2UPQLY7.js +43 -0
  83. package/dist/web/chunk-LFAORJQK.js +81 -0
  84. package/dist/web/chunk-LOGZGZWN.js +1 -0
  85. package/dist/web/chunk-LPDB7EHH.js +65 -0
  86. package/dist/web/chunk-LSY4DY2I.js +72 -0
  87. package/dist/web/chunk-LYCLVP26.js +101 -0
  88. package/dist/web/chunk-LZ6PIXUO.js +43 -0
  89. package/dist/web/chunk-LZ723UCB.js +96 -0
  90. package/dist/web/chunk-M6RXTQEL.js +90 -0
  91. package/dist/web/chunk-MTQ22SKE.js +39 -0
  92. package/dist/web/chunk-MTQOAMDW.js +8 -0
  93. package/dist/web/chunk-NEXA6VGG.js +91 -0
  94. package/dist/web/chunk-NSA777UY.js +89 -0
  95. package/dist/web/chunk-O2TTO5FS.js +24 -0
  96. package/dist/web/chunk-O6NPTMDN.js +191 -0
  97. package/dist/web/chunk-OI7WX7NE.js +17 -0
  98. package/dist/web/chunk-OWSKP527.js +80 -0
  99. package/dist/web/chunk-OX3J3FYX.js +64 -0
  100. package/dist/web/chunk-PCKRLEAO.js +40 -0
  101. package/dist/web/chunk-PMGIJMRO.js +207 -0
  102. package/dist/web/chunk-PS7Q6MMU.js +60 -0
  103. package/dist/web/chunk-PTSOVDKH.js +169 -0
  104. package/dist/web/chunk-QBZSLR7U.js +54 -0
  105. package/dist/web/chunk-QCQRA6L5.js +63 -0
  106. package/dist/web/chunk-QFIGSIXA.js +558 -0
  107. package/dist/web/chunk-QRFFLA3N.js +84 -0
  108. package/dist/web/chunk-QXCCUYNY.js +232 -0
  109. package/dist/web/chunk-QXZ2WY3B.js +38 -0
  110. package/dist/web/chunk-R2MV4S4U.js +50 -0
  111. package/dist/web/chunk-R3IIXFGK.js +48 -0
  112. package/dist/web/chunk-RIOY4LFJ.js +141 -0
  113. package/dist/web/chunk-RV7Z3B3V.js +106 -0
  114. package/dist/web/chunk-RXXYUYBP.js +25 -0
  115. package/dist/web/chunk-S2ICIIH2.js +109 -0
  116. package/dist/web/chunk-SJNOBBU5.js +86 -0
  117. package/dist/web/chunk-STMNX3QT.js +109 -0
  118. package/dist/web/chunk-T7CEJV6P.js +66 -0
  119. package/dist/web/chunk-TBEKRQGW.js +99 -0
  120. package/dist/web/chunk-TCFHH5TE.js +179 -0
  121. package/dist/web/chunk-TI7NWMEQ.js +34 -0
  122. package/dist/web/chunk-TKRMGN7J.js +8 -0
  123. package/dist/web/chunk-TMK3SVYI.js +62 -0
  124. package/dist/web/chunk-TPGNO74K.js +67 -0
  125. package/dist/web/chunk-TS4UYWJJ.js +105 -0
  126. package/dist/web/chunk-TY6SGZC7.js +94 -0
  127. package/dist/web/chunk-UHXOPILM.js +101 -0
  128. package/dist/web/chunk-UK6ZL4MX.js +375 -0
  129. package/dist/web/chunk-UXLWWQ4J.js +20 -0
  130. package/dist/web/chunk-UZ4LWR4X.js +26 -0
  131. package/dist/web/chunk-VLZMX43R.js +45 -0
  132. package/dist/web/chunk-VM6AGMYO.js +46 -0
  133. package/dist/web/chunk-VUGV3ELU.js +176 -0
  134. package/dist/web/chunk-VYQHGSK6.js +244 -0
  135. package/dist/web/chunk-VZF5C3C6.js +146 -0
  136. package/dist/web/chunk-W4E2N3UN.js +58 -0
  137. package/dist/web/chunk-WEPSTI3Z.js +83 -0
  138. package/dist/web/chunk-WOAWUXER.js +139 -0
  139. package/dist/web/chunk-WURSWAKE.js +74 -0
  140. package/dist/web/chunk-WWF7IJBF.js +330 -0
  141. package/dist/web/chunk-X2RA4EG3.js +86 -0
  142. package/dist/web/chunk-XCQGJYGF.js +42 -0
  143. package/dist/web/chunk-XDSOOOYL.js +35 -0
  144. package/dist/web/chunk-XPHFJPUQ.js +291 -0
  145. package/dist/web/chunk-XXH4TYKZ.js +276 -0
  146. package/dist/web/chunk-XZQUQOR3.js +48 -0
  147. package/dist/web/chunk-Y3W6LOOE.js +66 -0
  148. package/dist/web/chunk-YNB4SSLD.js +113 -0
  149. package/dist/web/chunk-YQDCU7ZL.js +49 -0
  150. package/dist/web/chunk-YQQ7GDLZ.js +30 -0
  151. package/dist/web/chunk-YTXWYWVD.js +70 -0
  152. package/dist/web/chunk-YXVOFEDT.js +85 -0
  153. package/dist/web/chunk-Z2SS7UJ4.js +139 -0
  154. package/dist/web/chunk-Z5LVT3BD.js +128 -0
  155. package/dist/web/chunk-Z5O67WTL.js +85 -0
  156. package/dist/web/chunk-ZPNGHBKB.js +86 -0
  157. package/dist/web/chunk-ZR32WYJA.js +55 -0
  158. package/dist/web/chunk-ZRIBB4EB.js +62 -0
  159. package/dist/web/chunk-ZTVV4KBT.js +28 -0
  160. package/dist/web/chunk-ZXCT3Y6P.js +56 -0
  161. package/dist/web/components/account-capabilities-card.js +21 -0
  162. package/dist/web/components/account-menu.js +18 -0
  163. package/dist/web/components/account-settings-shared.js +50 -0
  164. package/dist/web/components/account-status-tabs.js +20 -0
  165. package/dist/web/components/action-tile.js +8 -0
  166. package/dist/web/components/activity-detail-row.js +22 -0
  167. package/dist/web/components/activity-filter-bar.js +22 -0
  168. package/dist/web/components/activity-list.js +23 -0
  169. package/dist/web/components/activity-network-filters.js +19 -0
  170. package/dist/web/components/activity-row.js +15 -0
  171. package/dist/web/components/activity-type-tabs.js +17 -0
  172. package/dist/web/components/alert-banner.js +13 -0
  173. package/dist/web/components/amount.js +8 -0
  174. package/dist/web/components/app-icon.js +15 -0
  175. package/dist/web/components/asset-card.js +21 -0
  176. package/dist/web/components/asset-icon.js +10 -0
  177. package/dist/web/components/asset-selector.js +24 -0
  178. package/dist/web/components/balance-breakdown.js +18 -0
  179. package/dist/web/components/basic-collapsible.js +11 -0
  180. package/dist/web/components/bottom-nav.js +13 -0
  181. package/dist/web/components/bottom-sheet.js +15 -0
  182. package/dist/web/components/btc-unified-receive.js +28 -0
  183. package/dist/web/components/charts/bar-chart.js +24 -0
  184. package/dist/web/components/charts/bar-list.js +24 -0
  185. package/dist/web/components/charts/core.js +63 -0
  186. package/dist/web/components/charts/donut-chart.js +26 -0
  187. package/dist/web/components/charts/index.js +72 -0
  188. package/dist/web/components/charts/line-chart.js +26 -0
  189. package/dist/web/components/charts/meter.js +24 -0
  190. package/dist/web/components/charts/mixed-chart.js +24 -0
  191. package/dist/web/components/charts/scatter-chart.js +24 -0
  192. package/dist/web/components/charts/sparkline.js +8 -0
  193. package/dist/web/components/choice-group.js +11 -0
  194. package/dist/web/components/code-block.js +21 -0
  195. package/dist/web/components/confirm-dialog.js +15 -0
  196. package/dist/web/components/copy-button.js +21 -0
  197. package/dist/web/components/copyable.js +20 -0
  198. package/dist/web/components/date-range-filter.js +16 -0
  199. package/dist/web/components/deposit-asset-selection.js +24 -0
  200. package/dist/web/components/deposit-generated-view.js +23 -0
  201. package/dist/web/components/deposit-invoice-generation.js +35 -0
  202. package/dist/web/components/deposit-network-default-modal.js +13 -0
  203. package/dist/web/components/deposit-pre-generation.js +17 -0
  204. package/dist/web/components/deposit-success-screen.js +20 -0
  205. package/dist/web/components/deposit-ui-shared.js +28 -0
  206. package/dist/web/components/disclosure-card.js +11 -0
  207. package/dist/web/components/dotted-leader.js +8 -0
  208. package/dist/web/components/empty-state.js +8 -0
  209. package/dist/web/components/environment-indicator.js +9 -0
  210. package/dist/web/components/error-boundary.js +10 -0
  211. package/dist/web/components/event-timeline.js +8 -0
  212. package/dist/web/components/extension-page-frame.js +15 -0
  213. package/dist/web/components/filter-bar.js +15 -0
  214. package/dist/web/components/filter-chip-group.js +8 -0
  215. package/dist/web/components/filter-dropdown.js +12 -0
  216. package/dist/web/components/floating-notice.js +12 -0
  217. package/dist/web/components/form-field.js +10 -0
  218. package/dist/web/components/halo-backdrop.js +8 -0
  219. package/dist/web/components/info-chip.js +24 -0
  220. package/dist/web/components/info-panel.js +13 -0
  221. package/dist/web/components/inline-selector.js +11 -0
  222. package/dist/web/components/instants-statement.js +20 -0
  223. package/dist/web/components/kaleidoscope-hero-animation.js +11 -0
  224. package/dist/web/components/kaleidoswap-logo.js +12 -0
  225. package/dist/web/components/list-field.js +14 -0
  226. package/dist/web/components/list-summary.js +8 -0
  227. package/dist/web/components/metric-card.js +14 -0
  228. package/dist/web/components/mobile-hero-animation.js +8 -0
  229. package/dist/web/components/network-badge.js +14 -0
  230. package/dist/web/components/network-icon.js +21 -0
  231. package/dist/web/components/network-status-chip.js +11 -0
  232. package/dist/web/components/notice-bar.js +8 -0
  233. package/dist/web/components/one-time-secret-dialog.js +18 -0
  234. package/dist/web/components/option-selector.js +12 -0
  235. package/dist/web/components/page-header.js +12 -0
  236. package/dist/web/components/page-shell.js +18 -0
  237. package/dist/web/components/pager.js +11 -0
  238. package/dist/web/components/period-select.js +20 -0
  239. package/dist/web/components/qr-code.js +10 -0
  240. package/dist/web/components/query-state.js +19 -0
  241. package/dist/web/components/read-status.js +15 -0
  242. package/dist/web/components/record-list.js +17 -0
  243. package/dist/web/components/recovery-phrase-card.js +20 -0
  244. package/dist/web/components/restricted.js +9 -0
  245. package/dist/web/components/secret-reveal-card.js +20 -0
  246. package/dist/web/components/section-header.js +9 -0
  247. package/dist/web/components/section-label.js +8 -0
  248. package/dist/web/components/selectable-card.js +8 -0
  249. package/dist/web/components/setting-item.js +13 -0
  250. package/dist/web/components/settings-section-card.js +11 -0
  251. package/dist/web/components/settings-selector-row.js +8 -0
  252. package/dist/web/components/settings-tile.js +21 -0
  253. package/dist/web/components/skeleton.js +10 -0
  254. package/dist/web/components/status-badge.js +13 -0
  255. package/dist/web/components/status-icon-badge.js +15 -0
  256. package/dist/web/components/stepper-number-input.js +10 -0
  257. package/dist/web/components/summary-rows.js +9 -0
  258. package/dist/web/components/swap-badge.js +11 -0
  259. package/dist/web/components/swap-input-card.js +28 -0
  260. package/dist/web/components/swap-step-list.js +10 -0
  261. package/dist/web/components/switch-row.js +9 -0
  262. package/dist/web/components/theme-toggle.js +12 -0
  263. package/dist/web/components/transaction-card.js +14 -0
  264. package/dist/web/components/trend-chart.js +28 -0
  265. package/dist/web/components/value-list.js +20 -0
  266. package/dist/web/components/wallet-asset-list.js +22 -0
  267. package/dist/web/components/withdraw-amount-input.js +13 -0
  268. package/dist/web/components/withdraw-confirmation.js +17 -0
  269. package/dist/web/components/withdraw-destination-input.js +14 -0
  270. package/dist/web/components/withdraw-invoice-info.js +10 -0
  271. package/dist/web/components/withdraw-route-selector.js +9 -0
  272. package/dist/web/components/withdraw-success.js +12 -0
  273. package/dist/web/hooks/use-asset-icon.js +11 -0
  274. package/dist/web/hooks/use-copy-to-clipboard.js +7 -0
  275. package/dist/web/hooks/use-media-query.js +9 -0
  276. package/dist/web/hooks/use-theme-mode.js +9 -0
  277. package/dist/web/hooks/use-toast.js +11 -0
  278. package/dist/web/icons/filled.js +15 -0
  279. package/dist/web/icons/index.js +13 -0
  280. package/dist/web/icons/outlined.js +221 -0
  281. package/dist/web/icons/public.js +248 -0
  282. package/dist/web/icons.cjs +776 -0
  283. package/dist/web/icons.d.cts +123 -0
  284. package/dist/web/icons.d.ts +123 -0
  285. package/dist/web/index.cjs +2547 -2496
  286. package/dist/web/index.d.cts +16 -107
  287. package/dist/web/index.d.ts +16 -107
  288. package/dist/web/index.js +592 -14464
  289. package/dist/web/primitives/avatar.js +10 -0
  290. package/dist/web/primitives/button.js +10 -0
  291. package/dist/web/primitives/card.js +20 -0
  292. package/dist/web/primitives/collapsible.js +16 -0
  293. package/dist/web/primitives/dialog.js +30 -0
  294. package/dist/web/primitives/dot-pagination.js +8 -0
  295. package/dist/web/primitives/drawer.js +43 -0
  296. package/dist/web/primitives/dropdown-menu.js +28 -0
  297. package/dist/web/primitives/glyph-button.js +10 -0
  298. package/dist/web/primitives/icon-button.js +15 -0
  299. package/dist/web/primitives/icon-glyph.js +8 -0
  300. package/dist/web/primitives/icon.js +16 -0
  301. package/dist/web/primitives/input.js +9 -0
  302. package/dist/web/primitives/label.js +9 -0
  303. package/dist/web/primitives/menu-search.js +20 -0
  304. package/dist/web/primitives/number-input.js +11 -0
  305. package/dist/web/primitives/popover.js +18 -0
  306. package/dist/web/primitives/scroll-area.js +12 -0
  307. package/dist/web/primitives/select.js +27 -0
  308. package/dist/web/primitives/switch.js +8 -0
  309. package/dist/web/primitives/table.js +27 -0
  310. package/dist/web/primitives/tabs.js +14 -0
  311. package/dist/web/primitives/toast.js +24 -0
  312. package/dist/web/primitives/toaster.js +15 -0
  313. package/dist/web/primitives/tooltip.js +10 -0
  314. package/dist/web/utils/amount-display.js +13 -0
  315. package/dist/web/utils/cn.js +7 -0
  316. package/dist/web/utils/field-styles.js +7 -0
  317. package/dist/web/utils/type-roles.js +7 -0
  318. package/package.json +9 -1
@@ -0,0 +1,362 @@
1
+ "use client";
2
+ import {
3
+ colors
4
+ } from "./chunk-A7MPRLJL.js";
5
+ import {
6
+ DisclosureCard
7
+ } from "./chunk-TMK3SVYI.js";
8
+ import {
9
+ eyebrow
10
+ } from "./chunk-MTQOAMDW.js";
11
+ import {
12
+ LiquidNetworkIcon,
13
+ OnchainNetworkIcon,
14
+ RgbNetworkIcon
15
+ } from "./chunk-LYCLVP26.js";
16
+ import {
17
+ IconGlyph
18
+ } from "./chunk-YQQ7GDLZ.js";
19
+ import {
20
+ Cancel,
21
+ Check,
22
+ CheckCircle,
23
+ ContentCopy,
24
+ Info,
25
+ ProgressActivity,
26
+ SwapHoriz
27
+ } from "./chunk-XXH4TYKZ.js";
28
+ import {
29
+ cn
30
+ } from "./chunk-PMGIJMRO.js";
31
+
32
+ // src/web/components/deposit-ui-shared.tsx
33
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
34
+ var GLOW_ALPHA = "26";
35
+ function qrGlowStyle(hex) {
36
+ return { boxShadow: `0 0 30px ${hex}${GLOW_ALPHA}` };
37
+ }
38
+ var NETWORK_CONFIG = {
39
+ onchain: {
40
+ label: "On-chain",
41
+ color: colors.network.bitcoin,
42
+ bg: "bg-network-bitcoin/15",
43
+ text: "text-network-bitcoin-fg",
44
+ border: "border-network-bitcoin/40",
45
+ qrBorder: "border-network-bitcoin/30",
46
+ qrGlow: qrGlowStyle(colors.network.bitcoin),
47
+ // On-chain uses the chain mark (as in NetworkBadge) rather than the ₿ coin — the coin reads
48
+ // as "the BTC asset", whereas this row is specifically the *on-chain* (L1)
49
+ // receive rail alongside Lightning/Spark/Arkade, so a chain mark disambiguates.
50
+ icon: /* @__PURE__ */ jsx(OnchainNetworkIcon, { className: "size-3" })
51
+ },
52
+ lightning: {
53
+ label: "Lightning",
54
+ color: colors.network.lightning,
55
+ bg: "bg-network-lightning/15",
56
+ text: "text-network-lightning-fg",
57
+ border: "border-network-lightning/40",
58
+ qrBorder: "border-network-lightning/30",
59
+ qrGlow: qrGlowStyle(colors.network.lightning),
60
+ icon: /* @__PURE__ */ jsx("img", { src: "/icons/lightning/lightning.svg", className: "size-3", alt: "" })
61
+ },
62
+ spark: {
63
+ label: "Spark",
64
+ color: colors.info,
65
+ bg: "bg-info/15",
66
+ text: "text-info-fg",
67
+ border: "border-info/40",
68
+ qrBorder: "border-info/30",
69
+ qrGlow: qrGlowStyle(colors.info),
70
+ icon: /* @__PURE__ */ jsx("img", { src: "/icons/spark/Asterisk/Spark Asterisk White.svg", className: "kui-mono-icon h-3 w-3", alt: "" })
71
+ },
72
+ arkade: {
73
+ label: "Arkade",
74
+ color: colors.network.arkade,
75
+ bg: "bg-network-arkade/15",
76
+ text: "text-network-arkade-fg",
77
+ border: "border-network-arkade/40",
78
+ qrBorder: "border-network-arkade/30",
79
+ qrGlow: qrGlowStyle(colors.network.arkade),
80
+ icon: /* @__PURE__ */ jsx("img", { src: "/icons/arkade/arkade-icon.svg", className: "h-3 w-3 rounded-sm", alt: "" })
81
+ },
82
+ liquid: {
83
+ label: "Liquid",
84
+ color: colors.network.liquid,
85
+ bg: "bg-network-liquid/15",
86
+ text: "text-network-liquid-fg",
87
+ border: "border-network-liquid/40",
88
+ qrBorder: "border-network-liquid/30",
89
+ qrGlow: qrGlowStyle(colors.network.liquid),
90
+ icon: /* @__PURE__ */ jsx(LiquidNetworkIcon, { className: "h-3 w-3" })
91
+ }
92
+ };
93
+ var ACCOUNT_META = {
94
+ RGB: {
95
+ shortLabel: "RGB",
96
+ accentBg: "bg-primary/10",
97
+ accentText: "text-brand",
98
+ accentBorder: "border-primary/30",
99
+ // Bundled RGB mark (protocolIcons) — a host-served /icons/rgb/... path
100
+ // renders as a broken box in consumers that don't ship that asset.
101
+ icon: /* @__PURE__ */ jsx(RgbNetworkIcon, { className: "h-2.5 w-2.5" })
102
+ },
103
+ SPARK: {
104
+ shortLabel: "Spark",
105
+ accentBg: "bg-network-spark/10",
106
+ accentText: "text-network-spark-fg",
107
+ accentBorder: "border-network-spark/30",
108
+ icon: /* @__PURE__ */ jsx(
109
+ "img",
110
+ {
111
+ src: "/icons/spark/Asterisk/Spark Asterisk White.svg",
112
+ alt: "",
113
+ className: "kui-mono-icon h-2.5 w-2.5 object-contain"
114
+ }
115
+ )
116
+ },
117
+ ARKADE: {
118
+ shortLabel: "Arkade",
119
+ accentBg: "bg-network-arkade/10",
120
+ accentText: "text-network-arkade-fg",
121
+ accentBorder: "border-network-arkade/30",
122
+ icon: /* @__PURE__ */ jsx("img", { src: "/icons/arkade/arkade-icon.svg", alt: "", className: "h-2.5 w-2.5 rounded-[1px] object-contain" })
123
+ },
124
+ LIQUID: {
125
+ shortLabel: "Liquid",
126
+ accentBg: "bg-network-liquid/10",
127
+ accentText: "text-network-liquid-fg",
128
+ accentBorder: "border-network-liquid/30",
129
+ icon: /* @__PURE__ */ jsx(LiquidNetworkIcon, { className: "h-2.5 w-2.5" })
130
+ }
131
+ };
132
+ var METHOD_META = {
133
+ bitcoin_l1: { label: "On-chain", icon: /* @__PURE__ */ jsx(OnchainNetworkIcon, { className: "size-3" }) },
134
+ lightning: { label: "Lightning", icon: /* @__PURE__ */ jsx("img", { src: "/icons/lightning/lightning.svg", className: "size-3", alt: "" }) },
135
+ spark: {
136
+ label: "Spark",
137
+ icon: /* @__PURE__ */ jsx("img", { src: "/icons/spark/Asterisk/Spark Asterisk White.svg", className: "kui-mono-icon size-3 object-contain", alt: "" })
138
+ },
139
+ arkade: { label: "Arkade", icon: /* @__PURE__ */ jsx("img", { src: "/icons/arkade/arkade-icon.svg", className: "size-3 rounded-sm object-contain", alt: "" }) },
140
+ // Boarding is on-chain BTC joining Arkade; a submarine swap is a swap between rails.
141
+ boarding: { label: "Boarding", icon: /* @__PURE__ */ jsx(OnchainNetworkIcon, { className: "size-3" }) },
142
+ submarine_swap: { label: "Submarine Swap", icon: /* @__PURE__ */ jsx(IconGlyph, { glyph: SwapHoriz, className: "text-icon-xs" }) }
143
+ };
144
+ function InvoiceStatusBanner({
145
+ isInvoicePending,
146
+ isInvoicePaid,
147
+ isInvoiceFailedOrExpired,
148
+ invoiceStatus
149
+ }) {
150
+ return /* @__PURE__ */ jsxs(
151
+ "div",
152
+ {
153
+ className: cn(
154
+ "flex items-center justify-center gap-2 rounded-xl px-3 py-1.5 text-caption font-bold",
155
+ isInvoicePaid ? "bg-primary/10 text-brand shadow-glow-primary-soft" : isInvoiceFailedOrExpired ? "bg-danger/10 text-danger-fg" : "bg-warning/10 text-warning-fg"
156
+ ),
157
+ children: [
158
+ isInvoicePending && /* @__PURE__ */ jsxs(Fragment, { children: [
159
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: ProgressActivity, className: "animate-spin text-icon-sm" }),
160
+ /* @__PURE__ */ jsx("span", { children: "Waiting for payment..." })
161
+ ] }),
162
+ isInvoicePaid && /* @__PURE__ */ jsxs(Fragment, { children: [
163
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: CheckCircle, className: "text-icon-sm" }),
164
+ /* @__PURE__ */ jsx("span", { children: "Payment received!" })
165
+ ] }),
166
+ isInvoiceFailedOrExpired && /* @__PURE__ */ jsxs(Fragment, { children: [
167
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: Cancel, className: "text-icon-sm" }),
168
+ /* @__PURE__ */ jsxs("span", { children: [
169
+ "Invoice ",
170
+ invoiceStatus?.toLowerCase() === "expired" ? "expired" : "failed"
171
+ ] })
172
+ ] })
173
+ ]
174
+ }
175
+ );
176
+ }
177
+ function PaidOverlay() {
178
+ return (
179
+ // Reaches 3px past the QR card, its radius concentric with the card's
180
+ // rounded-2xl, so neither the card's anti-aliased white edge nor a frame
181
+ // of up to 3px shows at the corners.
182
+ /* @__PURE__ */ jsx("div", { className: "absolute -inset-[3px] flex items-center justify-center rounded-[calc(var(--radius-2xl)+3px)] bg-background/95 bg-gradient-card-hero", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2", children: [
183
+ /* @__PURE__ */ jsx("div", { className: "flex size-14 items-center justify-center rounded-full bg-primary bg-gradient-primary shadow-glow-brand", children: /* @__PURE__ */ jsx(IconGlyph, { glyph: Check, className: "text-icon-4xl text-background" }) }),
184
+ /* @__PURE__ */ jsx("span", { className: "text-body font-bold text-gradient-brand", children: "Received!" })
185
+ ] }) })
186
+ );
187
+ }
188
+ function CopyIcon({ copied, variant = "tile", className }) {
189
+ if (variant === "bare") {
190
+ return /* @__PURE__ */ jsx(
191
+ IconGlyph,
192
+ {
193
+ glyph: copied ? Check : ContentCopy,
194
+ "aria-hidden": "true",
195
+ className: cn("text-icon-sm", copied && "text-brand", className)
196
+ }
197
+ );
198
+ }
199
+ return /* @__PURE__ */ jsx(
200
+ "div",
201
+ {
202
+ className: cn(
203
+ "flex-shrink-0 rounded-lg p-2 transition-all",
204
+ copied ? "bg-primary/15 text-brand shadow-glow-primary-soft" : "bg-secondary/15 text-secondary-content group-hover:bg-secondary group-hover:bg-gradient-violet group-hover:text-white"
205
+ ),
206
+ children: copied ? /* @__PURE__ */ jsx(IconGlyph, { glyph: Check, size: "sm" }) : /* @__PURE__ */ jsx(IconGlyph, { glyph: ContentCopy, size: "sm" })
207
+ }
208
+ );
209
+ }
210
+ function AccountChoiceChip({
211
+ account,
212
+ active,
213
+ onClick,
214
+ label
215
+ }) {
216
+ const meta = ACCOUNT_META[account];
217
+ return /* @__PURE__ */ jsxs(
218
+ "button",
219
+ {
220
+ type: "button",
221
+ onClick,
222
+ "data-testid": `deposit-account-${account.toLowerCase()}`,
223
+ className: cn(
224
+ "flex flex-shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-2.5 py-1.5 text-icon-xxs font-bold transition-all",
225
+ active ? cn(meta.accentText, "bg-primary/10 bg-gradient-active ring-1 ring-inset ring-primary/40 shadow-glow-primary-faint") : "bg-foreground/5 text-muted-foreground hover-gradient-violet hover:text-foreground/80"
226
+ ),
227
+ children: [
228
+ meta.icon,
229
+ /* @__PURE__ */ jsx("span", { children: label ?? meta.shortLabel })
230
+ ]
231
+ }
232
+ );
233
+ }
234
+ var NETWORK_INFO = {
235
+ onchain: {
236
+ title: "On-chain (Bitcoin L1)",
237
+ detail: "Standard Bitcoin transaction. Anyone can pay you from any Bitcoin wallet.",
238
+ bullets: [
239
+ "Settles in about 10 minutes per confirmation",
240
+ "Pays Bitcoin miner fees, which vary with network load",
241
+ "Spark deposits are auto-claimed once confirmed"
242
+ ]
243
+ },
244
+ lightning: {
245
+ title: "Lightning",
246
+ detail: "Instant Bitcoin payments off-chain. Best for small amounts, near-zero fees.",
247
+ bullets: [
248
+ "Settles in seconds, very low fees",
249
+ "Sender needs a Lightning wallet with outbound liquidity",
250
+ "Invoice expires, so generate a fresh one if needed"
251
+ ]
252
+ },
253
+ spark: {
254
+ title: "Spark",
255
+ detail: "Native Spark transfer between Spark wallets. Instant and effectively free.",
256
+ bullets: [
257
+ "Settles instantly between Spark wallets",
258
+ "Sender must use a Spark-compatible wallet",
259
+ "Cannot receive from a regular Bitcoin or Lightning wallet directly"
260
+ ]
261
+ },
262
+ arkade: {
263
+ title: "Arkade",
264
+ detail: "Off-chain VTXO on the Ark protocol. Instant receive, with periodic on-chain settlement.",
265
+ bullets: [
266
+ "Settles instantly between Arkade wallets",
267
+ "Boarding address accepts on-chain Bitcoin and joins the next round",
268
+ "VTXOs require periodic refresh to stay valid"
269
+ ]
270
+ },
271
+ liquid: {
272
+ title: "Liquid",
273
+ detail: "Bitcoin sidechain transaction (L-BTC or Liquid assets). One confidential address receives any Liquid asset.",
274
+ bullets: [
275
+ "Blocks every minute; ~2 confirmations to settle",
276
+ "Amounts are confidential on-chain by default",
277
+ "Sender needs a Liquid wallet (L-BTC or Liquid assets)"
278
+ ]
279
+ }
280
+ };
281
+ var NETWORK_INFO_MARK = {
282
+ onchain: { src: "/logos/protocols/bitcoin.svg", text: "text-network-bitcoin-fg" },
283
+ lightning: { src: "/logos/protocols/lightning.svg", text: "text-network-lightning-fg" },
284
+ spark: { src: "/logos/protocols/spark-asterisk-white.svg", text: "text-network-spark-fg", mono: true },
285
+ arkade: { src: "/logos/protocols/arkade.svg", text: "text-network-arkade-fg" },
286
+ liquid: { src: "/logos/protocols/liquid.svg", text: "text-network-liquid-fg" }
287
+ };
288
+ function NetworkInfoDisclosure({
289
+ networks,
290
+ className
291
+ }) {
292
+ if (networks.length === 0) return null;
293
+ return /* @__PURE__ */ jsx(
294
+ DisclosureCard,
295
+ {
296
+ className,
297
+ triggerClassName: "px-2.5 py-1.5",
298
+ contentClassName: "space-y-2 px-2.5 pb-2.5 pt-1",
299
+ icon: /* @__PURE__ */ jsx(IconGlyph, { glyph: Info, size: "xs", className: "text-secondary-content" }),
300
+ title: /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground", eyebrow), children: "What are these networks?" }),
301
+ children: networks.map((network) => {
302
+ const info = NETWORK_INFO[network];
303
+ const mark = NETWORK_INFO_MARK[network];
304
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
305
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
306
+ network === "onchain" ? /* @__PURE__ */ jsx(OnchainNetworkIcon, {}) : /* @__PURE__ */ jsx(
307
+ "img",
308
+ {
309
+ src: mark.src,
310
+ alt: "",
311
+ className: cn("size-3.5 flex-shrink-0 object-contain", mark.mono && "kui-mono-icon")
312
+ }
313
+ ),
314
+ /* @__PURE__ */ jsx("span", { className: cn(eyebrow, mark.text), children: info.title })
315
+ ] }),
316
+ /* @__PURE__ */ jsx("p", { className: "pl-5 text-tiny leading-snug text-muted-foreground", children: info.detail }),
317
+ /* @__PURE__ */ jsx("ul", { className: "space-y-0.5 pl-5", children: info.bullets.map((bullet) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-1.5 text-xxs leading-snug text-foreground/50", children: [
318
+ /* @__PURE__ */ jsx("span", { className: "mt-[1px] text-foreground/55", children: "-" }),
319
+ /* @__PURE__ */ jsx("span", { children: bullet })
320
+ ] }, bullet)) })
321
+ ] }, network);
322
+ })
323
+ }
324
+ );
325
+ }
326
+ function MethodChoiceChip({
327
+ method,
328
+ active,
329
+ enabled,
330
+ disabledReason,
331
+ onClick
332
+ }) {
333
+ const meta = METHOD_META[method];
334
+ return /* @__PURE__ */ jsxs(
335
+ "button",
336
+ {
337
+ type: "button",
338
+ onClick,
339
+ disabled: !enabled,
340
+ "data-testid": `deposit-method-${method}`,
341
+ className: cn(
342
+ "flex flex-shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-2.5 py-1.5 text-icon-xxs font-bold transition-all",
343
+ active ? "bg-primary bg-gradient-primary text-primary-foreground shadow-button-primary" : enabled ? "bg-foreground/5 text-muted-foreground hover-gradient-violet hover:text-foreground/80" : "cursor-not-allowed bg-foreground/3 text-foreground/20"
344
+ ),
345
+ children: [
346
+ /* @__PURE__ */ jsx("span", { className: cn("flex shrink-0 items-center", !enabled && "opacity-40 grayscale"), children: meta.icon }),
347
+ meta.label,
348
+ !enabled && disabledReason && /* @__PURE__ */ jsx("span", { className: "text-xxs font-normal opacity-60", children: disabledReason })
349
+ ]
350
+ }
351
+ );
352
+ }
353
+
354
+ export {
355
+ NETWORK_CONFIG,
356
+ InvoiceStatusBanner,
357
+ PaidOverlay,
358
+ CopyIcon,
359
+ AccountChoiceChip,
360
+ NetworkInfoDisclosure,
361
+ MethodChoiceChip
362
+ };
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/primitives/card.tsx
7
+ import * as React from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var cardSurface = {
10
+ primary: "rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-card",
11
+ secondary: "rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-card-secondary"
12
+ };
13
+ var Card = React.forwardRef(
14
+ ({ className, variant = "primary", ...props }, ref) => /* @__PURE__ */ jsx(
15
+ "div",
16
+ {
17
+ ref,
18
+ "data-variant": variant,
19
+ className: cn(
20
+ cardSurface[variant],
21
+ // A column, so CardFooter can sit on the bottom edge when the card is
22
+ // taller than its content (a grid row of cards stretches them all).
23
+ "flex flex-col text-card-foreground transition-[color,background-color,box-shadow] duration-300",
24
+ className
25
+ ),
26
+ ...props
27
+ }
28
+ )
29
+ );
30
+ Card.displayName = "Card";
31
+ var CardHeader = React.forwardRef(
32
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props })
33
+ );
34
+ CardHeader.displayName = "CardHeader";
35
+ var CardTitle = React.forwardRef(
36
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
37
+ "h3",
38
+ {
39
+ ref,
40
+ className: cn("text-title font-semibold leading-none tracking-tight", className),
41
+ ...props
42
+ }
43
+ )
44
+ );
45
+ CardTitle.displayName = "CardTitle";
46
+ var CardDescription = React.forwardRef(
47
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("p", { ref, className: cn("text-caption text-muted-foreground", className), ...props })
48
+ );
49
+ CardDescription.displayName = "CardDescription";
50
+ var CardContent = React.forwardRef(
51
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props })
52
+ );
53
+ CardContent.displayName = "CardContent";
54
+ var CardFooter = React.forwardRef(
55
+ ({ className, ...props }, ref) => (
56
+ // mt-auto: the card's actions stay on its bottom edge, however tall it is.
57
+ /* @__PURE__ */ jsx("div", { ref, className: cn("mt-auto flex items-center p-6 pt-0", className), ...props })
58
+ )
59
+ );
60
+ CardFooter.displayName = "CardFooter";
61
+
62
+ export {
63
+ cardSurface,
64
+ Card,
65
+ CardHeader,
66
+ CardTitle,
67
+ CardDescription,
68
+ CardContent,
69
+ CardFooter
70
+ };
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import {
3
+ eyebrow
4
+ } from "./chunk-MTQOAMDW.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+
9
+ // src/web/primitives/label.tsx
10
+ import * as React from "react";
11
+ import * as LabelPrimitive from "@radix-ui/react-label";
12
+ import { jsx } from "react/jsx-runtime";
13
+ var Label = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
14
+ LabelPrimitive.Root,
15
+ {
16
+ ref,
17
+ className: cn(
18
+ "mb-1 inline-block leading-none",
19
+ eyebrow,
20
+ "text-secondary-content peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
21
+ className
22
+ ),
23
+ ...props
24
+ }
25
+ ));
26
+ Label.displayName = LabelPrimitive.Root.displayName;
27
+
28
+ export {
29
+ Label
30
+ };
@@ -0,0 +1,89 @@
1
+ "use client";
2
+ import {
3
+ COPY_FAILED_MESSAGE
4
+ } from "./chunk-QCQRA6L5.js";
5
+ import {
6
+ useCopyToClipboard
7
+ } from "./chunk-BGUBHWIO.js";
8
+ import {
9
+ Button
10
+ } from "./chunk-OWSKP527.js";
11
+ import {
12
+ IconGlyph
13
+ } from "./chunk-YQQ7GDLZ.js";
14
+ import {
15
+ Check,
16
+ ContentCopy,
17
+ Visibility,
18
+ VisibilityOff
19
+ } from "./chunk-XXH4TYKZ.js";
20
+ import {
21
+ cn
22
+ } from "./chunk-PMGIJMRO.js";
23
+
24
+ // src/web/components/secret-reveal-card.tsx
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ function SecretRevealCard({
27
+ value,
28
+ revealed,
29
+ onRevealChange,
30
+ copyValue,
31
+ copiedLabel = "Copied",
32
+ copyFailedMessage = COPY_FAILED_MESSAGE,
33
+ onCopy,
34
+ revealLabel = "Tap to reveal",
35
+ hideLabel = "Hide",
36
+ copyLabel = "Copy",
37
+ className,
38
+ valueClassName
39
+ }) {
40
+ const clipboard = useCopyToClipboard();
41
+ const selfCopy = !onCopy && copyValue !== void 0;
42
+ const handleCopy = onCopy ?? (selfCopy ? () => void clipboard.copy(copyValue) : void 0);
43
+ const copied = selfCopy && clipboard.state === "copied";
44
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
45
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
46
+ /* @__PURE__ */ jsx("div", { className: "rounded-xl bg-card/55 bg-gradient-card px-3 py-3 shadow-inner ring-1 ring-inset ring-secondary/15 backdrop-blur-xl backdrop-saturate-150", children: /* @__PURE__ */ jsx(
47
+ "p",
48
+ {
49
+ className: cn(
50
+ "break-all font-mono text-body text-foreground transition-all duration-300",
51
+ // Hidden: blurred and faded, so the reveal button reads over it.
52
+ !revealed && "pointer-events-none select-none opacity-[var(--app-hidden-opacity)] blur-md",
53
+ valueClassName
54
+ ),
55
+ children: value
56
+ }
57
+ ) }),
58
+ !revealed && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "surface", size: "sm", onClick: () => onRevealChange(true), children: [
59
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: Visibility, className: "text-icon-lg" }),
60
+ revealLabel
61
+ ] }) })
62
+ ] }),
63
+ revealed && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
64
+ /* @__PURE__ */ jsxs(Button, { type: "button", variant: "surface", className: "flex-1", onClick: () => onRevealChange(false), children: [
65
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: VisibilityOff, className: "text-icon-lg" }),
66
+ hideLabel
67
+ ] }),
68
+ handleCopy && /* @__PURE__ */ jsxs(
69
+ Button,
70
+ {
71
+ type: "button",
72
+ variant: "surface",
73
+ onClick: handleCopy,
74
+ className: cn("flex-1", copied && "bg-primary/10 bg-gradient-active text-brand ring-primary/40 hover:ring-primary/50"),
75
+ children: [
76
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: copied ? Check : ContentCopy, className: "text-icon-lg" }),
77
+ copied ? copiedLabel : copyLabel
78
+ ]
79
+ }
80
+ )
81
+ ] }),
82
+ selfCopy && clipboard.state === "failed" && /* @__PURE__ */ jsx("p", { role: "alert", className: "m-0 text-caption text-danger-fg", children: copyFailedMessage }),
83
+ selfCopy && /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "sr-only", children: copied ? copiedLabel : "" })
84
+ ] });
85
+ }
86
+
87
+ export {
88
+ SecretRevealCard
89
+ };
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/components/charts/sparkline.tsx
7
+ import { useEffect, useRef, useState } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ function Sparkline({ values, label, width = 96, height = 28, pulse = false, tone = "default", className }) {
10
+ const fill = height === "fill";
11
+ const boxRef = useRef(null);
12
+ const [measured, setMeasured] = useState(28);
13
+ useEffect(() => {
14
+ const box = boxRef.current;
15
+ if (!fill || !box) return;
16
+ const measure = () => setMeasured(Math.max(16, Math.round(box.getBoundingClientRect().height)));
17
+ measure();
18
+ if (typeof ResizeObserver === "undefined") return;
19
+ const observer = new ResizeObserver(measure);
20
+ observer.observe(box);
21
+ return () => observer.disconnect();
22
+ }, [fill]);
23
+ if (values.length < 2) return null;
24
+ const h = fill ? measured : height;
25
+ const min = Math.min(...values);
26
+ const max = Math.max(...values);
27
+ const span = max - min || 1;
28
+ const pad = 4;
29
+ const x = (index) => pad + index / (values.length - 1) * (width - pad * 2);
30
+ const y = (value) => h - pad - (value - min) / span * (h - pad * 2);
31
+ const d = values.map((value, index) => `${index === 0 ? "M" : "L"}${x(index).toFixed(1)},${y(value).toFixed(1)}`).join("");
32
+ const last = values.length - 1;
33
+ const dot = tone === "negative" ? "var(--color-danger)" : "var(--series-1)";
34
+ const svg = /* @__PURE__ */ jsxs(
35
+ "svg",
36
+ {
37
+ "data-slot": "sparkline",
38
+ role: "img",
39
+ "aria-label": label,
40
+ width,
41
+ height: h,
42
+ viewBox: `0 0 ${width} ${h}`,
43
+ className: cn("block shrink-0 overflow-visible", !fill && className, fill && "absolute inset-y-0 right-0"),
44
+ children: [
45
+ /* @__PURE__ */ jsx("path", { d, fill: "none", stroke: "var(--muted-foreground)", strokeWidth: 1.5, strokeLinejoin: "round", strokeLinecap: "round" }),
46
+ pulse && /* @__PURE__ */ jsx(
47
+ "circle",
48
+ {
49
+ "data-slot": "sparkline-pulse",
50
+ "aria-hidden": "true",
51
+ cx: x(last),
52
+ cy: y(values[last]),
53
+ r: 4,
54
+ fill: dot,
55
+ className: "opacity-0 motion-safe:animate-ping motion-safe:opacity-75",
56
+ style: { transformBox: "fill-box", transformOrigin: "center" }
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsx("circle", { cx: x(last), cy: y(values[last]), r: 4, fill: dot, stroke: "var(--card)", strokeWidth: 2 })
60
+ ]
61
+ }
62
+ );
63
+ if (!fill) return svg;
64
+ return /* @__PURE__ */ jsx("span", { ref: boxRef, className: cn("relative block h-full", className), style: { width }, children: svg });
65
+ }
66
+
67
+ export {
68
+ Sparkline
69
+ };