kaleido-ui 0.2.2 → 0.2.5

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 +80 -18
  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-2Q5SSNFO.js +63 -0
  10. package/dist/web/chunk-2VKFRAX3.js +39 -0
  11. package/dist/web/chunk-3CHDKHXW.js +150 -0
  12. package/dist/web/chunk-4BTXTIE6.js +126 -0
  13. package/dist/web/chunk-4L55ANVR.js +330 -0
  14. package/dist/web/chunk-4UMKXXAK.js +33 -0
  15. package/dist/web/chunk-536NL4X2.js +89 -0
  16. package/dist/web/chunk-563GMWFT.js +32 -0
  17. package/dist/web/chunk-5GBURTY4.js +33 -0
  18. package/dist/web/chunk-5INE4WNW.js +291 -0
  19. package/dist/web/chunk-5MM5YGGG.js +43 -0
  20. package/dist/web/chunk-5NCVH6N5.js +81 -0
  21. package/dist/web/chunk-5V2KMO56.js +55 -0
  22. package/dist/web/chunk-5WBAFYPH.js +62 -0
  23. package/dist/web/chunk-6PNGSAJB.js +55 -0
  24. package/dist/web/chunk-7L35JISL.js +106 -0
  25. package/dist/web/chunk-7L7DQFHJ.js +85 -0
  26. package/dist/web/chunk-7OE6AXLY.js +27 -0
  27. package/dist/web/chunk-7Y7FEBKK.js +85 -0
  28. package/dist/web/chunk-A6MSV4MA.js +83 -0
  29. package/dist/web/chunk-A7MPRLJL.js +169 -0
  30. package/dist/web/chunk-AMIAAHZM.js +232 -0
  31. package/dist/web/chunk-ASHU5XNR.js +21 -0
  32. package/dist/web/chunk-AU5ZGWGA.js +247 -0
  33. package/dist/web/chunk-AVJ56TMD.js +107 -0
  34. package/dist/web/chunk-AWKCO62W.js +191 -0
  35. package/dist/web/chunk-BGUBHWIO.js +41 -0
  36. package/dist/web/chunk-BYHIH2LP.js +56 -0
  37. package/dist/web/chunk-CBE7BT3M.js +87 -0
  38. package/dist/web/chunk-CJATW6EO.js +108 -0
  39. package/dist/web/chunk-CPIM2QKZ.js +666 -0
  40. package/dist/web/chunk-CRMLYZIX.js +35 -0
  41. package/dist/web/chunk-CXLGQSHM.js +417 -0
  42. package/dist/web/chunk-CXMCWSWC.js +20 -0
  43. package/dist/web/chunk-CXPYTWEC.js +43 -0
  44. package/dist/web/chunk-CZGN7SQH.js +41 -0
  45. package/dist/web/chunk-CZPNI33A.js +31 -0
  46. package/dist/web/chunk-D2ZG6TZM.js +96 -0
  47. package/dist/web/chunk-D5CPIS6B.js +169 -0
  48. package/dist/web/chunk-DCUAE6PX.js +202 -0
  49. package/dist/web/chunk-DUAFJ3CX.js +179 -0
  50. package/dist/web/chunk-DV66AZXI.js +368 -0
  51. package/dist/web/chunk-DY72P3EE.js +86 -0
  52. package/dist/web/chunk-DZMOH67F.js +43 -0
  53. package/dist/web/chunk-EBQ35SOM.js +177 -0
  54. package/dist/web/chunk-EXWE5KM6.js +48 -0
  55. package/dist/web/chunk-F2LIZX5K.js +140 -0
  56. package/dist/web/chunk-FSQV54O4.js +61 -0
  57. package/dist/web/chunk-G26YNXL3.js +82 -0
  58. package/dist/web/chunk-G2MJL3VP.js +54 -0
  59. package/dist/web/chunk-G2ZYNR3W.js +28 -0
  60. package/dist/web/chunk-GEXPB5CG.js +63 -0
  61. package/dist/web/chunk-GX5URFML.js +375 -0
  62. package/dist/web/chunk-GZZ5KVON.js +70 -0
  63. package/dist/web/chunk-H3GYLFHP.js +30 -0
  64. package/dist/web/chunk-HKF7IPXV.js +146 -0
  65. package/dist/web/chunk-HKIYPISK.js +175 -0
  66. package/dist/web/chunk-HLPL5AHD.js +54 -0
  67. package/dist/web/chunk-HO65ENYH.js +99 -0
  68. package/dist/web/chunk-HP25HN7Q.js +69 -0
  69. package/dist/web/chunk-HVKSBEZN.js +98 -0
  70. package/dist/web/chunk-HWKXZNBN.js +74 -0
  71. package/dist/web/chunk-HY3VMT27.js +64 -0
  72. package/dist/web/chunk-I2N3HZ4M.js +60 -0
  73. package/dist/web/chunk-I7KNV2UC.js +109 -0
  74. package/dist/web/chunk-INKE5FS6.js +128 -0
  75. package/dist/web/chunk-IWDBETXQ.js +254 -0
  76. package/dist/web/chunk-IZCLPO4E.js +42 -0
  77. package/dist/web/chunk-JY3H7ZAI.js +41 -0
  78. package/dist/web/chunk-JYM5NHBA.js +80 -0
  79. package/dist/web/chunk-K7JVP24O.js +89 -0
  80. package/dist/web/chunk-KDNYIMGR.js +197 -0
  81. package/dist/web/chunk-KMQN66HU.js +27 -0
  82. package/dist/web/chunk-LOGZGZWN.js +1 -0
  83. package/dist/web/chunk-LPDB7EHH.js +65 -0
  84. package/dist/web/chunk-LSY4DY2I.js +72 -0
  85. package/dist/web/chunk-LYLWGJ4R.js +66 -0
  86. package/dist/web/chunk-MKMZH4XD.js +98 -0
  87. package/dist/web/chunk-MTQ22SKE.js +39 -0
  88. package/dist/web/chunk-MTQOAMDW.js +8 -0
  89. package/dist/web/chunk-NEXA6VGG.js +91 -0
  90. package/dist/web/chunk-NHOCTXPF.js +151 -0
  91. package/dist/web/chunk-NNGVB3US.js +176 -0
  92. package/dist/web/chunk-NXPVF5WX.js +74 -0
  93. package/dist/web/chunk-O2TTO5FS.js +24 -0
  94. package/dist/web/chunk-O4IIYGDL.js +70 -0
  95. package/dist/web/chunk-OI7WX7NE.js +17 -0
  96. package/dist/web/chunk-OWSKP527.js +80 -0
  97. package/dist/web/chunk-OX3J3FYX.js +64 -0
  98. package/dist/web/chunk-OZXDXNMR.js +110 -0
  99. package/dist/web/chunk-PIXLIWSO.js +62 -0
  100. package/dist/web/chunk-PMGIJMRO.js +207 -0
  101. package/dist/web/chunk-Q2IXLUSM.js +56 -0
  102. package/dist/web/chunk-QGWVZ5NG.js +73 -0
  103. package/dist/web/chunk-QLUUM53Z.js +90 -0
  104. package/dist/web/chunk-QRFFLA3N.js +84 -0
  105. package/dist/web/chunk-QTZT7QMI.js +83 -0
  106. package/dist/web/chunk-QXZ2WY3B.js +38 -0
  107. package/dist/web/chunk-R2MV4S4U.js +50 -0
  108. package/dist/web/chunk-RA5YGBRB.js +106 -0
  109. package/dist/web/chunk-RIOY4LFJ.js +141 -0
  110. package/dist/web/chunk-RULT57JR.js +85 -0
  111. package/dist/web/chunk-RWJHJMVJ.js +67 -0
  112. package/dist/web/chunk-RXXYUYBP.js +25 -0
  113. package/dist/web/chunk-SGXLWU4V.js +96 -0
  114. package/dist/web/chunk-SIE2FP2T.js +62 -0
  115. package/dist/web/chunk-STMNX3QT.js +109 -0
  116. package/dist/web/chunk-SUOATMIA.js +113 -0
  117. package/dist/web/chunk-SVYDLG2C.js +558 -0
  118. package/dist/web/chunk-T2NBG4KF.js +276 -0
  119. package/dist/web/chunk-T7CEJV6P.js +66 -0
  120. package/dist/web/chunk-TAA6PO5V.js +63 -0
  121. package/dist/web/chunk-TI7NWMEQ.js +34 -0
  122. package/dist/web/chunk-TJGHAD5O.js +40 -0
  123. package/dist/web/chunk-TKRMGN7J.js +8 -0
  124. package/dist/web/chunk-TS4UYWJJ.js +105 -0
  125. package/dist/web/chunk-TY6SGZC7.js +94 -0
  126. package/dist/web/chunk-U2UWLSDG.js +86 -0
  127. package/dist/web/chunk-UHXOPILM.js +101 -0
  128. package/dist/web/chunk-UXLWWQ4J.js +20 -0
  129. package/dist/web/chunk-UZ4LWR4X.js +26 -0
  130. package/dist/web/chunk-V3UI2XX7.js +444 -0
  131. package/dist/web/chunk-VAMCLWLF.js +403 -0
  132. package/dist/web/chunk-VLZMX43R.js +45 -0
  133. package/dist/web/chunk-VM6AGMYO.js +46 -0
  134. package/dist/web/chunk-VNL2QI5B.js +43 -0
  135. package/dist/web/chunk-VYQHGSK6.js +244 -0
  136. package/dist/web/chunk-W4E2N3UN.js +58 -0
  137. package/dist/web/chunk-W4G74KFZ.js +362 -0
  138. package/dist/web/chunk-WBW5E6LC.js +101 -0
  139. package/dist/web/chunk-WEPSTI3Z.js +83 -0
  140. package/dist/web/chunk-WOAWUXER.js +139 -0
  141. package/dist/web/chunk-X2RA4EG3.js +86 -0
  142. package/dist/web/chunk-X3MYWPNO.js +230 -0
  143. package/dist/web/chunk-XDSOOOYL.js +35 -0
  144. package/dist/web/chunk-XIMTRQZ3.js +220 -0
  145. package/dist/web/chunk-XMUXOKIP.js +159 -0
  146. package/dist/web/chunk-XXH4TYKZ.js +276 -0
  147. package/dist/web/chunk-XYNURYMC.js +129 -0
  148. package/dist/web/chunk-XZQUQOR3.js +48 -0
  149. package/dist/web/chunk-Y2W5YG6Y.js +57 -0
  150. package/dist/web/chunk-YFYAMVTL.js +383 -0
  151. package/dist/web/chunk-YLP46BJK.js +50 -0
  152. package/dist/web/chunk-YMM73FLL.js +84 -0
  153. package/dist/web/chunk-YQDCU7ZL.js +49 -0
  154. package/dist/web/chunk-YQQ7GDLZ.js +30 -0
  155. package/dist/web/chunk-YRRZ22OK.js +139 -0
  156. package/dist/web/chunk-YXVOFEDT.js +85 -0
  157. package/dist/web/chunk-Z3H2FQVX.js +120 -0
  158. package/dist/web/chunk-ZDCKYQKS.js +108 -0
  159. package/dist/web/chunk-ZR32WYJA.js +55 -0
  160. package/dist/web/chunk-ZTVV4KBT.js +28 -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 +2573 -2507
  286. package/dist/web/index.d.cts +32 -110
  287. package/dist/web/index.d.ts +32 -110
  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,403 @@
1
+ "use client";
2
+ import {
3
+ TooltipBubble
4
+ } from "./chunk-YQDCU7ZL.js";
5
+ import {
6
+ ScrollArea
7
+ } from "./chunk-DCUAE6PX.js";
8
+ import {
9
+ eyebrow
10
+ } from "./chunk-MTQOAMDW.js";
11
+ import {
12
+ GlyphButton
13
+ } from "./chunk-JY3H7ZAI.js";
14
+ import {
15
+ IconGlyph
16
+ } from "./chunk-YQQ7GDLZ.js";
17
+ import {
18
+ cn
19
+ } from "./chunk-PMGIJMRO.js";
20
+ import {
21
+ ChevronLeft,
22
+ ChevronRight
23
+ } from "./chunk-XXH4TYKZ.js";
24
+
25
+ // src/web/primitives/drawer.tsx
26
+ import * as React from "react";
27
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
28
+ import { Slot } from "@radix-ui/react-slot";
29
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
30
+ var DrawerContext = React.createContext({ collapsed: false });
31
+ var DrawerOpenContext = React.createContext(void 0);
32
+ var useDrawerCollapsed = () => React.useContext(DrawerContext).collapsed;
33
+ var panel = "flex h-full flex-col border-r border-divider/30 bg-surface-base bg-gradient-card text-foreground shadow-raised";
34
+ var sectionLabel = cn(eyebrow, "text-muted-foreground");
35
+ var DrawerSidebar = React.forwardRef(
36
+ ({
37
+ className,
38
+ children,
39
+ collapsed = false,
40
+ onCollapsedChange,
41
+ header,
42
+ collapseLabel = "Collapse sidebar",
43
+ expandLabel = "Expand sidebar",
44
+ ...props
45
+ }, ref) => /* @__PURE__ */ jsxs(
46
+ "aside",
47
+ {
48
+ ref,
49
+ "data-state": collapsed ? "collapsed" : "expanded",
50
+ className: cn(
51
+ panel,
52
+ // Sticky rather than fixed, so the page beside it needs no margin
53
+ // kept in step with its width.
54
+ "sticky top-0 h-screen shrink-0 transition-[width] duration-300 ease-in-out motion-reduce:transition-none",
55
+ collapsed ? "w-20" : "w-72",
56
+ className
57
+ ),
58
+ ...props,
59
+ children: [
60
+ (header || onCollapsedChange) && /* @__PURE__ */ jsxs("div", { className: cn("flex items-center px-4 py-5", collapsed ? "justify-center" : "justify-between gap-3"), children: [
61
+ !collapsed && header && /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: header }),
62
+ onCollapsedChange && /* @__PURE__ */ jsx(
63
+ GlyphButton,
64
+ {
65
+ icon: collapsed ? ChevronRight : ChevronLeft,
66
+ label: collapsed ? expandLabel : collapseLabel,
67
+ "aria-expanded": !collapsed,
68
+ onClick: () => onCollapsedChange(!collapsed)
69
+ }
70
+ )
71
+ ] }),
72
+ /* @__PURE__ */ jsx(
73
+ DrawerContext.Provider,
74
+ {
75
+ value: { collapsed, expand: onCollapsedChange ? () => onCollapsedChange(false) : void 0 },
76
+ children
77
+ }
78
+ )
79
+ ]
80
+ }
81
+ )
82
+ );
83
+ DrawerSidebar.displayName = "DrawerSidebar";
84
+ var Drawer = ({
85
+ open: openProp,
86
+ defaultOpen = false,
87
+ onOpenChange,
88
+ ...props
89
+ }) => {
90
+ const [uncontrolled, setUncontrolled] = React.useState(defaultOpen);
91
+ const open = openProp ?? uncontrolled;
92
+ const setOpen = React.useCallback(
93
+ (next) => {
94
+ if (openProp === void 0) setUncontrolled(next);
95
+ onOpenChange?.(next);
96
+ },
97
+ [openProp, onOpenChange]
98
+ );
99
+ const close = React.useCallback(() => setOpen(false), [setOpen]);
100
+ return /* @__PURE__ */ jsx(DrawerOpenContext.Provider, { value: close, children: /* @__PURE__ */ jsx(DialogPrimitive.Root, { open, onOpenChange: setOpen, ...props }) });
101
+ };
102
+ Drawer.displayName = "Drawer";
103
+ var DrawerTrigger = DialogPrimitive.Trigger;
104
+ var DrawerPortal = DialogPrimitive.Portal;
105
+ var DrawerClose = DialogPrimitive.Close;
106
+ var DrawerOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
107
+ DialogPrimitive.Overlay,
108
+ {
109
+ ref,
110
+ className: cn(
111
+ "fixed inset-0 z-50 bg-background/80 backdrop-blur-lg data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out motion-reduce:animate-none",
112
+ className
113
+ ),
114
+ ...props
115
+ }
116
+ ));
117
+ DrawerOverlay.displayName = "DrawerOverlay";
118
+ var DrawerContent = React.forwardRef(({ className, children, header, showClose = true, closeLabel = "Close navigation", ...props }, ref) => {
119
+ const close = React.useContext(DrawerOpenContext);
120
+ return /* @__PURE__ */ jsxs(DrawerPortal, { children: [
121
+ /* @__PURE__ */ jsx(DrawerOverlay, {}),
122
+ /* @__PURE__ */ jsxs(
123
+ DialogPrimitive.Content,
124
+ {
125
+ ref,
126
+ className: cn(
127
+ panel,
128
+ // The expanded sidebar's width, never more than 85% of the viewport so
129
+ // a strip of the page stays visible to tap away.
130
+ "fixed inset-y-0 left-0 z-50 w-72 max-w-[85vw] focus:outline-none data-[state=open]:animate-drawer-in-left data-[state=closed]:animate-drawer-out-left motion-reduce:animate-none",
131
+ className
132
+ ),
133
+ ...props,
134
+ children: [
135
+ (header || showClose) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 px-4 py-5", children: [
136
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: header }),
137
+ showClose && /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(GlyphButton, { icon: ChevronLeft, label: closeLabel }) })
138
+ ] }),
139
+ /* @__PURE__ */ jsx(DrawerContext.Provider, { value: { collapsed: false, close }, children })
140
+ ]
141
+ }
142
+ )
143
+ ] });
144
+ });
145
+ DrawerContent.displayName = "DrawerContent";
146
+ var DrawerTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Title, { ref, className: cn("px-4", sectionLabel, className), ...props }));
147
+ DrawerTitle.displayName = "DrawerTitle";
148
+ var DrawerDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, { ref, className: cn("sr-only", className), ...props }));
149
+ DrawerDescription.displayName = "DrawerDescription";
150
+ var DrawerBody = ({ className, children, ...props }) => /* @__PURE__ */ jsx(ScrollArea, { className: "min-h-0 flex-1", viewportClassName: cn("px-4 py-4", className), ...props, children });
151
+ DrawerBody.displayName = "DrawerBody";
152
+ var DrawerSection = ({ className, label, children, ...props }) => {
153
+ const { collapsed } = React.useContext(DrawerContext);
154
+ return /* @__PURE__ */ jsxs("div", { className: cn("group/section [&+&]:mt-6", className), ...props, children: [
155
+ collapsed ? /* @__PURE__ */ jsx("div", { role: "separator", className: "mx-2 my-3 border-t border-divider/60 group-first/section:hidden" }) : label && /* @__PURE__ */ jsx("div", { className: cn("mb-2 px-4", sectionLabel), children: label }),
156
+ /* @__PURE__ */ jsx("div", { className: "space-y-1.5", children })
157
+ ] });
158
+ };
159
+ DrawerSection.displayName = "DrawerSection";
160
+ var activeIcon = "[&>span[aria-hidden=true]]:text-status-success";
161
+ var activeRow = cn(
162
+ "bg-primary/10 bg-gradient-active font-semibold text-foreground ring-1 ring-inset ring-primary/40 shadow-nav-active",
163
+ activeIcon
164
+ );
165
+ var idleRow = "text-content-secondary hover-gradient-violet hover:text-foreground hover:shadow-raised";
166
+ var DrawerGroupContext = React.createContext(false);
167
+ var DrawerNavItem = React.forwardRef(
168
+ ({ className, icon, label, active = false, asChild = false, disabledReason, children, title, onClick, ...props }, ref) => {
169
+ const { collapsed, close } = React.useContext(DrawerContext);
170
+ const nested = React.useContext(DrawerGroupContext);
171
+ const reasonId = React.useId();
172
+ const restricted = (rowClassName, row) => /* @__PURE__ */ jsxs("span", { "data-slot": "drawer-nav-item-restricted", className: "group/tooltip relative block", children: [
173
+ /* @__PURE__ */ jsx(
174
+ "span",
175
+ {
176
+ role: "link",
177
+ "aria-disabled": "true",
178
+ "aria-describedby": reasonId,
179
+ tabIndex: 0,
180
+ title,
181
+ className: cn(rowClassName, "cursor-not-allowed opacity-50 hover:translate-x-0 hover:scale-100"),
182
+ children: row
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsx(TooltipBubble, { id: reasonId, placement: collapsed ? "right" : "bottom", children: disabledReason })
186
+ ] });
187
+ if (nested) {
188
+ const row = /* @__PURE__ */ jsxs(Fragment, { children: [
189
+ icon && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "flex shrink-0 transition-transform duration-200 hover:scale-110 motion-reduce:transition-none", children: icon }),
190
+ /* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: label })
191
+ ] });
192
+ const rowProps = {
193
+ ref,
194
+ "aria-current": active ? "page" : void 0,
195
+ title,
196
+ className: cn(
197
+ "flex min-w-0 items-center gap-3 rounded-lg px-4 py-2.5 text-caption transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none",
198
+ active ? cn("bg-primary/10 bg-gradient-active font-semibold text-brand", activeIcon) : "text-content-secondary hover:translate-x-1 hover-gradient-violet hover:text-foreground motion-reduce:hover:translate-x-0",
199
+ className
200
+ ),
201
+ onClick: (event) => {
202
+ onClick?.(event);
203
+ close?.();
204
+ },
205
+ ...props
206
+ };
207
+ if (disabledReason) return restricted(rowProps.className, row);
208
+ return asChild && React.isValidElement(children) ? /* @__PURE__ */ jsx(Slot, { ...rowProps, children: React.cloneElement(children, void 0, row) }) : /* @__PURE__ */ jsx("a", { ...rowProps, children: row });
209
+ }
210
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
211
+ icon && /* @__PURE__ */ jsx(
212
+ "span",
213
+ {
214
+ "aria-hidden": "true",
215
+ className: "flex shrink-0 transition-transform duration-300 group-hover:scale-110 motion-reduce:transition-none",
216
+ children: icon
217
+ }
218
+ ),
219
+ /* @__PURE__ */ jsx("span", { className: cn("truncate text-body font-semibold", collapsed && "sr-only"), children: label })
220
+ ] });
221
+ const itemProps = {
222
+ ref,
223
+ "aria-current": active ? "page" : void 0,
224
+ title: title ?? (collapsed && typeof label === "string" ? label : void 0),
225
+ className: cn(
226
+ "group flex min-w-0 items-center rounded-xl px-4 py-3 transition-all duration-300 hover:scale-[1.02] focus:outline-none focus-visible:ring-2 focus-visible:ring-ring active:scale-95 motion-reduce:transition-none motion-reduce:hover:scale-100",
227
+ collapsed ? "justify-center" : "gap-4",
228
+ active ? activeRow : idleRow,
229
+ className
230
+ ),
231
+ // In the mobile drawer, choosing a destination is the end of the errand
232
+ // -- even when the link prevents the default, as a router link does.
233
+ onClick: (event) => {
234
+ onClick?.(event);
235
+ close?.();
236
+ },
237
+ ...props
238
+ };
239
+ if (disabledReason) return restricted(itemProps.className, content);
240
+ const item = asChild && React.isValidElement(children) ? /* @__PURE__ */ jsx(Slot, { ...itemProps, children: React.cloneElement(children, void 0, content) }) : /* @__PURE__ */ jsx("a", { ...itemProps, children: content });
241
+ return item;
242
+ }
243
+ );
244
+ DrawerNavItem.displayName = "DrawerNavItem";
245
+ var DrawerNavGroup = ({
246
+ icon,
247
+ label,
248
+ active = false,
249
+ open: openProp,
250
+ defaultOpen,
251
+ onOpenChange,
252
+ href: hrefProp,
253
+ railHref,
254
+ onNavigate,
255
+ expandGroupLabel,
256
+ children,
257
+ className
258
+ }) => {
259
+ const href = hrefProp ?? railHref;
260
+ const { collapsed, close, expand } = React.useContext(DrawerContext);
261
+ const [uncontrolled, setUncontrolled] = React.useState(defaultOpen ?? active);
262
+ const open = openProp ?? uncontrolled;
263
+ const setOpen = (next) => {
264
+ if (openProp === void 0) setUncontrolled(next);
265
+ onOpenChange?.(next);
266
+ };
267
+ React.useEffect(() => {
268
+ if (active && openProp === void 0) setUncontrolled(true);
269
+ }, [active, openProp]);
270
+ const follow = (event) => {
271
+ if (!href || !onNavigate) return;
272
+ event.preventDefault();
273
+ onNavigate(href);
274
+ };
275
+ const panelId = React.useId();
276
+ const labelId = `${panelId}-label`;
277
+ const rowClass = cn(
278
+ "group flex w-full min-w-0 items-center rounded-xl px-4 py-3 text-left transition-all duration-300 hover:scale-[1.02] focus:outline-none focus-visible:ring-2 focus-visible:ring-ring active:scale-95 motion-reduce:transition-none motion-reduce:hover:scale-100",
279
+ collapsed ? "justify-center" : "gap-4",
280
+ active ? activeRow : idleRow
281
+ );
282
+ const iconNode = icon && /* @__PURE__ */ jsx(
283
+ "span",
284
+ {
285
+ "aria-hidden": "true",
286
+ className: "flex shrink-0 transition-transform duration-300 group-hover:scale-110 motion-reduce:transition-none",
287
+ children: icon
288
+ }
289
+ );
290
+ const rowContent = /* @__PURE__ */ jsxs(Fragment, { children: [
291
+ iconNode,
292
+ /* @__PURE__ */ jsx("span", { id: labelId, className: "min-w-0 flex-1 truncate text-body font-semibold", children: label }),
293
+ /* @__PURE__ */ jsx(
294
+ IconGlyph,
295
+ {
296
+ glyph: ChevronRight,
297
+ className: cn(
298
+ "shrink-0 text-icon-md transition-all duration-300 motion-reduce:transition-none",
299
+ open && "rotate-90"
300
+ )
301
+ }
302
+ )
303
+ ] });
304
+ if (collapsed) {
305
+ const railTitle = typeof label === "string" ? label : void 0;
306
+ return href ? /* @__PURE__ */ jsxs(
307
+ "a",
308
+ {
309
+ href,
310
+ title: railTitle,
311
+ className: cn(rowClass, className),
312
+ onClick: (event) => {
313
+ follow(event);
314
+ setOpen(true);
315
+ expand?.();
316
+ close?.();
317
+ },
318
+ children: [
319
+ iconNode,
320
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
321
+ ]
322
+ }
323
+ ) : expand ? (
324
+ // No first page to go to: the icon unfolds the sidebar onto the group, open.
325
+ /* @__PURE__ */ jsxs(
326
+ "button",
327
+ {
328
+ type: "button",
329
+ title: railTitle,
330
+ "aria-label": expandGroupLabel ?? (railTitle ? `${railTitle}: expand the sidebar to show its pages` : void 0),
331
+ className: cn(rowClass, className),
332
+ onClick: () => {
333
+ setOpen(true);
334
+ expand();
335
+ },
336
+ children: [
337
+ iconNode,
338
+ !expandGroupLabel && !railTitle && /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
339
+ ]
340
+ }
341
+ )
342
+ ) : /* @__PURE__ */ jsxs("div", { title: railTitle, className: cn(rowClass, className), children: [
343
+ iconNode,
344
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
345
+ ] });
346
+ }
347
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
348
+ !open && href ? (
349
+ // Closed, with a first page: the row is a link there, and opens.
350
+ /* @__PURE__ */ jsx(
351
+ "a",
352
+ {
353
+ href,
354
+ "aria-expanded": false,
355
+ "aria-controls": panelId,
356
+ className: rowClass,
357
+ onClick: (event) => {
358
+ follow(event);
359
+ setOpen(true);
360
+ close?.();
361
+ },
362
+ children: rowContent
363
+ }
364
+ )
365
+ ) : /* @__PURE__ */ jsx("button", { type: "button", "aria-expanded": open, "aria-controls": panelId, className: rowClass, onClick: () => setOpen(!open), children: rowContent }),
366
+ open && // A named group, so a screen reader says which submenu its pages belong to.
367
+ /* @__PURE__ */ jsx(
368
+ "div",
369
+ {
370
+ id: panelId,
371
+ role: "group",
372
+ "aria-labelledby": labelId,
373
+ className: "mt-2 space-y-1.5 pl-4 data-[state=open]:animate-fade-in motion-reduce:animate-none",
374
+ "data-state": "open",
375
+ children: /* @__PURE__ */ jsx(DrawerGroupContext.Provider, { value: true, children })
376
+ }
377
+ )
378
+ ] });
379
+ };
380
+ DrawerNavGroup.displayName = "DrawerNavGroup";
381
+ var DrawerFooter = ({ className, children, ...props }) => /* @__PURE__ */ jsxs("div", { className: cn("px-4 pb-4", className), ...props, children: [
382
+ /* @__PURE__ */ jsx("div", { role: "separator", className: "mb-4 border-t border-divider/60" }),
383
+ children
384
+ ] });
385
+ DrawerFooter.displayName = "DrawerFooter";
386
+
387
+ export {
388
+ useDrawerCollapsed,
389
+ DrawerSidebar,
390
+ Drawer,
391
+ DrawerTrigger,
392
+ DrawerPortal,
393
+ DrawerClose,
394
+ DrawerOverlay,
395
+ DrawerContent,
396
+ DrawerTitle,
397
+ DrawerDescription,
398
+ DrawerBody,
399
+ DrawerSection,
400
+ DrawerNavItem,
401
+ DrawerNavGroup,
402
+ DrawerFooter
403
+ };
@@ -0,0 +1,45 @@
1
+ "use client";
2
+
3
+ // src/web/hooks/use-asset-icon.ts
4
+ import { useState, useEffect } from "react";
5
+ var DEFAULT_ICON_CDN_BASE_URL = "https://raw.githubusercontent.com/kaleidoswap/coinmarketcap-icons-cryptos/refs/heads/main/icons/";
6
+ var DICEBEAR_SHAPES_BASE_URL = "https://api.dicebear.com/9.x/shapes/svg";
7
+ var TICKER_MAPPINGS = {
8
+ SAT: "BTC",
9
+ None: ""
10
+ };
11
+ var VALID_ICON_TICKER_REGEX = /^[A-Z0-9-]{1,12}$/;
12
+ function getAssetIconUrl(ticker, cdnBaseUrl = DEFAULT_ICON_CDN_BASE_URL) {
13
+ if (!ticker || ticker.trim() === "") return "";
14
+ const normalized = ticker.toUpperCase().trim();
15
+ if (!VALID_ICON_TICKER_REGEX.test(normalized)) return "";
16
+ if (TICKER_MAPPINGS[normalized] !== void 0) {
17
+ const mapped = TICKER_MAPPINGS[normalized];
18
+ if (mapped === "") return "";
19
+ return getAssetIconUrl(mapped, cdnBaseUrl);
20
+ }
21
+ return `${cdnBaseUrl}${normalized.toLowerCase()}.png`;
22
+ }
23
+ function getFallbackAssetIconUrl(seed) {
24
+ const normalized = seed.trim();
25
+ if (!normalized) return "";
26
+ const params = new URLSearchParams({
27
+ seed: normalized,
28
+ backgroundType: "gradientLinear",
29
+ radius: "50"
30
+ });
31
+ return `${DICEBEAR_SHAPES_BASE_URL}?${params.toString()}`;
32
+ }
33
+ function useAssetIcon(ticker, cdnBaseUrl) {
34
+ const [url, setUrl] = useState(() => getAssetIconUrl(ticker, cdnBaseUrl));
35
+ useEffect(() => {
36
+ setUrl(getAssetIconUrl(ticker, cdnBaseUrl));
37
+ }, [ticker, cdnBaseUrl]);
38
+ return url;
39
+ }
40
+
41
+ export {
42
+ getAssetIconUrl,
43
+ getFallbackAssetIconUrl,
44
+ useAssetIcon
45
+ };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ // src/web/utils/amount-display.ts
4
+ var NUMBER_RE = /^-?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?$/;
5
+ function formatDisplayAmountText(value, options = {}) {
6
+ if (value === null || value === void 0 || value === "") return "";
7
+ const unit = options.unit ?? "token";
8
+ const raw = typeof value === "number" ? String(value) : value.trim();
9
+ const suffixMatch = raw.match(/(\s+[A-Za-z][\w.-]*)$/u);
10
+ const suffix = suffixMatch?.[1] ?? "";
11
+ const detectedUnit = suffix.trim() === "BTC" ? "BTC" : suffix.trim() === "sats" ? "sats" : suffix.trim() === "mBTC" ? "mBTC" : unit;
12
+ const maxDecimals = detectedUnit === "sats" ? 0 : detectedUnit === "BTC" ? 8 : detectedUnit === "mBTC" ? 5 : options.maxDecimals ?? 6;
13
+ const numeric = suffix ? raw.slice(0, -suffix.length) : raw;
14
+ const match = numeric.match(NUMBER_RE);
15
+ if (!match) return raw;
16
+ const num = parseFloat(numeric.replace(/,/g, ""));
17
+ if (!Number.isFinite(num)) return raw;
18
+ const factor = Math.pow(10, maxDecimals);
19
+ const rounded = Math.round(num * factor) / factor;
20
+ const formatted = rounded.toLocaleString("en-US", {
21
+ minimumFractionDigits: 0,
22
+ maximumFractionDigits: maxDecimals
23
+ });
24
+ return `${formatted}${suffix}`;
25
+ }
26
+ var DEFAULT_AMOUNT_LOCALE = "en-US";
27
+ function formatAmount(value, options = {}) {
28
+ if (!Number.isFinite(value)) return String(value);
29
+ return new Intl.NumberFormat(options.locale ?? DEFAULT_AMOUNT_LOCALE, {
30
+ maximumFractionDigits: options.maximumFractionDigits ?? 20
31
+ }).format(value);
32
+ }
33
+ function formatCompactAmount(value, locale = "en-US") {
34
+ if (!Number.isFinite(value)) return String(value);
35
+ return new Intl.NumberFormat(locale, {
36
+ notation: "compact",
37
+ maximumFractionDigits: 2
38
+ }).format(value);
39
+ }
40
+
41
+ export {
42
+ formatDisplayAmountText,
43
+ DEFAULT_AMOUNT_LOCALE,
44
+ formatAmount,
45
+ formatCompactAmount
46
+ };
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import {
3
+ NetworkBadge
4
+ } from "./chunk-EBQ35SOM.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+
9
+ // src/web/components/swap-badge.tsx
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function SwapBadge({ from, to, size = "md", className }) {
12
+ const arrowSize = size === "sm" ? "size-2.5" : "size-3";
13
+ return /* @__PURE__ */ jsxs(
14
+ "span",
15
+ {
16
+ className: cn("inline-flex items-center gap-1", className),
17
+ role: "img",
18
+ "aria-label": `${from} to ${to}`,
19
+ children: [
20
+ /* @__PURE__ */ jsx(NetworkBadge, { network: from, size: size === "sm" ? "sm" : "md" }),
21
+ /* @__PURE__ */ jsx(
22
+ "svg",
23
+ {
24
+ className: cn(arrowSize, "shrink-0 text-secondary-content"),
25
+ viewBox: "0 0 24 24",
26
+ fill: "none",
27
+ stroke: "currentColor",
28
+ strokeWidth: 3,
29
+ strokeLinecap: "round",
30
+ strokeLinejoin: "round",
31
+ "aria-hidden": "true",
32
+ children: /* @__PURE__ */ jsx("path", { d: "M5 12h14M13 6l6 6-6 6" })
33
+ }
34
+ ),
35
+ /* @__PURE__ */ jsx(NetworkBadge, { network: to, size: size === "sm" ? "sm" : "md" })
36
+ ]
37
+ }
38
+ );
39
+ }
40
+
41
+ export {
42
+ SwapBadge
43
+ };