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,113 @@
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
+ eyebrow
13
+ } from "./chunk-MTQOAMDW.js";
14
+ import {
15
+ IconGlyph
16
+ } from "./chunk-YQQ7GDLZ.js";
17
+ import {
18
+ Check,
19
+ ContentCopy,
20
+ Visibility,
21
+ VisibilityOff
22
+ } from "./chunk-XXH4TYKZ.js";
23
+ import {
24
+ cn
25
+ } from "./chunk-PMGIJMRO.js";
26
+
27
+ // src/web/components/recovery-phrase-card.tsx
28
+ import { jsx, jsxs } from "react/jsx-runtime";
29
+ function RecoveryPhraseCard({
30
+ words,
31
+ revealed = false,
32
+ onRevealChange,
33
+ copyValue,
34
+ copyLabel = "Copy to clipboard",
35
+ copiedLabel = "Copied",
36
+ copyFailedMessage = COPY_FAILED_MESSAGE,
37
+ onCopy,
38
+ title = "Recovery Phrase",
39
+ emptyMessage = "Recovery phrase is not available yet.",
40
+ className
41
+ }) {
42
+ const hasWords = words.length > 0;
43
+ const clipboard = useCopyToClipboard();
44
+ const selfCopy = !onCopy && copyValue !== void 0;
45
+ const handleCopy = onCopy ?? (selfCopy ? () => void clipboard.copy(copyValue) : void 0);
46
+ const copied = selfCopy && clipboard.state === "copied";
47
+ return /* @__PURE__ */ jsxs("section", { className: cn("space-y-2", className), children: [
48
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-0.5", children: [
49
+ /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground", eyebrow), children: title }),
50
+ hasWords && revealed && onRevealChange && /* @__PURE__ */ jsxs(
51
+ Button,
52
+ {
53
+ type: "button",
54
+ variant: "surface",
55
+ size: "xs",
56
+ onClick: () => onRevealChange(!revealed),
57
+ children: [
58
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: VisibilityOff, className: "text-icon-md" }),
59
+ "Hide"
60
+ ]
61
+ }
62
+ )
63
+ ] }),
64
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
65
+ hasWords ? /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ className: cn(
69
+ "grid grid-cols-3 gap-2 transition-all duration-300",
70
+ !revealed && "pointer-events-none select-none blur-sm"
71
+ ),
72
+ children: words.map((word, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 rounded-xl bg-card bg-gradient-card px-3 py-2.5 shadow-raised", children: [
73
+ /* @__PURE__ */ jsx("span", { className: "w-4 shrink-0 text-caption font-bold text-secondary-content", children: index + 1 }),
74
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-body text-foreground", children: word })
75
+ ] }, `${index}-${word}`))
76
+ }
77
+ ) : /* @__PURE__ */ jsx("div", { className: "rounded-xl bg-warning/10 px-4 py-3 text-body text-warning-fg", children: emptyMessage }),
78
+ hasWords && !revealed && onRevealChange && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxs(
79
+ Button,
80
+ {
81
+ type: "button",
82
+ variant: "surface",
83
+ size: "sm",
84
+ onClick: () => onRevealChange(true),
85
+ children: [
86
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: Visibility, className: "text-icon-lg" }),
87
+ "Tap to reveal"
88
+ ]
89
+ }
90
+ ) })
91
+ ] }),
92
+ hasWords && revealed && handleCopy && /* @__PURE__ */ jsxs(
93
+ Button,
94
+ {
95
+ type: "button",
96
+ variant: "surface",
97
+ size: "lg",
98
+ onClick: handleCopy,
99
+ className: cn("w-full", copied && "bg-primary/10 bg-gradient-active text-brand ring-primary/40 hover:ring-primary/50"),
100
+ children: [
101
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: copied ? Check : ContentCopy, className: "text-icon-lg" }),
102
+ copied ? copiedLabel : copyLabel
103
+ ]
104
+ }
105
+ ),
106
+ selfCopy && clipboard.state === "failed" && /* @__PURE__ */ jsx("p", { role: "alert", className: "m-0 text-caption text-danger-fg", children: copyFailedMessage }),
107
+ selfCopy && /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "sr-only", children: copied ? copiedLabel : "" })
108
+ ] });
109
+ }
110
+
111
+ export {
112
+ RecoveryPhraseCard
113
+ };
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/primitives/tooltip.tsx
7
+ import * as React from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var placementClasses = {
10
+ top: "bottom-full left-1/2 mb-2 -translate-x-1/2",
11
+ bottom: "left-1/2 top-full mt-2 -translate-x-1/2",
12
+ right: "left-full top-1/2 ml-3 -translate-y-1/2"
13
+ };
14
+ var TooltipBubble = React.forwardRef(
15
+ ({ id, placement = "bottom", className, children, ...props }, ref) => /* @__PURE__ */ jsx(
16
+ "span",
17
+ {
18
+ ref,
19
+ id,
20
+ role: "tooltip",
21
+ "data-slot": "tooltip",
22
+ className: cn(
23
+ "pointer-events-none absolute z-50 hidden w-max max-w-[16rem] rounded-lg bg-popover px-3 py-2 text-caption font-normal normal-case tracking-normal text-popover-foreground shadow-popover",
24
+ "group-hover/tooltip:block group-focus-within/tooltip:block",
25
+ placementClasses[placement],
26
+ className
27
+ ),
28
+ ...props,
29
+ children
30
+ }
31
+ )
32
+ );
33
+ TooltipBubble.displayName = "TooltipBubble";
34
+ function Tooltip({ content, children, placement = "bottom", className, bubbleClassName }) {
35
+ const id = React.useId();
36
+ const childProps = children.props;
37
+ return /* @__PURE__ */ jsxs("span", { className: cn("group/tooltip relative inline-flex", className), children: [
38
+ React.cloneElement(children, {
39
+ "aria-describedby": cn(childProps["aria-describedby"], id)
40
+ }),
41
+ /* @__PURE__ */ jsx(TooltipBubble, { id, placement, className: bubbleClassName, children: content })
42
+ ] });
43
+ }
44
+ Tooltip.displayName = "Tooltip";
45
+
46
+ export {
47
+ TooltipBubble,
48
+ Tooltip
49
+ };
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/primitives/icon-glyph.tsx
7
+ import { jsx } from "react/jsx-runtime";
8
+ var sizeClasses = {
9
+ xs: "text-icon-sm",
10
+ sm: "text-icon-md",
11
+ md: "text-icon-xl",
12
+ lg: "text-icon-2xl",
13
+ xl: "text-icon-4xl",
14
+ "2xl": "text-icon-5xl"
15
+ };
16
+ function IconGlyph({ glyph: Glyph, size, className, ...props }) {
17
+ return /* @__PURE__ */ jsx(
18
+ Glyph,
19
+ {
20
+ width: "1em",
21
+ height: "1em",
22
+ className: cn("inline-block shrink-0", size && sizeClasses[size], className),
23
+ ...props
24
+ }
25
+ );
26
+ }
27
+
28
+ export {
29
+ IconGlyph
30
+ };
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import {
3
+ Icon
4
+ } from "./chunk-A6MSV4MA.js";
5
+ import {
6
+ isIconName
7
+ } from "./chunk-VYQHGSK6.js";
8
+ import {
9
+ IconGlyph
10
+ } from "./chunk-YQQ7GDLZ.js";
11
+ import {
12
+ ChevronRight
13
+ } from "./chunk-XXH4TYKZ.js";
14
+ import {
15
+ cn
16
+ } from "./chunk-PMGIJMRO.js";
17
+
18
+ // src/web/components/setting-item.tsx
19
+ import { jsx, jsxs } from "react/jsx-runtime";
20
+ function SettingItem({
21
+ icon,
22
+ iconSrc,
23
+ iconAlt,
24
+ title,
25
+ description,
26
+ value,
27
+ onClick,
28
+ showChevron = true,
29
+ className,
30
+ iconColor = "text-secondary-content"
31
+ }) {
32
+ const isClickable = !!onClick;
33
+ return /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ className: cn(
37
+ "p-5 rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-card-secondary transition-all duration-200 group",
38
+ isClickable && "cursor-pointer hover:shadow-card-hover-soft hover:-translate-y-0.5 active:scale-[0.98]",
39
+ className
40
+ ),
41
+ onClick,
42
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
43
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-1 min-w-0", children: [
44
+ (icon || iconSrc) && /* @__PURE__ */ jsx(
45
+ "div",
46
+ {
47
+ className: cn(
48
+ "flex-shrink-0 size-10 rounded-xl flex items-center justify-center bg-secondary/15 group-hover-gradient-violet group-hover:shadow-glow-violet-faint group-hover:scale-105 transition-all",
49
+ iconColor
50
+ ),
51
+ children: iconSrc ? /* @__PURE__ */ jsx("img", { src: iconSrc, alt: iconAlt ?? title, className: "size-5 object-contain" }) : isIconName(icon) ? /* @__PURE__ */ jsx(Icon, { name: icon, className: "text-icon-xl" }) : typeof icon === "string" ? null : icon
52
+ }
53
+ ),
54
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [
55
+ /* @__PURE__ */ jsx("span", { className: "font-bold text-body text-foreground tracking-wide", children: title }),
56
+ description && /* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground mt-0.5 font-medium", children: description })
57
+ ] })
58
+ ] }),
59
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
60
+ value && /* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground font-mono", children: value }),
61
+ showChevron && isClickable && /* @__PURE__ */ jsx(IconGlyph, { glyph: ChevronRight, className: "text-icon-md text-muted-foreground group-hover:scale-110 group-hover:text-secondary-content transition-all" })
62
+ ] })
63
+ ] })
64
+ }
65
+ );
66
+ }
67
+
68
+ export {
69
+ SettingItem
70
+ };
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/components/action-tile.tsx
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ function ActionTile({
9
+ icon,
10
+ label,
11
+ onClick,
12
+ disabled = false,
13
+ className,
14
+ ariaLabel,
15
+ "data-testid": dataTestId,
16
+ href,
17
+ target,
18
+ rel,
19
+ hideLabel = false
20
+ }) {
21
+ const classes = cn(
22
+ "group relative inline-flex h-10 items-center justify-center gap-1.5 overflow-hidden rounded-xl",
23
+ hideLabel ? "w-10 shrink-0" : "flex-1 px-2.5",
24
+ // Icon and label are both the brand green, and flip together to the
25
+ // ink on green when the hover fill shows.
26
+ "bg-foreground/8 bg-gradient-surface text-brand shadow-raised transition-all duration-200",
27
+ // On light, a neutral grey that leans slightly violet toward the bottom
28
+ // right: the ink at low alpha under a faint secondary wash. Important: the
29
+ // dark surface gradient class is unlayered and would win otherwise.
30
+ "[.light_&]:bg-foreground/[0.05] [.light_&]:!bg-gradient-to-br [.light_&]:from-transparent [.light_&]:to-secondary/[0.08]",
31
+ "hover:-translate-y-0.5 hover:text-primary-foreground hover:shadow-glow-primary-soft",
32
+ // The light glow is a 3px ring, which reads as a second border around the
33
+ // green fill: on light the tile keeps its own shadow instead.
34
+ "[.light_&]:hover:shadow-raised",
35
+ "active:translate-y-0 active:scale-95 disabled:pointer-events-none disabled:opacity-50",
36
+ // A link has no disabled state of its own.
37
+ href && disabled && "pointer-events-none opacity-50",
38
+ className
39
+ );
40
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
41
+ /* @__PURE__ */ jsx(
42
+ "span",
43
+ {
44
+ "aria-hidden": "true",
45
+ className: "pointer-events-none absolute inset-0 bg-primary bg-gradient-primary opacity-0 transition-opacity duration-200 group-hover:opacity-100"
46
+ }
47
+ ),
48
+ /* @__PURE__ */ jsx("span", { className: "relative flex shrink-0 items-center justify-center text-current leading-none [&_svg]:size-icon-sm", children: icon }),
49
+ /* @__PURE__ */ jsx("span", { className: cn("relative truncate text-caption font-bold leading-none tracking-wide", hideLabel && "sr-only"), children: label })
50
+ ] });
51
+ if (href) {
52
+ return /* @__PURE__ */ jsx(
53
+ "a",
54
+ {
55
+ href: disabled ? void 0 : href,
56
+ target,
57
+ rel,
58
+ onClick,
59
+ "aria-label": ariaLabel ?? label,
60
+ "aria-disabled": disabled || void 0,
61
+ title: hideLabel ? label : void 0,
62
+ "data-testid": dataTestId,
63
+ className: classes,
64
+ children: content
65
+ }
66
+ );
67
+ }
68
+ return /* @__PURE__ */ jsx(
69
+ "button",
70
+ {
71
+ type: "button",
72
+ onClick,
73
+ disabled,
74
+ "aria-label": ariaLabel ?? label,
75
+ title: hideLabel ? label : void 0,
76
+ "data-testid": dataTestId,
77
+ className: classes,
78
+ children: content
79
+ }
80
+ );
81
+ }
82
+
83
+ export {
84
+ ActionTile
85
+ };
@@ -0,0 +1,139 @@
1
+ "use client";
2
+ import {
3
+ ScrollArea
4
+ } from "./chunk-DCUAE6PX.js";
5
+ import {
6
+ IconGlyph
7
+ } from "./chunk-YQQ7GDLZ.js";
8
+ import {
9
+ Search
10
+ } from "./chunk-XXH4TYKZ.js";
11
+ import {
12
+ cn
13
+ } from "./chunk-PMGIJMRO.js";
14
+
15
+ // src/web/components/inline-selector.tsx
16
+ import { useEffect, useLayoutEffect, useRef, useState } from "react";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
18
+ function InlineSelector({
19
+ label,
20
+ value,
21
+ options,
22
+ onChange,
23
+ disabled = false,
24
+ className,
25
+ triggerClassName,
26
+ panelClassName,
27
+ optionClassName,
28
+ scrollClassName,
29
+ scrollViewportClassName,
30
+ closeOnSelect = true,
31
+ onOpenPanelHeightChange,
32
+ renderTrigger,
33
+ renderPanelHeader,
34
+ renderOption
35
+ }) {
36
+ const [open, setOpen] = useState(false);
37
+ const rootRef = useRef(null);
38
+ const panelRef = useRef(null);
39
+ const onOpenPanelHeightChangeRef = useRef(onOpenPanelHeightChange);
40
+ const selected = options.find((option) => option.id === value);
41
+ const renderArgs = { open, selected, disabled };
42
+ useEffect(() => {
43
+ onOpenPanelHeightChangeRef.current = onOpenPanelHeightChange;
44
+ }, [onOpenPanelHeightChange]);
45
+ useLayoutEffect(() => {
46
+ if (!onOpenPanelHeightChangeRef.current) return;
47
+ if (!open) {
48
+ onOpenPanelHeightChangeRef.current(0);
49
+ return;
50
+ }
51
+ const panel = panelRef.current;
52
+ if (!panel) return;
53
+ const reportHeight = () => {
54
+ onOpenPanelHeightChangeRef.current?.(Math.ceil(panel.getBoundingClientRect().height + 12));
55
+ };
56
+ reportHeight();
57
+ const resizeObserver = new ResizeObserver(reportHeight);
58
+ resizeObserver.observe(panel);
59
+ return () => {
60
+ resizeObserver.disconnect();
61
+ onOpenPanelHeightChangeRef.current?.(0);
62
+ };
63
+ }, [open, options.length]);
64
+ useEffect(() => {
65
+ if (!open) return;
66
+ const handlePointerDown = (event) => {
67
+ const root = rootRef.current;
68
+ if (!root || root.contains(event.target)) return;
69
+ setOpen(false);
70
+ };
71
+ document.addEventListener("pointerdown", handlePointerDown);
72
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
73
+ }, [open]);
74
+ return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: cn("relative min-w-0", className), children: [
75
+ /* @__PURE__ */ jsx(
76
+ "button",
77
+ {
78
+ type: "button",
79
+ disabled,
80
+ "aria-label": label,
81
+ "aria-expanded": open,
82
+ onClick: () => !disabled && setOpen((current) => !current),
83
+ className: cn(
84
+ "w-full outline-none transition-all disabled:cursor-not-allowed disabled:opacity-50",
85
+ triggerClassName
86
+ ),
87
+ children: renderTrigger(renderArgs)
88
+ }
89
+ ),
90
+ open && /* @__PURE__ */ jsxs(
91
+ "div",
92
+ {
93
+ ref: panelRef,
94
+ className: cn(
95
+ "absolute left-0 top-full z-[var(--z-popover)] mt-2 w-full rounded-2xl bg-popover/95 bg-gradient-card p-1.5 shadow-popover backdrop-blur-xl duration-200 animate-in fade-in slide-in-from-top-1",
96
+ panelClassName
97
+ ),
98
+ children: [
99
+ renderPanelHeader?.(renderArgs),
100
+ /* @__PURE__ */ jsx(ScrollArea, { className: cn("max-h-72", scrollClassName), viewportClassName: cn("max-h-72", scrollViewportClassName), children: /* @__PURE__ */ jsx("div", { className: "space-y-1", children: options.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 px-4 py-8 text-center text-caption text-foreground/55", children: [
101
+ /* @__PURE__ */ jsx(IconGlyph, { glyph: Search, size: "md", className: "opacity-40" }),
102
+ /* @__PURE__ */ jsx("span", { children: "No results" })
103
+ ] }) : options.map((option) => {
104
+ const selectedOption = option.id === value;
105
+ const disabledOption = disabled || Boolean(option.disabled);
106
+ return /* @__PURE__ */ jsx(
107
+ "button",
108
+ {
109
+ type: "button",
110
+ disabled: disabledOption,
111
+ "data-selected": selectedOption ? "true" : void 0,
112
+ onClick: () => {
113
+ if (disabledOption) return;
114
+ onChange(option.id);
115
+ if (closeOnSelect) setOpen(false);
116
+ },
117
+ className: cn(
118
+ "w-full rounded-xl text-left outline-none transition-all disabled:cursor-not-allowed disabled:opacity-50",
119
+ selectedOption ? "bg-primary/10 bg-gradient-active ring-1 ring-inset ring-primary/40" : "hover-gradient-violet",
120
+ optionClassName
121
+ ),
122
+ children: renderOption({
123
+ option,
124
+ selected: selectedOption,
125
+ disabled: disabledOption
126
+ })
127
+ },
128
+ option.id
129
+ );
130
+ }) }) })
131
+ ]
132
+ }
133
+ )
134
+ ] });
135
+ }
136
+
137
+ export {
138
+ InlineSelector
139
+ };
@@ -0,0 +1,128 @@
1
+ "use client";
2
+ import {
3
+ Toast,
4
+ ToastClose,
5
+ ToastDescription,
6
+ ToastProvider,
7
+ ToastTitle,
8
+ ToastViewport
9
+ } from "./chunk-2VAS6VYJ.js";
10
+ import {
11
+ useToast
12
+ } from "./chunk-TS4UYWJJ.js";
13
+ import {
14
+ useCopyToClipboard
15
+ } from "./chunk-BGUBHWIO.js";
16
+ import {
17
+ GlyphButton
18
+ } from "./chunk-JY3H7ZAI.js";
19
+ import {
20
+ IconGlyph
21
+ } from "./chunk-YQQ7GDLZ.js";
22
+ import {
23
+ Check,
24
+ CheckCircle,
25
+ ContentCopy,
26
+ Error
27
+ } from "./chunk-XXH4TYKZ.js";
28
+
29
+ // src/web/primitives/toaster.tsx
30
+ import { useEffect, useState } from "react";
31
+ import { jsx, jsxs } from "react/jsx-runtime";
32
+ function toPlainText(node) {
33
+ if (node == null || node === false) return "";
34
+ if (typeof node === "string" || typeof node === "number") return String(node);
35
+ if (Array.isArray(node)) return node.map(toPlainText).join("");
36
+ const kids = node?.props?.children;
37
+ return kids != null ? toPlainText(kids) : "";
38
+ }
39
+ function ToastWithProgress({ id, title, description, action, duration = 4e3, variant, ...props }) {
40
+ const [progress, setProgress] = useState(100);
41
+ const clipboard = useCopyToClipboard();
42
+ const copied = clipboard.state === "copied";
43
+ const copyFailed = clipboard.state === "failed";
44
+ useEffect(() => {
45
+ if (!copied) return;
46
+ const timer = setTimeout(clipboard.reset, 1500);
47
+ return () => clearTimeout(timer);
48
+ }, [copied, clipboard.reset]);
49
+ useEffect(() => {
50
+ const interval = 50;
51
+ const decrement = interval / duration * 100;
52
+ const timer = setInterval(() => {
53
+ setProgress((prev) => {
54
+ const next = prev - decrement;
55
+ return next <= 0 ? 0 : next;
56
+ });
57
+ }, interval);
58
+ return () => clearInterval(timer);
59
+ }, [duration]);
60
+ const getIcon = () => {
61
+ if (variant === "destructive") {
62
+ return /* @__PURE__ */ jsx(IconGlyph, { glyph: Error, size: "md", className: "text-danger-fg" });
63
+ }
64
+ return /* @__PURE__ */ jsx(IconGlyph, { glyph: CheckCircle, size: "md", className: "text-brand" });
65
+ };
66
+ const showCopy = variant === "destructive";
67
+ const copyText = () => {
68
+ const text = [toPlainText(title), toPlainText(description)].filter(Boolean).join("\n");
69
+ if (!text) return;
70
+ void clipboard.copy(text);
71
+ };
72
+ const copyLabel = copied ? "Copied" : copyFailed ? "Copy failed \u2014 select the message and copy it by hand" : "Copy error";
73
+ return /* @__PURE__ */ jsxs(Toast, { ...props, variant, children: [
74
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 flex-1", children: [
75
+ getIcon(),
76
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-1 flex-1", children: [
77
+ title && /* @__PURE__ */ jsx(ToastTitle, { children: title }),
78
+ description && /* @__PURE__ */ jsx(ToastDescription, { className: "select-text", children: description })
79
+ ] })
80
+ ] }),
81
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
82
+ action,
83
+ showCopy && /* @__PURE__ */ jsx(
84
+ GlyphButton,
85
+ {
86
+ icon: copied ? Check : copyFailed ? Error : ContentCopy,
87
+ label: copyLabel,
88
+ size: "sm",
89
+ variant: "danger-subtle",
90
+ onClick: copyText
91
+ }
92
+ ),
93
+ showCopy && /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "sr-only", children: copied ? "Copied" : copyFailed ? copyLabel : "" }),
94
+ /* @__PURE__ */ jsx(ToastClose, { variant })
95
+ ] }),
96
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-0 left-0 right-0 h-1 bg-foreground/10 overflow-hidden", children: /* @__PURE__ */ jsx(
97
+ "div",
98
+ {
99
+ className: `h-full transition-all ease-linear ${variant === "destructive" ? "bg-danger" : "bg-primary bg-gradient-brand"}`,
100
+ style: { width: `${progress}%` }
101
+ }
102
+ ) })
103
+ ] });
104
+ }
105
+ function Toaster() {
106
+ const { toasts } = useToast();
107
+ return /* @__PURE__ */ jsxs(ToastProvider, { children: [
108
+ toasts.map(function({ id, title, description, action, duration, ...props }) {
109
+ return /* @__PURE__ */ jsx(
110
+ ToastWithProgress,
111
+ {
112
+ id,
113
+ title,
114
+ description,
115
+ action,
116
+ duration,
117
+ ...props
118
+ },
119
+ id
120
+ );
121
+ }),
122
+ /* @__PURE__ */ jsx(ToastViewport, {})
123
+ ] });
124
+ }
125
+
126
+ export {
127
+ Toaster
128
+ };