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,139 @@
1
+ "use client";
2
+ import {
3
+ Avatar
4
+ } from "./chunk-W4E2N3UN.js";
5
+ import {
6
+ Icon
7
+ } from "./chunk-A6MSV4MA.js";
8
+ import {
9
+ cn
10
+ } from "./chunk-PMGIJMRO.js";
11
+
12
+ // src/web/components/account-menu.tsx
13
+ import * as React from "react";
14
+ import { Slot } from "@radix-ui/react-slot";
15
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
+ var AccountMenuContext = React.createContext(() => {
17
+ });
18
+ var initialsOf = (name) => (name.trim()[0] ?? "?").toUpperCase();
19
+ function AccountMenu({ name, secondary, label, avatar, header, children, className }) {
20
+ const [open, setOpen] = React.useState(false);
21
+ const rootRef = React.useRef(null);
22
+ const triggerRef = React.useRef(null);
23
+ const panelId = React.useId();
24
+ React.useEffect(() => {
25
+ if (!open) return;
26
+ const onPointerDown = (event) => {
27
+ if (!rootRef.current?.contains(event.target)) setOpen(false);
28
+ };
29
+ const onKeyDown = (event) => {
30
+ if (event.key === "Escape") {
31
+ setOpen(false);
32
+ triggerRef.current?.focus();
33
+ }
34
+ };
35
+ document.addEventListener("pointerdown", onPointerDown);
36
+ document.addEventListener("keydown", onKeyDown);
37
+ return () => {
38
+ document.removeEventListener("pointerdown", onPointerDown);
39
+ document.removeEventListener("keydown", onKeyDown);
40
+ };
41
+ }, [open]);
42
+ const close = React.useCallback(() => setOpen(false), []);
43
+ const avatarNode = (size) => avatar ?? /* @__PURE__ */ jsx(Avatar, { size, initials: initialsOf(name) });
44
+ return /* @__PURE__ */ jsxs(
45
+ "div",
46
+ {
47
+ ref: rootRef,
48
+ "data-slot": "account-menu",
49
+ className: cn("relative", className),
50
+ onBlur: (event) => {
51
+ const next = event.relatedTarget;
52
+ if (next && !rootRef.current?.contains(next)) setOpen(false);
53
+ },
54
+ children: [
55
+ /* @__PURE__ */ jsxs(
56
+ "button",
57
+ {
58
+ ref: triggerRef,
59
+ type: "button",
60
+ "aria-expanded": open,
61
+ "aria-controls": panelId,
62
+ "aria-label": label,
63
+ onClick: () => setOpen((next) => !next),
64
+ className: "group flex items-center gap-2 rounded-xl p-1.5 text-foreground transition-colors duration-300 hover:bg-foreground/[0.06] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:pr-2",
65
+ children: [
66
+ avatarNode("sm"),
67
+ /* @__PURE__ */ jsxs("span", { className: "hidden min-w-0 flex-col text-left sm:flex", children: [
68
+ /* @__PURE__ */ jsx("span", { className: "max-w-[14rem] truncate text-caption font-medium", children: name }),
69
+ secondary && /* @__PURE__ */ jsx("span", { className: "max-w-[14rem] truncate text-mini text-muted-foreground", children: secondary })
70
+ ] }),
71
+ /* @__PURE__ */ jsx(
72
+ Icon,
73
+ {
74
+ name: "expand_more",
75
+ className: cn(
76
+ "hidden text-icon-md text-muted-foreground transition-transform motion-reduce:transition-none sm:block",
77
+ open && "rotate-180"
78
+ )
79
+ }
80
+ )
81
+ ]
82
+ }
83
+ ),
84
+ open && /* @__PURE__ */ jsxs(
85
+ "div",
86
+ {
87
+ id: panelId,
88
+ className: "absolute right-0 top-full z-50 mt-2 w-72 max-w-[calc(100vw-2rem)] overflow-hidden rounded-xl bg-popover text-popover-foreground shadow-popover animate-fade-in motion-reduce:animate-none",
89
+ children: [
90
+ /* @__PURE__ */ jsx("div", { className: "bg-foreground/[0.03] p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
91
+ avatarNode("lg"),
92
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: header ?? /* @__PURE__ */ jsx("div", { className: "truncate text-caption font-medium", children: name }) })
93
+ ] }) }),
94
+ /* @__PURE__ */ jsx(AccountMenuContext.Provider, { value: close, children: /* @__PURE__ */ jsx("div", { className: "py-1", children }) })
95
+ ]
96
+ }
97
+ )
98
+ ]
99
+ }
100
+ );
101
+ }
102
+ var AccountMenuItem = React.forwardRef(
103
+ ({ icon, destructive = false, asChild = false, className, children, onClick, ...props }, ref) => {
104
+ const close = React.useContext(AccountMenuContext);
105
+ const iconNode = icon && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("flex shrink-0", destructive ? "text-danger-fg" : "text-brand"), children: icon });
106
+ const itemProps = {
107
+ className: cn(
108
+ "flex w-full items-center gap-3 px-4 py-3 text-left text-caption font-medium transition-colors focus-visible:bg-foreground/[0.06] focus-visible:outline-none",
109
+ destructive ? "text-danger-fg hover:bg-danger/10" : "text-foreground hover:bg-primary/10",
110
+ className
111
+ ),
112
+ onClick: (event) => {
113
+ onClick?.(event);
114
+ close();
115
+ },
116
+ ...props
117
+ };
118
+ if (asChild && React.isValidElement(children)) {
119
+ return /* @__PURE__ */ jsx(Slot, { ref, ...itemProps, children: React.cloneElement(children, void 0, /* @__PURE__ */ jsxs(Fragment, { children: [
120
+ iconNode,
121
+ children.props.children
122
+ ] })) });
123
+ }
124
+ return /* @__PURE__ */ jsxs("button", { ref, type: "button", ...itemProps, children: [
125
+ iconNode,
126
+ children
127
+ ] });
128
+ }
129
+ );
130
+ AccountMenuItem.displayName = "AccountMenuItem";
131
+ function AccountMenuSeparator() {
132
+ return /* @__PURE__ */ jsx("div", { role: "separator", className: "my-1 border-t border-divider/40" });
133
+ }
134
+
135
+ export {
136
+ AccountMenu,
137
+ AccountMenuItem,
138
+ AccountMenuSeparator
139
+ };
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ import {
3
+ formatAmount
4
+ } from "./chunk-VM6AGMYO.js";
5
+ import {
6
+ eyebrow
7
+ } from "./chunk-MTQOAMDW.js";
8
+ import {
9
+ IconGlyph
10
+ } from "./chunk-YQQ7GDLZ.js";
11
+ import {
12
+ Check
13
+ } from "./chunk-XXH4TYKZ.js";
14
+ import {
15
+ cn
16
+ } from "./chunk-PMGIJMRO.js";
17
+
18
+ // src/web/components/withdraw-success.tsx
19
+ import { jsx, jsxs } from "react/jsx-runtime";
20
+ function WithdrawSuccess({
21
+ displayAmount,
22
+ selectedAssetId,
23
+ selectedAsset,
24
+ txResult,
25
+ handleReset,
26
+ onDone,
27
+ locale
28
+ }) {
29
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex min-h-screen flex-col overflow-hidden bg-background bg-page-radial p-6 font-display text-foreground", children: [
30
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute left-0 top-0 h-full w-full bg-[radial-gradient(ellipse_at_center,_var(--tw-gradient-stops))] from-secondary/40 to-transparent opacity-30" }),
31
+ /* @__PURE__ */ jsxs("div", { className: "z-10 flex flex-1 flex-col items-center justify-center", children: [
32
+ /* @__PURE__ */ jsxs("div", { className: "relative mb-8", children: [
33
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 animate-pulse rounded-full bg-secondary/30 blur-2xl" }),
34
+ /* @__PURE__ */ jsx("div", { className: "relative scale-110 rounded-full bg-primary bg-gradient-primary p-6 text-background shadow-glow-brand", children: /* @__PURE__ */ jsx(IconGlyph, { glyph: Check, className: "text-icon-6xl" }) })
35
+ ] }),
36
+ /* @__PURE__ */ jsx("h1", { className: "mb-2 text-headline font-bold text-gradient-brand", children: "Payment Sent!" }),
37
+ /* @__PURE__ */ jsx("p", { className: "max-w-xs text-center text-muted-foreground", children: "Your transaction has been successfully processed." }),
38
+ /* @__PURE__ */ jsxs("div", { className: "mt-12 w-full max-w-xs space-y-4", children: [
39
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card-hero p-5 shadow-card", children: [
40
+ /* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground", children: "Amount" }),
41
+ /* @__PURE__ */ jsxs("span", { className: "text-title font-bold", children: [
42
+ formatAmount(displayAmount, { locale }),
43
+ " ",
44
+ selectedAssetId === "BTC" ? /* @__PURE__ */ jsx("span", { className: "text-body text-brand/70", children: "sats" }) : selectedAsset?.ticker ?? "units"
45
+ ] })
46
+ ] }),
47
+ (txResult?.paymentHash || txResult?.payment_hash) && /* @__PURE__ */ jsxs("div", { className: "rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card p-5 shadow-card", children: [
48
+ /* @__PURE__ */ jsx("p", { className: cn("mb-2 text-muted-foreground", eyebrow), children: "Payment Hash" }),
49
+ /* @__PURE__ */ jsx("p", { className: "break-all font-mono text-caption leading-relaxed text-muted-foreground", children: txResult.paymentHash ?? txResult.payment_hash })
50
+ ] }),
51
+ txResult?.txid && /* @__PURE__ */ jsxs("div", { className: "rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card p-5 shadow-card", children: [
52
+ /* @__PURE__ */ jsx("p", { className: cn("mb-2 text-muted-foreground", eyebrow), children: "Transaction ID" }),
53
+ /* @__PURE__ */ jsx("p", { className: "break-all font-mono text-caption leading-relaxed text-muted-foreground", children: txResult.txid })
54
+ ] })
55
+ ] })
56
+ ] }),
57
+ /* @__PURE__ */ jsx("div", { className: "z-10 space-y-3 py-6", children: /* @__PURE__ */ jsx(
58
+ "button",
59
+ {
60
+ type: "button",
61
+ onClick: () => {
62
+ handleReset();
63
+ onDone();
64
+ },
65
+ className: "w-full rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card py-4 text-subhead font-bold text-foreground shadow-card transition-all hover-gradient-violet hover:shadow-card-hover active:scale-[0.98]",
66
+ children: "Back to Dashboard"
67
+ }
68
+ ) })
69
+ ] });
70
+ }
71
+
72
+ export {
73
+ WithdrawSuccess
74
+ };
@@ -0,0 +1,330 @@
1
+ "use client";
2
+ import {
3
+ DotPagination
4
+ } from "./chunk-6PNGSAJB.js";
5
+ import {
6
+ AssetIcon
7
+ } from "./chunk-2REWXJEN.js";
8
+ import {
9
+ BottomSheet
10
+ } from "./chunk-JYM5NHBA.js";
11
+ import {
12
+ ScrollArea
13
+ } from "./chunk-DCUAE6PX.js";
14
+ import {
15
+ NetworkBadge
16
+ } from "./chunk-IV6AAVUE.js";
17
+ import {
18
+ GlyphButton
19
+ } from "./chunk-JY3H7ZAI.js";
20
+ import {
21
+ eyebrow
22
+ } from "./chunk-MTQOAMDW.js";
23
+ import {
24
+ LiquidNetworkIcon
25
+ } from "./chunk-LYCLVP26.js";
26
+ import {
27
+ IconGlyph
28
+ } from "./chunk-YQQ7GDLZ.js";
29
+ import {
30
+ Add,
31
+ ArrowBack,
32
+ ArrowForward,
33
+ ExpandLess,
34
+ ExpandMore,
35
+ Search,
36
+ SwapCalls
37
+ } from "./chunk-XXH4TYKZ.js";
38
+ import {
39
+ cn
40
+ } from "./chunk-PMGIJMRO.js";
41
+
42
+ // src/web/components/deposit-asset-selection.tsx
43
+ import { useEffect, useState } from "react";
44
+ import { jsx, jsxs } from "react/jsx-runtime";
45
+ var ADD_ASSET_SUBTITLE = {
46
+ RGB: "RGB asset on Bitcoin",
47
+ SPARK: "Spark-native asset",
48
+ ARKADE: "Arkade-native asset",
49
+ LIQUID: "L-BTC or Liquid asset"
50
+ };
51
+ var PROTOCOL_BADGE = {
52
+ RGB: { label: "RGB", className: "bg-network-rgb-chip text-network-rgb-fg" },
53
+ SPARK: { label: "Spark", className: "bg-network-spark-chip text-network-spark-fg" },
54
+ ARKADE: { label: "Arkade", className: "bg-network-arkade-chip text-network-arkade-fg" },
55
+ LIQUID: { label: "Liquid", className: "bg-network-liquid-chip text-network-liquid-fg" }
56
+ };
57
+ function formatAssetBalance(asset) {
58
+ const raw = asset.balance ?? 0;
59
+ if (raw === 0) return "0";
60
+ const precision = asset.precision ?? 0;
61
+ const value = raw / Math.pow(10, precision);
62
+ return value.toLocaleString("en-US", {
63
+ minimumFractionDigits: 0,
64
+ maximumFractionDigits: Math.min(precision, 8)
65
+ });
66
+ }
67
+ function DepositAssetSelection({
68
+ setCurrentView,
69
+ isNewAsset,
70
+ newAssetAccount,
71
+ newAssetId,
72
+ setNewAssetId,
73
+ searchQuery,
74
+ setSearchQuery,
75
+ filteredAssets,
76
+ onSelectAsset,
77
+ handleAddNewAsset,
78
+ handleContinueToGenerate,
79
+ isRgbConnected,
80
+ isSparkConnected,
81
+ isArkadeConnected,
82
+ isLiquidConnected = false
83
+ }) {
84
+ const btcAsset = filteredAssets.find((asset) => asset.ticker === "BTC");
85
+ const ownedAssets = filteredAssets.filter((asset) => asset.ticker !== "BTC").slice().sort((a, b) => (b.balance ?? 0) - (a.balance ?? 0));
86
+ const ownedAssetsCount = ownedAssets.length;
87
+ const noResults = filteredAssets.length === 0 && !!searchQuery;
88
+ const isSearching = !!searchQuery;
89
+ const [assetsExpanded, setAssetsExpanded] = useState(false);
90
+ const [showAddAssetModal, setShowAddAssetModal] = useState(false);
91
+ useEffect(() => {
92
+ if (isSearching) setAssetsExpanded(true);
93
+ }, [isSearching]);
94
+ const showOwnedAssets = isSearching ? true : assetsExpanded;
95
+ const newAssetOptions = [
96
+ {
97
+ account: "RGB",
98
+ title: "New RGB Asset",
99
+ ticker: "RGB",
100
+ enabled: isRgbConnected,
101
+ idleClass: "bg-primary/10 hover:bg-primary/20",
102
+ activeClass: "bg-primary/25",
103
+ titleHoverClass: "group-hover:text-brand"
104
+ },
105
+ {
106
+ account: "SPARK",
107
+ title: "New Spark Asset",
108
+ ticker: "SPARK",
109
+ enabled: isSparkConnected,
110
+ idleClass: "bg-info/10 hover:bg-info/20",
111
+ activeClass: "bg-info/25",
112
+ titleHoverClass: "group-hover:text-info-fg"
113
+ },
114
+ {
115
+ account: "ARKADE",
116
+ title: "New Arkade Asset",
117
+ ticker: "ARKADE",
118
+ enabled: isArkadeConnected,
119
+ idleClass: "bg-network-arkade/10 hover:bg-network-arkade/20",
120
+ activeClass: "bg-network-arkade/25",
121
+ titleHoverClass: "group-hover:text-network-arkade-fg"
122
+ },
123
+ {
124
+ account: "LIQUID",
125
+ title: "New Liquid Asset",
126
+ ticker: "LIQUID",
127
+ enabled: isLiquidConnected,
128
+ idleClass: "bg-network-liquid/10 hover:bg-network-liquid/20",
129
+ activeClass: "bg-network-liquid/25",
130
+ titleHoverClass: "group-hover:text-network-liquid-fg"
131
+ }
132
+ ].filter((option) => option.enabled);
133
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex h-screen flex-col overflow-hidden bg-background bg-page-radial pt-16 font-display text-foreground", children: [
134
+ /* @__PURE__ */ jsx("div", { className: "absolute left-4 top-4 z-30", children: /* @__PURE__ */ jsx(GlyphButton, { icon: ArrowBack, label: "Go back", size: "lg", onClick: () => setCurrentView("dashboard") }) }),
135
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 px-5 pb-3 pt-4", children: /* @__PURE__ */ jsx(
136
+ DotPagination,
137
+ {
138
+ count: 2,
139
+ index: 0,
140
+ ariaLabel: "Deposit step 1 of 2: select asset"
141
+ }
142
+ ) }),
143
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 px-5 pb-3", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
144
+ /* @__PURE__ */ jsx(
145
+ IconGlyph,
146
+ {
147
+ glyph: Search,
148
+ size: "sm",
149
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-secondary-content"
150
+ }
151
+ ),
152
+ /* @__PURE__ */ jsx(
153
+ "input",
154
+ {
155
+ autoFocus: true,
156
+ "data-testid": "deposit-asset-search",
157
+ className: "w-full rounded-xl bg-card/55 bg-gradient-card ring-1 ring-inset ring-secondary/15 hover:ring-secondary/35 py-2.5 pl-10 pr-4 text-caption text-foreground shadow-inner outline-none transition-all placeholder:text-muted-foreground focus:ring-primary/50 focus:bg-foreground/8 focus:shadow-glow-primary-soft",
158
+ onChange: (event) => setSearchQuery(event.target.value),
159
+ placeholder: "Search assets...",
160
+ type: "text",
161
+ value: searchQuery
162
+ }
163
+ )
164
+ ] }) }),
165
+ /* @__PURE__ */ jsxs(ScrollArea, { className: "min-h-0 flex-1", viewportClassName: "space-y-1.5 px-5 pb-3", children: [
166
+ btcAsset && /* @__PURE__ */ jsxs(
167
+ "button",
168
+ {
169
+ type: "button",
170
+ "data-testid": "deposit-asset-btc",
171
+ className: "group flex w-full min-w-0 items-center gap-3 overflow-hidden rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card px-4 py-3 text-body shadow-card transition-all duration-200 hover-gradient-violet hover:shadow-card-hover",
172
+ onClick: () => onSelectAsset(btcAsset),
173
+ children: [
174
+ /* @__PURE__ */ jsx(AssetIcon, { ticker: "BTC", size: 40, className: "flex-shrink-0" }),
175
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 text-left", children: [
176
+ /* @__PURE__ */ jsx("div", { className: "font-bold tracking-wide text-foreground transition-colors group-hover:text-secondary-content", children: "Bitcoin" }),
177
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-caption text-foreground/55", children: "Choose destination account next" })
178
+ ] }),
179
+ /* @__PURE__ */ jsxs("div", { className: "hidden min-w-0 max-w-[42%] flex-shrink flex-wrap justify-end gap-1 min-[380px]:flex", children: [
180
+ /* @__PURE__ */ jsx(NetworkBadge, { network: "L1", size: "sm" }),
181
+ /* @__PURE__ */ jsx(NetworkBadge, { network: "LN", size: "sm" }),
182
+ isSparkConnected && /* @__PURE__ */ jsx(NetworkBadge, { network: "Spark", size: "sm" }),
183
+ isArkadeConnected && /* @__PURE__ */ jsx(NetworkBadge, { network: "Arkade", size: "sm" }),
184
+ isLiquidConnected && /* @__PURE__ */ jsx(NetworkBadge, { network: "Liquid", size: "sm" })
185
+ ] }),
186
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: ArrowForward, className: "flex-shrink-0 text-icon-md text-foreground/20 transition-colors group-hover:text-secondary-content" })
187
+ ]
188
+ }
189
+ ),
190
+ noResults ? /* @__PURE__ */ jsxs("div", { className: "py-8 text-center text-caption text-foreground/55", children: [
191
+ 'No assets match "',
192
+ searchQuery,
193
+ '"'
194
+ ] }) : ownedAssetsCount > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 pt-1", children: [
195
+ /* @__PURE__ */ jsxs(
196
+ "button",
197
+ {
198
+ type: "button",
199
+ "data-testid": "deposit-toggle-owned-assets",
200
+ onClick: () => !isSearching && setAssetsExpanded((value) => !value),
201
+ disabled: isSearching,
202
+ className: cn(
203
+ "flex w-full items-center gap-2 rounded-2xl px-4 py-2.5 transition-all",
204
+ showOwnedAssets ? "bg-gradient-active ring-1 ring-inset ring-primary/40" : "bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-raised hover-gradient-violet",
205
+ isSearching && "cursor-default"
206
+ ),
207
+ children: [
208
+ /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground", eyebrow), children: "Your assets" }),
209
+ /* @__PURE__ */ jsx("span", { className: "inline-flex size-5 items-center justify-center rounded-full bg-secondary bg-gradient-violet text-tiny font-bold text-white shadow-button-violet", children: ownedAssetsCount }),
210
+ /* @__PURE__ */ jsx("div", { className: "flex-1" }),
211
+ !isSearching && /* @__PURE__ */ jsx(IconGlyph, { glyph: showOwnedAssets ? ExpandLess : ExpandMore, size: "md", className: "text-secondary-content" })
212
+ ]
213
+ }
214
+ ),
215
+ showOwnedAssets && /* @__PURE__ */ jsx("div", { className: "space-y-1.5 duration-200 animate-in fade-in slide-in-from-top-1", children: ownedAssets.map((asset) => {
216
+ const protocolBadge = asset.accountId ? PROTOCOL_BADGE[asset.accountId] : null;
217
+ const balance = asset.balance ?? 0;
218
+ return /* @__PURE__ */ jsxs(
219
+ "button",
220
+ {
221
+ type: "button",
222
+ "data-testid": `deposit-asset-${asset.asset_id}`,
223
+ className: "group flex w-full min-w-0 items-center gap-3 overflow-hidden rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card px-4 py-3 text-body shadow-card transition-all duration-200 hover-gradient-violet hover:shadow-card-hover",
224
+ onClick: () => onSelectAsset(asset),
225
+ children: [
226
+ /* @__PURE__ */ jsx(AssetIcon, { ticker: asset.ticker, size: 40, className: "flex-shrink-0" }),
227
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 text-left", children: [
228
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
229
+ /* @__PURE__ */ jsx("span", { className: "truncate font-bold tracking-wide text-foreground transition-colors group-hover:text-secondary-content", children: asset.ticker }),
230
+ protocolBadge && /* @__PURE__ */ jsx(
231
+ "span",
232
+ {
233
+ className: cn(
234
+ "shrink-0 rounded-full px-1.5 py-0.5",
235
+ eyebrow,
236
+ protocolBadge.className
237
+ ),
238
+ children: protocolBadge.label
239
+ }
240
+ )
241
+ ] }),
242
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 truncate text-caption text-foreground/55", children: asset.name ?? "Asset" })
243
+ ] }),
244
+ balance > 0 && /* @__PURE__ */ jsxs("div", { className: "flex-shrink-0 text-right", children: [
245
+ /* @__PURE__ */ jsx("div", { className: "text-caption font-bold tabular-nums text-foreground", children: formatAssetBalance(asset) }),
246
+ /* @__PURE__ */ jsx("div", { className: cn("mt-0.5 text-foreground/55", eyebrow), children: asset.ticker })
247
+ ] }),
248
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: ArrowForward, className: "flex-shrink-0 text-icon-sm text-foreground/20 transition-colors group-hover:text-secondary-content" })
249
+ ]
250
+ },
251
+ asset.asset_id
252
+ );
253
+ }) })
254
+ ] }) : null,
255
+ !searchQuery && /* @__PURE__ */ jsx("div", { className: "pb-1 pt-2", children: /* @__PURE__ */ jsxs(
256
+ "button",
257
+ {
258
+ type: "button",
259
+ onClick: () => setCurrentView("bridge"),
260
+ className: "group flex w-full items-center gap-3 rounded-2xl bg-gradient-to-r from-secondary/20 to-primary/10 p-3 shadow-card transition-all duration-200 hover:from-secondary/30 hover:to-primary/15 hover:shadow-card-hover",
261
+ children: [
262
+ /* @__PURE__ */ jsx("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-xl bg-secondary bg-gradient-violet text-white shadow-button-violet", children: /* @__PURE__ */ jsx(IconGlyph, { glyph: SwapCalls, className: "text-icon-lg" }) }),
263
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 text-left", children: [
264
+ /* @__PURE__ */ jsx("p", { className: "text-body font-semibold text-foreground transition-colors group-hover:text-secondary-content", children: "Bridge from another chain" }),
265
+ /* @__PURE__ */ jsx("p", { className: "text-xxs leading-tight text-foreground/55", children: "USDC, USDT, ETH, SOL via Flashnet" })
266
+ ] }),
267
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: ArrowForward, className: "text-icon-lg text-foreground/55 transition-colors group-hover:text-secondary-content" })
268
+ ]
269
+ }
270
+ ) }),
271
+ !searchQuery && newAssetOptions.length > 0 && /* @__PURE__ */ jsx("div", { className: "pb-1 pt-2", children: /* @__PURE__ */ jsxs(
272
+ "button",
273
+ {
274
+ type: "button",
275
+ "data-testid": "deposit-add-asset",
276
+ onClick: () => setShowAddAssetModal(true),
277
+ className: "group flex w-full items-center gap-3 rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card p-3 shadow-card transition-all duration-200 hover-gradient-violet hover:shadow-card-hover",
278
+ children: [
279
+ /* @__PURE__ */ jsx("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-xl bg-secondary/15 text-secondary-content", children: /* @__PURE__ */ jsx(IconGlyph, { glyph: Add, size: "md" }) }),
280
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 text-left", children: [
281
+ /* @__PURE__ */ jsx("p", { className: "text-body font-semibold text-foreground transition-colors group-hover:text-secondary-content", children: "Add an asset" }),
282
+ /* @__PURE__ */ jsxs("p", { className: "text-xxs leading-tight text-foreground/55", children: [
283
+ "Receive a new ",
284
+ newAssetOptions.map((o) => o.ticker).join(", "),
285
+ " asset"
286
+ ] })
287
+ ] }),
288
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: ArrowForward, className: "text-icon-lg text-foreground/55 transition-colors group-hover:text-secondary-content" })
289
+ ]
290
+ }
291
+ ) })
292
+ ] }),
293
+ /* @__PURE__ */ jsx(
294
+ BottomSheet,
295
+ {
296
+ open: showAddAssetModal,
297
+ title: "Add an asset",
298
+ onClose: () => setShowAddAssetModal(false),
299
+ children: /* @__PURE__ */ jsx("div", { className: "space-y-2", children: newAssetOptions.map((option) => /* @__PURE__ */ jsxs(
300
+ "button",
301
+ {
302
+ type: "button",
303
+ "data-testid": `deposit-new-asset-${option.account.toLowerCase()}`,
304
+ className: cn(
305
+ "group flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left shadow-raised transition-all hover:shadow-card-hover",
306
+ option.idleClass
307
+ ),
308
+ onClick: () => {
309
+ setShowAddAssetModal(false);
310
+ handleAddNewAsset(option.account);
311
+ },
312
+ children: [
313
+ option.account === "LIQUID" ? /* @__PURE__ */ jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-full bg-network-liquid/10", children: /* @__PURE__ */ jsx(LiquidNetworkIcon, { className: "size-5" }) }) : /* @__PURE__ */ jsx(AssetIcon, { ticker: option.ticker, size: 36, className: "flex-shrink-0" }),
314
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
315
+ /* @__PURE__ */ jsx("div", { className: cn("text-body font-bold tracking-wide text-foreground", option.titleHoverClass), children: option.title }),
316
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-xxs text-foreground/55", children: ADD_ASSET_SUBTITLE[option.account] })
317
+ ] }),
318
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: Add, size: "sm", className: "text-foreground/55 transition-colors group-hover:text-foreground/60" })
319
+ ]
320
+ },
321
+ option.account
322
+ )) })
323
+ }
324
+ )
325
+ ] });
326
+ }
327
+
328
+ export {
329
+ DepositAssetSelection
330
+ };
@@ -0,0 +1,86 @@
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/components/withdraw-route-selector.tsx
10
+ import { useId } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ function RouteChoiceCard({
13
+ route,
14
+ selected,
15
+ recommended,
16
+ onClick,
17
+ displayOnly
18
+ }) {
19
+ const { disabled = false, disabledReason, accountIcon, balanceLabel, accentClassName } = route;
20
+ const body = /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
21
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start gap-3", children: [
22
+ accountIcon && /* @__PURE__ */ jsx("div", { className: "mt-0.5 shrink-0", children: accountIcon }),
23
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
25
+ /* @__PURE__ */ jsx("span", { className: "text-body font-bold text-foreground", children: route.accountTitle }),
26
+ recommended && !disabled && /* @__PURE__ */ jsx("span", { className: cn("rounded-full bg-primary/15 px-2 py-0.5 text-brand", eyebrow), children: "Recommended" }),
27
+ disabled && /* @__PURE__ */ jsx("span", { className: cn("rounded-full bg-danger/10 px-2 py-0.5 text-danger-fg", eyebrow), children: "Insufficient" })
28
+ ] }),
29
+ balanceLabel && /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-caption tabular-nums text-foreground/55", children: balanceLabel })
30
+ ] })
31
+ ] }),
32
+ /* @__PURE__ */ jsx("span", { className: cn("shrink-0 text-foreground/55", eyebrow), children: route.feeHint })
33
+ ] });
34
+ if (displayOnly) {
35
+ return /* @__PURE__ */ jsx("div", { className: "rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card px-4 py-3.5 shadow-card-secondary", children: body });
36
+ }
37
+ return /* @__PURE__ */ jsxs(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ "data-testid": `withdraw-route-${route.account.toLowerCase()}`,
42
+ onClick,
43
+ disabled,
44
+ "aria-disabled": disabled,
45
+ title: disabled ? disabledReason : void 0,
46
+ className: cn(
47
+ "w-full rounded-2xl p-4 text-left transition-all duration-200",
48
+ disabled ? "cursor-not-allowed bg-danger/5 opacity-60" : selected ? cn(
49
+ "bg-gradient-active shadow-glow-primary-faint ring-1 ring-inset ring-primary/40",
50
+ accentClassName ?? "bg-secondary/10"
51
+ ) : "bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-card-secondary hover-gradient-violet hover:shadow-card-hover-soft"
52
+ ),
53
+ children: [
54
+ body,
55
+ disabled && disabledReason && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xxs leading-relaxed text-danger-fg/80", children: disabledReason })
56
+ ]
57
+ }
58
+ );
59
+ }
60
+ function WithdrawRouteSelector({
61
+ routes,
62
+ activeRouteAccount,
63
+ recommendedRouteAccount,
64
+ onRouteChange
65
+ }) {
66
+ const isDisplayOnly = routes.length === 1 && !routes[0].disabled;
67
+ const headingId = useId();
68
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
69
+ /* @__PURE__ */ jsx("p", { id: headingId, className: cn("mb-1 ml-1 block leading-none", eyebrow, "text-secondary-content"), children: "Route" }),
70
+ /* @__PURE__ */ jsx("div", { role: "group", "aria-labelledby": headingId, className: "space-y-2", children: routes.map((route) => /* @__PURE__ */ jsx(
71
+ RouteChoiceCard,
72
+ {
73
+ route,
74
+ selected: activeRouteAccount === route.account,
75
+ recommended: recommendedRouteAccount === route.account,
76
+ onClick: () => onRouteChange(route.account),
77
+ displayOnly: isDisplayOnly
78
+ },
79
+ route.account
80
+ )) })
81
+ ] });
82
+ }
83
+
84
+ export {
85
+ WithdrawRouteSelector
86
+ };
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import {
3
+ GlyphButton
4
+ } from "./chunk-JY3H7ZAI.js";
5
+ import {
6
+ Close
7
+ } from "./chunk-XXH4TYKZ.js";
8
+ import {
9
+ cn
10
+ } from "./chunk-PMGIJMRO.js";
11
+
12
+ // src/web/components/floating-notice.tsx
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ function FloatingNotice({
15
+ children,
16
+ onDismiss,
17
+ dismissible = true,
18
+ dismissLabel = "Dismiss",
19
+ role = "status",
20
+ className
21
+ }) {
22
+ const showClose = dismissible && Boolean(onDismiss);
23
+ return /* @__PURE__ */ jsx(
24
+ "div",
25
+ {
26
+ "data-slot": "floating-notice",
27
+ role,
28
+ className: cn(
29
+ "fixed bottom-4 left-1/2 z-[var(--z-modal)] w-[min(32rem,calc(100vw-2rem))] -translate-x-1/2 rounded-2xl bg-card bg-gradient-card-hero shadow-toast",
30
+ className
31
+ ),
32
+ children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
33
+ children,
34
+ showClose && /* @__PURE__ */ jsx(GlyphButton, { icon: Close, label: dismissLabel, size: "sm", onClick: onDismiss, className: "absolute right-2 top-2" })
35
+ ] })
36
+ }
37
+ );
38
+ }
39
+
40
+ export {
41
+ FloatingNotice
42
+ };