@agg-build/ui 4.26.1 → 4.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/dist/event-trading-state.utils-B3my25Re.mjs +789 -0
  2. package/dist/event-trading-state.utils-s4DEc4iA.js +921 -0
  3. package/dist/events.js +23 -17658
  4. package/dist/events.mjs +3 -50
  5. package/dist/index.js +811 -47152
  6. package/dist/index.mjs +584 -1204
  7. package/dist/list-D8v2SmY1.js +6989 -0
  8. package/dist/list-DD7roCVl.mjs +6838 -0
  9. package/dist/manage-betdex-account-modal-21ZVLsz0.js +2390 -0
  10. package/dist/manage-betdex-account-modal-D2vKHird.mjs +2294 -0
  11. package/dist/modals-BReGwJzz.mjs +2993 -0
  12. package/dist/modals-CSexQO1C.js +3077 -0
  13. package/dist/modals.js +24 -11810
  14. package/dist/modals.mjs +3 -49
  15. package/dist/pages-CMlCYngA.mjs +7846 -0
  16. package/dist/pages-xvAzj6c2.js +7955 -0
  17. package/dist/pages.js +25 -42391
  18. package/dist/pages.mjs +3 -57
  19. package/dist/primitives-CqxNeV7H.js +9930 -0
  20. package/dist/primitives-Dz5aF8ma.mjs +8928 -0
  21. package/dist/primitives.js +102 -11079
  22. package/dist/primitives.mjs +1 -204
  23. package/dist/trading-CDkNdjGx.mjs +7086 -0
  24. package/dist/trading-CXsZFd3l.js +7217 -0
  25. package/dist/trading.js +39 -18215
  26. package/dist/trading.mjs +3 -68
  27. package/dist/types/agg-provider.d.mts +1 -1
  28. package/dist/types/agg-provider.d.ts +1 -1
  29. package/dist/types/auth/connect-button-view/index.d.mts +4 -5
  30. package/dist/types/auth/connect-button-view/index.d.ts +4 -5
  31. package/dist/types/deposit/components/DepositQRCode.d.mts +2 -2
  32. package/dist/types/deposit/components/DepositQRCode.d.ts +2 -2
  33. package/dist/types/deposit/index.d.mts +4 -4
  34. package/dist/types/deposit/index.d.ts +4 -4
  35. package/dist/types/deposit/steps/card-deposit.d.mts +1 -1
  36. package/dist/types/deposit/steps/card-deposit.d.ts +1 -1
  37. package/dist/types/deposit/steps/card-payment-pending.d.mts +1 -1
  38. package/dist/types/deposit/steps/card-payment-pending.d.ts +1 -1
  39. package/dist/types/deposit/steps/card-provider.d.mts +1 -1
  40. package/dist/types/deposit/steps/card-provider.d.ts +1 -1
  41. package/dist/types/deposit/steps/card-purchase-success.d.mts +1 -1
  42. package/dist/types/deposit/steps/card-purchase-success.d.ts +1 -1
  43. package/dist/types/deposit/steps/card-widget.d.mts +1 -1
  44. package/dist/types/deposit/steps/card-widget.d.ts +1 -1
  45. package/dist/types/deposit/steps/crypto-transfer.d.mts +1 -1
  46. package/dist/types/deposit/steps/crypto-transfer.d.ts +1 -1
  47. package/dist/types/deposit/steps/deposit-method.d.mts +2 -1
  48. package/dist/types/deposit/steps/deposit-method.d.ts +2 -1
  49. package/dist/types/deposit/steps/venue-selection.d.mts +1 -1
  50. package/dist/types/deposit/steps/venue-selection.d.ts +1 -1
  51. package/dist/types/deposit/steps/wallet-form.d.mts +1 -1
  52. package/dist/types/deposit/steps/wallet-form.d.ts +1 -1
  53. package/dist/types/deposit/steps/wallet-processing.d.mts +1 -1
  54. package/dist/types/deposit/steps/wallet-processing.d.ts +1 -1
  55. package/dist/types/deposit/steps/wallet-success.d.mts +1 -1
  56. package/dist/types/deposit/steps/wallet-success.d.ts +1 -1
  57. package/dist/types/events/item/event-list-item.utils.d.mts +1 -1
  58. package/dist/types/events/item/event-list-item.utils.d.ts +1 -1
  59. package/dist/types/events/item/index.d.mts +8 -8
  60. package/dist/types/events/item/index.d.ts +8 -8
  61. package/dist/types/events/item-details/event-list-item-details-market-selector.d.mts +1 -1
  62. package/dist/types/events/item-details/event-list-item-details-market-selector.d.ts +1 -1
  63. package/dist/types/events/item-details/event-markets-chart.d.mts +1 -1
  64. package/dist/types/events/item-details/event-markets-chart.d.ts +1 -1
  65. package/dist/types/events/item-details/event-markets-chart.utils.d.mts +1 -1
  66. package/dist/types/events/item-details/event-markets-chart.utils.d.ts +1 -1
  67. package/dist/types/events/item-details/index.d.mts +4 -4
  68. package/dist/types/events/item-details/index.d.ts +4 -4
  69. package/dist/types/events/item-details/settlement-summary.d.mts +4 -4
  70. package/dist/types/events/item-details/settlement-summary.d.ts +4 -4
  71. package/dist/types/events/list/category-sidebar.d.mts +4 -4
  72. package/dist/types/events/list/category-sidebar.d.ts +4 -4
  73. package/dist/types/events/list/event-list-tabs.d.mts +4 -8
  74. package/dist/types/events/list/event-list-tabs.d.ts +4 -8
  75. package/dist/types/events/list/event-list-venue-strip.d.mts +4 -11
  76. package/dist/types/events/list/event-list-venue-strip.d.ts +4 -11
  77. package/dist/types/events/list/index.d.mts +4 -4
  78. package/dist/types/events/list/index.d.ts +4 -4
  79. package/dist/types/events/market-details/index.d.mts +8 -8
  80. package/dist/types/events/market-details/index.d.ts +8 -8
  81. package/dist/types/events/market-details/market-details-graph-panel.d.mts +4 -14
  82. package/dist/types/events/market-details/market-details-graph-panel.d.ts +4 -14
  83. package/dist/types/events/market-details/market-details-outcome-button.d.mts +4 -4
  84. package/dist/types/events/market-details/market-details-outcome-button.d.ts +4 -4
  85. package/dist/types/events/market-details/orderbook-aggregation.d.mts +3 -1
  86. package/dist/types/events/market-details/orderbook-aggregation.d.ts +3 -1
  87. package/dist/types/events/market-details/use-visible-market-streams.d.mts +1 -1
  88. package/dist/types/events/market-details/use-visible-market-streams.d.ts +1 -1
  89. package/dist/types/events/orderbook/index.d.mts +4 -4
  90. package/dist/types/events/orderbook/index.d.ts +4 -4
  91. package/dist/types/events/orderbook/orderbook-with-states.d.mts +4 -4
  92. package/dist/types/events/orderbook/orderbook-with-states.d.ts +4 -4
  93. package/dist/types/events/shared/chart-source-caption.d.mts +1 -1
  94. package/dist/types/events/shared/chart-source-caption.d.ts +1 -1
  95. package/dist/types/events/shared/sports-live-score.d.mts +4 -4
  96. package/dist/types/events/shared/sports-live-score.d.ts +4 -4
  97. package/dist/types/events/shared/use-chart-orderbook.d.mts +3 -3
  98. package/dist/types/events/shared/use-chart-orderbook.d.ts +3 -3
  99. package/dist/types/geo-block-banner/index.d.mts +4 -4
  100. package/dist/types/geo-block-banner/index.d.ts +4 -4
  101. package/dist/types/geo-block-modal/index.d.mts +4 -4
  102. package/dist/types/geo-block-modal/index.d.ts +4 -4
  103. package/dist/types/kyc/shared-kyc-modal.d.mts +4 -4
  104. package/dist/types/kyc/shared-kyc-modal.d.ts +4 -4
  105. package/dist/types/notifications/agg-notification-events-provider.d.mts +1 -1
  106. package/dist/types/notifications/agg-notification-events-provider.d.ts +1 -1
  107. package/dist/types/notifications/agg-toast-provider.d.mts +1 -1
  108. package/dist/types/notifications/agg-toast-provider.d.ts +1 -1
  109. package/dist/types/onboarding/index.d.mts +4 -4
  110. package/dist/types/onboarding/index.d.ts +4 -4
  111. package/dist/types/onboarding/steps/connect-accounts.d.mts +4 -4
  112. package/dist/types/onboarding/steps/connect-accounts.d.ts +4 -4
  113. package/dist/types/onboarding/steps/connect-kalshi-modal.d.mts +4 -4
  114. package/dist/types/onboarding/steps/connect-kalshi-modal.d.ts +4 -4
  115. package/dist/types/onboarding/steps/connect-novig-modal.d.mts +1 -1
  116. package/dist/types/onboarding/steps/connect-novig-modal.d.ts +1 -1
  117. package/dist/types/onboarding/steps/connect-onchain-modal.d.mts +4 -4
  118. package/dist/types/onboarding/steps/connect-onchain-modal.d.ts +4 -4
  119. package/dist/types/onboarding/steps/connect-prophetx-modal.d.mts +1 -1
  120. package/dist/types/onboarding/steps/connect-prophetx-modal.d.ts +1 -1
  121. package/dist/types/onboarding/steps/how-it-works.d.mts +4 -4
  122. package/dist/types/onboarding/steps/how-it-works.d.ts +4 -4
  123. package/dist/types/onboarding/steps/profile-setup.d.mts +4 -4
  124. package/dist/types/onboarding/steps/profile-setup.d.ts +4 -4
  125. package/dist/types/pages/event-market/event-market.shared.d.mts +4 -4
  126. package/dist/types/pages/event-market/event-market.shared.d.ts +4 -4
  127. package/dist/types/pages/event-market/event-market.types.d.mts +2 -0
  128. package/dist/types/pages/event-market/event-market.types.d.ts +2 -0
  129. package/dist/types/pages/event-market/event-open-orders.d.mts +8 -27
  130. package/dist/types/pages/event-market/event-open-orders.d.ts +8 -27
  131. package/dist/types/pages/event-market/index.d.mts +6 -6
  132. package/dist/types/pages/event-market/index.d.ts +6 -6
  133. package/dist/types/pages/event-market/sports-event-market-page.d.mts +6 -6
  134. package/dist/types/pages/event-market/sports-event-market-page.d.ts +6 -6
  135. package/dist/types/pages/event-market/sports-line-rail.d.mts +2 -1
  136. package/dist/types/pages/event-market/sports-line-rail.d.ts +2 -1
  137. package/dist/types/pages/event-market/sports-market-card.d.mts +4 -4
  138. package/dist/types/pages/event-market/sports-market-card.d.ts +4 -4
  139. package/dist/types/pages/event-market/sports-markets.d.mts +4 -4
  140. package/dist/types/pages/event-market/sports-markets.d.ts +4 -4
  141. package/dist/types/pages/home/index.d.mts +6 -6
  142. package/dist/types/pages/home/index.d.ts +6 -6
  143. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.mts +1 -1
  144. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.ts +1 -1
  145. package/dist/types/pages/leaderboard/components/leaderboard-row.d.mts +1 -1
  146. package/dist/types/pages/leaderboard/components/leaderboard-row.d.ts +1 -1
  147. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.mts +1 -1
  148. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.ts +1 -1
  149. package/dist/types/pages/leaderboard/components/segmented-control.d.mts +1 -1
  150. package/dist/types/pages/leaderboard/components/segmented-control.d.ts +1 -1
  151. package/dist/types/pages/leaderboard/index.d.mts +1 -1
  152. package/dist/types/pages/leaderboard/index.d.ts +1 -1
  153. package/dist/types/pages/user-profile/components/activity-row.d.mts +4 -4
  154. package/dist/types/pages/user-profile/components/activity-row.d.ts +4 -4
  155. package/dist/types/pages/user-profile/components/available-balance-card.d.mts +4 -4
  156. package/dist/types/pages/user-profile/components/available-balance-card.d.ts +4 -4
  157. package/dist/types/pages/user-profile/components/balance-display.d.mts +4 -4
  158. package/dist/types/pages/user-profile/components/balance-display.d.ts +4 -4
  159. package/dist/types/pages/user-profile/components/balances-card.d.mts +4 -4
  160. package/dist/types/pages/user-profile/components/balances-card.d.ts +4 -4
  161. package/dist/types/pages/user-profile/components/betdex-account-activity.d.mts +1 -1
  162. package/dist/types/pages/user-profile/components/betdex-account-activity.d.ts +1 -1
  163. package/dist/types/pages/user-profile/components/betdex-account-card.d.mts +1 -1
  164. package/dist/types/pages/user-profile/components/betdex-account-card.d.ts +1 -1
  165. package/dist/types/pages/user-profile/components/betdex-account-transfers.d.mts +1 -1
  166. package/dist/types/pages/user-profile/components/betdex-account-transfers.d.ts +1 -1
  167. package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.mts +1 -1
  168. package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.ts +1 -1
  169. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.mts +1 -1
  170. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.ts +1 -1
  171. package/dist/types/pages/user-profile/components/empty-state.d.mts +4 -4
  172. package/dist/types/pages/user-profile/components/empty-state.d.ts +4 -4
  173. package/dist/types/pages/user-profile/components/manage-balances-modal.d.mts +4 -4
  174. package/dist/types/pages/user-profile/components/manage-balances-modal.d.ts +4 -4
  175. package/dist/types/pages/user-profile/components/open-order-row.d.mts +4 -4
  176. package/dist/types/pages/user-profile/components/open-order-row.d.ts +4 -4
  177. package/dist/types/pages/user-profile/components/position-row.d.mts +4 -4
  178. package/dist/types/pages/user-profile/components/position-row.d.ts +4 -4
  179. package/dist/types/pages/user-profile/components/positions-activity.d.mts +4 -4
  180. package/dist/types/pages/user-profile/components/positions-activity.d.ts +4 -4
  181. package/dist/types/pages/user-profile/components/positions-value-card.d.mts +4 -4
  182. package/dist/types/pages/user-profile/components/positions-value-card.d.ts +4 -4
  183. package/dist/types/pages/user-profile/components/user-info-card.d.mts +4 -4
  184. package/dist/types/pages/user-profile/components/user-info-card.d.ts +4 -4
  185. package/dist/types/pages/user-profile/index.d.mts +6 -6
  186. package/dist/types/pages/user-profile/index.d.ts +6 -6
  187. package/dist/types/paper-trading/paper-onboarding-modal.d.mts +4 -14
  188. package/dist/types/paper-trading/paper-onboarding-modal.d.ts +4 -14
  189. package/dist/types/paper-trading/paper-trading-badge.d.mts +4 -16
  190. package/dist/types/paper-trading/paper-trading-badge.d.ts +4 -16
  191. package/dist/types/paper-trading/paper-trading-onboarding.d.mts +4 -12
  192. package/dist/types/paper-trading/paper-trading-onboarding.d.ts +4 -12
  193. package/dist/types/primitives/agg-logo/agg-logo.utils.d.mts +1 -1
  194. package/dist/types/primitives/agg-logo/agg-logo.utils.d.ts +1 -1
  195. package/dist/types/primitives/agg-logo/index.d.mts +4 -5
  196. package/dist/types/primitives/agg-logo/index.d.ts +4 -5
  197. package/dist/types/primitives/autocomplete-select/index.d.mts +4 -5
  198. package/dist/types/primitives/autocomplete-select/index.d.ts +4 -5
  199. package/dist/types/primitives/badge/index.d.mts +1 -1
  200. package/dist/types/primitives/badge/index.d.ts +1 -1
  201. package/dist/types/primitives/button/button.types.d.mts +2 -2
  202. package/dist/types/primitives/button/button.types.d.ts +2 -2
  203. package/dist/types/primitives/button/index.d.mts +4 -5
  204. package/dist/types/primitives/button/index.d.ts +4 -5
  205. package/dist/types/primitives/calendar/index.d.mts +4 -4
  206. package/dist/types/primitives/calendar/index.d.ts +4 -4
  207. package/dist/types/primitives/card/index.d.mts +4 -5
  208. package/dist/types/primitives/card/index.d.ts +4 -5
  209. package/dist/types/primitives/chart/chart-type-switch.d.mts +4 -5
  210. package/dist/types/primitives/chart/chart-type-switch.d.ts +4 -5
  211. package/dist/types/primitives/chart/index.d.mts +4 -5
  212. package/dist/types/primitives/chart/index.d.ts +4 -5
  213. package/dist/types/primitives/chart/probability-chart.d.mts +2 -2
  214. package/dist/types/primitives/chart/probability-chart.d.ts +2 -2
  215. package/dist/types/primitives/chart/probability-live-tail.d.mts +1 -1
  216. package/dist/types/primitives/chart/probability-live-tail.d.ts +1 -1
  217. package/dist/types/primitives/conditional-wrapper.d.mts +6 -7
  218. package/dist/types/primitives/conditional-wrapper.d.ts +6 -7
  219. package/dist/types/primitives/copy-button/index.d.mts +4 -5
  220. package/dist/types/primitives/copy-button/index.d.ts +4 -5
  221. package/dist/types/primitives/currency-input/index.d.mts +4 -5
  222. package/dist/types/primitives/currency-input/index.d.ts +4 -5
  223. package/dist/types/primitives/footer/agg-build-logo.d.mts +12 -15
  224. package/dist/types/primitives/footer/agg-build-logo.d.ts +12 -15
  225. package/dist/types/primitives/footer/index.d.mts +4 -6
  226. package/dist/types/primitives/footer/index.d.ts +4 -6
  227. package/dist/types/primitives/header/index.d.mts +4 -6
  228. package/dist/types/primitives/header/index.d.ts +4 -6
  229. package/dist/types/primitives/icon/index.d.mts +4 -5
  230. package/dist/types/primitives/icon/index.d.ts +4 -5
  231. package/dist/types/primitives/icon/registry.d.mts +180 -351
  232. package/dist/types/primitives/icon/registry.d.ts +180 -351
  233. package/dist/types/primitives/icon/svg/activity-chart.d.mts +4 -4
  234. package/dist/types/primitives/icon/svg/activity-chart.d.ts +4 -4
  235. package/dist/types/primitives/icon/svg/activity.d.mts +4 -4
  236. package/dist/types/primitives/icon/svg/activity.d.ts +4 -4
  237. package/dist/types/primitives/icon/svg/apple.d.mts +4 -4
  238. package/dist/types/primitives/icon/svg/apple.d.ts +4 -4
  239. package/dist/types/primitives/icon/svg/apps.d.mts +4 -4
  240. package/dist/types/primitives/icon/svg/apps.d.ts +4 -4
  241. package/dist/types/primitives/icon/svg/arbitrum.d.mts +4 -4
  242. package/dist/types/primitives/icon/svg/arbitrum.d.ts +4 -4
  243. package/dist/types/primitives/icon/svg/arrow-right.d.mts +4 -4
  244. package/dist/types/primitives/icon/svg/arrow-right.d.ts +4 -4
  245. package/dist/types/primitives/icon/svg/arrow-trend-up.d.mts +4 -4
  246. package/dist/types/primitives/icon/svg/arrow-trend-up.d.ts +4 -4
  247. package/dist/types/primitives/icon/svg/arrows-to-dot.d.mts +4 -4
  248. package/dist/types/primitives/icon/svg/arrows-to-dot.d.ts +4 -4
  249. package/dist/types/primitives/icon/svg/badge-check-thin.d.mts +4 -4
  250. package/dist/types/primitives/icon/svg/badge-check-thin.d.ts +4 -4
  251. package/dist/types/primitives/icon/svg/bank.d.mts +4 -4
  252. package/dist/types/primitives/icon/svg/bank.d.ts +4 -4
  253. package/dist/types/primitives/icon/svg/base.d.mts +4 -4
  254. package/dist/types/primitives/icon/svg/base.d.ts +4 -4
  255. package/dist/types/primitives/icon/svg/best-prices.d.mts +4 -4
  256. package/dist/types/primitives/icon/svg/best-prices.d.ts +4 -4
  257. package/dist/types/primitives/icon/svg/bnb.d.mts +4 -4
  258. package/dist/types/primitives/icon/svg/bnb.d.ts +4 -4
  259. package/dist/types/primitives/icon/svg/bolt.d.mts +4 -4
  260. package/dist/types/primitives/icon/svg/bolt.d.ts +4 -4
  261. package/dist/types/primitives/icon/svg/calendar.d.mts +1 -1
  262. package/dist/types/primitives/icon/svg/calendar.d.ts +1 -1
  263. package/dist/types/primitives/icon/svg/chart-candlestick.d.mts +4 -4
  264. package/dist/types/primitives/icon/svg/chart-candlestick.d.ts +4 -4
  265. package/dist/types/primitives/icon/svg/chart-line.d.mts +4 -4
  266. package/dist/types/primitives/icon/svg/chart-line.d.ts +4 -4
  267. package/dist/types/primitives/icon/svg/check-badge.d.mts +4 -4
  268. package/dist/types/primitives/icon/svg/check-badge.d.ts +4 -4
  269. package/dist/types/primitives/icon/svg/check-circle.d.mts +4 -4
  270. package/dist/types/primitives/icon/svg/check-circle.d.ts +4 -4
  271. package/dist/types/primitives/icon/svg/chevron-down-thin.d.mts +4 -5
  272. package/dist/types/primitives/icon/svg/chevron-down-thin.d.ts +4 -5
  273. package/dist/types/primitives/icon/svg/chevron-down.d.mts +4 -4
  274. package/dist/types/primitives/icon/svg/chevron-down.d.ts +4 -4
  275. package/dist/types/primitives/icon/svg/chevron-left.d.mts +4 -4
  276. package/dist/types/primitives/icon/svg/chevron-left.d.ts +4 -4
  277. package/dist/types/primitives/icon/svg/chevron-right.d.mts +4 -4
  278. package/dist/types/primitives/icon/svg/chevron-right.d.ts +4 -4
  279. package/dist/types/primitives/icon/svg/chevron-up.d.mts +4 -4
  280. package/dist/types/primitives/icon/svg/chevron-up.d.ts +4 -4
  281. package/dist/types/primitives/icon/svg/circle-overlap.d.mts +4 -4
  282. package/dist/types/primitives/icon/svg/circle-overlap.d.ts +4 -4
  283. package/dist/types/primitives/icon/svg/circle-xmark.d.mts +4 -4
  284. package/dist/types/primitives/icon/svg/circle-xmark.d.ts +4 -4
  285. package/dist/types/primitives/icon/svg/close.d.mts +4 -4
  286. package/dist/types/primitives/icon/svg/close.d.ts +4 -4
  287. package/dist/types/primitives/icon/svg/copy.d.mts +4 -4
  288. package/dist/types/primitives/icon/svg/copy.d.ts +4 -4
  289. package/dist/types/primitives/icon/svg/create-account.d.mts +4 -4
  290. package/dist/types/primitives/icon/svg/create-account.d.ts +4 -4
  291. package/dist/types/primitives/icon/svg/credit-card.d.mts +4 -4
  292. package/dist/types/primitives/icon/svg/credit-card.d.ts +4 -4
  293. package/dist/types/primitives/icon/svg/cross-circle.d.mts +4 -4
  294. package/dist/types/primitives/icon/svg/cross-circle.d.ts +4 -4
  295. package/dist/types/primitives/icon/svg/disconnect.d.mts +4 -4
  296. package/dist/types/primitives/icon/svg/disconnect.d.ts +4 -4
  297. package/dist/types/primitives/icon/svg/discord.d.mts +4 -4
  298. package/dist/types/primitives/icon/svg/discord.d.ts +4 -4
  299. package/dist/types/primitives/icon/svg/document.d.mts +4 -4
  300. package/dist/types/primitives/icon/svg/document.d.ts +4 -4
  301. package/dist/types/primitives/icon/svg/dots-horizontal.d.mts +4 -4
  302. package/dist/types/primitives/icon/svg/dots-horizontal.d.ts +4 -4
  303. package/dist/types/primitives/icon/svg/download.d.mts +4 -4
  304. package/dist/types/primitives/icon/svg/download.d.ts +4 -4
  305. package/dist/types/primitives/icon/svg/email.d.mts +4 -4
  306. package/dist/types/primitives/icon/svg/email.d.ts +4 -4
  307. package/dist/types/primitives/icon/svg/error-filled.d.mts +4 -4
  308. package/dist/types/primitives/icon/svg/error-filled.d.ts +4 -4
  309. package/dist/types/primitives/icon/svg/ethereum.d.mts +4 -4
  310. package/dist/types/primitives/icon/svg/ethereum.d.ts +4 -4
  311. package/dist/types/primitives/icon/svg/external-link.d.mts +4 -4
  312. package/dist/types/primitives/icon/svg/external-link.d.ts +4 -4
  313. package/dist/types/primitives/icon/svg/gift-bonus.d.mts +4 -4
  314. package/dist/types/primitives/icon/svg/gift-bonus.d.ts +4 -4
  315. package/dist/types/primitives/icon/svg/google.d.mts +4 -4
  316. package/dist/types/primitives/icon/svg/google.d.ts +4 -4
  317. package/dist/types/primitives/icon/svg/hourglass-start.d.mts +4 -4
  318. package/dist/types/primitives/icon/svg/hourglass-start.d.ts +4 -4
  319. package/dist/types/primitives/icon/svg/image.d.mts +4 -4
  320. package/dist/types/primitives/icon/svg/image.d.ts +4 -4
  321. package/dist/types/primitives/icon/svg/info.d.mts +4 -4
  322. package/dist/types/primitives/icon/svg/info.d.ts +4 -4
  323. package/dist/types/primitives/icon/svg/internet-security.d.mts +4 -4
  324. package/dist/types/primitives/icon/svg/internet-security.d.ts +4 -4
  325. package/dist/types/primitives/icon/svg/link-accounts.d.mts +4 -4
  326. package/dist/types/primitives/icon/svg/link-accounts.d.ts +4 -4
  327. package/dist/types/primitives/icon/svg/lock.d.mts +4 -4
  328. package/dist/types/primitives/icon/svg/lock.d.ts +4 -4
  329. package/dist/types/primitives/icon/svg/minus.d.mts +1 -1
  330. package/dist/types/primitives/icon/svg/minus.d.ts +1 -1
  331. package/dist/types/primitives/icon/svg/paper-buying-power.d.mts +4 -10
  332. package/dist/types/primitives/icon/svg/paper-buying-power.d.ts +4 -10
  333. package/dist/types/primitives/icon/svg/paper-earnings.d.mts +4 -10
  334. package/dist/types/primitives/icon/svg/paper-earnings.d.ts +4 -10
  335. package/dist/types/primitives/icon/svg/paper-mode.d.mts +4 -4
  336. package/dist/types/primitives/icon/svg/paper-mode.d.ts +4 -4
  337. package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.mts +4 -11
  338. package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.ts +4 -11
  339. package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.mts +4 -11
  340. package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.ts +4 -11
  341. package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.mts +4 -11
  342. package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.ts +4 -11
  343. package/dist/types/primitives/icon/svg/paper-plane.d.mts +4 -4
  344. package/dist/types/primitives/icon/svg/paper-plane.d.ts +4 -4
  345. package/dist/types/primitives/icon/svg/pencil.d.mts +4 -4
  346. package/dist/types/primitives/icon/svg/pencil.d.ts +4 -4
  347. package/dist/types/primitives/icon/svg/play-square.d.mts +4 -4
  348. package/dist/types/primitives/icon/svg/play-square.d.ts +4 -4
  349. package/dist/types/primitives/icon/svg/plus.d.mts +1 -1
  350. package/dist/types/primitives/icon/svg/plus.d.ts +1 -1
  351. package/dist/types/primitives/icon/svg/polygon.d.mts +4 -4
  352. package/dist/types/primitives/icon/svg/polygon.d.ts +4 -4
  353. package/dist/types/primitives/icon/svg/profile-about-tab.d.mts +4 -5
  354. package/dist/types/primitives/icon/svg/profile-about-tab.d.ts +4 -5
  355. package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.mts +4 -5
  356. package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.ts +4 -5
  357. package/dist/types/primitives/icon/svg/profile.d.mts +4 -4
  358. package/dist/types/primitives/icon/svg/profile.d.ts +4 -4
  359. package/dist/types/primitives/icon/svg/quotes-warning.d.mts +4 -5
  360. package/dist/types/primitives/icon/svg/quotes-warning.d.ts +4 -5
  361. package/dist/types/primitives/icon/svg/recenter.d.mts +4 -4
  362. package/dist/types/primitives/icon/svg/recenter.d.ts +4 -4
  363. package/dist/types/primitives/icon/svg/revenue-alt.d.mts +4 -4
  364. package/dist/types/primitives/icon/svg/revenue-alt.d.ts +4 -4
  365. package/dist/types/primitives/icon/svg/search.d.mts +4 -4
  366. package/dist/types/primitives/icon/svg/search.d.ts +4 -4
  367. package/dist/types/primitives/icon/svg/shield-trust.d.mts +4 -4
  368. package/dist/types/primitives/icon/svg/shield-trust.d.ts +4 -4
  369. package/dist/types/primitives/icon/svg/solana.d.mts +4 -4
  370. package/dist/types/primitives/icon/svg/solana.d.ts +4 -4
  371. package/dist/types/primitives/icon/svg/sort-end-date.d.mts +4 -4
  372. package/dist/types/primitives/icon/svg/sort-end-date.d.ts +4 -4
  373. package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.mts +4 -4
  374. package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.ts +4 -4
  375. package/dist/types/primitives/icon/svg/sort-volume-24hr.d.mts +4 -4
  376. package/dist/types/primitives/icon/svg/sort-volume-24hr.d.ts +4 -4
  377. package/dist/types/primitives/icon/svg/sort-volume.d.mts +4 -4
  378. package/dist/types/primitives/icon/svg/sort-volume.d.ts +4 -4
  379. package/dist/types/primitives/icon/svg/sparkles-filled.d.mts +4 -4
  380. package/dist/types/primitives/icon/svg/sparkles-filled.d.ts +4 -4
  381. package/dist/types/primitives/icon/svg/spinner.d.mts +4 -4
  382. package/dist/types/primitives/icon/svg/spinner.d.ts +4 -4
  383. package/dist/types/primitives/icon/svg/stay-in-control.d.mts +4 -4
  384. package/dist/types/primitives/icon/svg/stay-in-control.d.ts +4 -4
  385. package/dist/types/primitives/icon/svg/success-check.d.mts +4 -4
  386. package/dist/types/primitives/icon/svg/success-check.d.ts +4 -4
  387. package/dist/types/primitives/icon/svg/telegram.d.mts +4 -4
  388. package/dist/types/primitives/icon/svg/telegram.d.ts +4 -4
  389. package/dist/types/primitives/icon/svg/triangle-down.d.mts +4 -4
  390. package/dist/types/primitives/icon/svg/triangle-down.d.ts +4 -4
  391. package/dist/types/primitives/icon/svg/triangle-up-filled.d.mts +4 -4
  392. package/dist/types/primitives/icon/svg/triangle-up-filled.d.ts +4 -4
  393. package/dist/types/primitives/icon/svg/triangle-up.d.mts +4 -4
  394. package/dist/types/primitives/icon/svg/triangle-up.d.ts +4 -4
  395. package/dist/types/primitives/icon/svg/twitter.d.mts +4 -4
  396. package/dist/types/primitives/icon/svg/twitter.d.ts +4 -4
  397. package/dist/types/primitives/icon/svg/upload.d.mts +4 -4
  398. package/dist/types/primitives/icon/svg/upload.d.ts +4 -4
  399. package/dist/types/primitives/icon/svg/usdc.d.mts +4 -4
  400. package/dist/types/primitives/icon/svg/usdc.d.ts +4 -4
  401. package/dist/types/primitives/icon/svg/user-trust.d.mts +4 -4
  402. package/dist/types/primitives/icon/svg/user-trust.d.ts +4 -4
  403. package/dist/types/primitives/icon/svg/wallet-avatar.d.mts +1 -1
  404. package/dist/types/primitives/icon/svg/wallet-avatar.d.ts +1 -1
  405. package/dist/types/primitives/icon/svg/wallet-filled.d.mts +4 -4
  406. package/dist/types/primitives/icon/svg/wallet-filled.d.ts +4 -4
  407. package/dist/types/primitives/icon/svg/wallet.d.mts +4 -4
  408. package/dist/types/primitives/icon/svg/wallet.d.ts +4 -4
  409. package/dist/types/primitives/icon/svg/warning-filled.d.mts +4 -4
  410. package/dist/types/primitives/icon/svg/warning-filled.d.ts +4 -4
  411. package/dist/types/primitives/icon/svg/warning.d.mts +4 -4
  412. package/dist/types/primitives/icon/svg/warning.d.ts +4 -4
  413. package/dist/types/primitives/inline-alert/index.d.mts +4 -5
  414. package/dist/types/primitives/inline-alert/index.d.ts +4 -5
  415. package/dist/types/primitives/loading-icon/index.d.mts +4 -5
  416. package/dist/types/primitives/loading-icon/index.d.ts +4 -5
  417. package/dist/types/primitives/modal/index.d.mts +12 -9
  418. package/dist/types/primitives/modal/index.d.ts +12 -9
  419. package/dist/types/primitives/number-value.d.mts +4 -4
  420. package/dist/types/primitives/number-value.d.ts +4 -4
  421. package/dist/types/primitives/remote-image/index.d.mts +4 -5
  422. package/dist/types/primitives/remote-image/index.d.ts +4 -5
  423. package/dist/types/primitives/search/index.d.mts +4 -5
  424. package/dist/types/primitives/search/index.d.ts +4 -5
  425. package/dist/types/primitives/search/search-empty-icon.d.mts +4 -4
  426. package/dist/types/primitives/search/search-empty-icon.d.ts +4 -4
  427. package/dist/types/primitives/select/index.d.mts +4 -5
  428. package/dist/types/primitives/select/index.d.ts +4 -5
  429. package/dist/types/primitives/skeleton/index.d.mts +4 -5
  430. package/dist/types/primitives/skeleton/index.d.ts +4 -5
  431. package/dist/types/primitives/skeleton/skeleton-block.d.mts +4 -4
  432. package/dist/types/primitives/skeleton/skeleton-block.d.ts +4 -4
  433. package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.mts +4 -4
  434. package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.ts +4 -4
  435. package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.mts +4 -10
  436. package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.ts +4 -10
  437. package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.mts +4 -4
  438. package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.ts +4 -4
  439. package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.mts +5 -5
  440. package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.ts +5 -5
  441. package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.mts +8 -8
  442. package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.ts +8 -8
  443. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +4 -4
  444. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +4 -4
  445. package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.mts +4 -4
  446. package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.ts +4 -4
  447. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.mts +4 -4
  448. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.ts +4 -4
  449. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.mts +4 -4
  450. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.ts +4 -4
  451. package/dist/types/primitives/state-message/index.d.mts +4 -5
  452. package/dist/types/primitives/state-message/index.d.ts +4 -5
  453. package/dist/types/primitives/switch-button/index.d.mts +4 -5
  454. package/dist/types/primitives/switch-button/index.d.ts +4 -5
  455. package/dist/types/primitives/tabs/index.d.mts +4 -5
  456. package/dist/types/primitives/tabs/index.d.ts +4 -5
  457. package/dist/types/primitives/toast/index.d.mts +1 -1
  458. package/dist/types/primitives/toast/index.d.ts +1 -1
  459. package/dist/types/primitives/tooltip/index.d.mts +4 -5
  460. package/dist/types/primitives/tooltip/index.d.ts +4 -5
  461. package/dist/types/primitives/typography/index.d.mts +4 -5
  462. package/dist/types/primitives/typography/index.d.ts +4 -5
  463. package/dist/types/primitives/typography/typography.types.d.mts +1 -1
  464. package/dist/types/primitives/typography/typography.types.d.ts +1 -1
  465. package/dist/types/primitives/venue-logo/index.d.mts +4 -5
  466. package/dist/types/primitives/venue-logo/index.d.ts +4 -5
  467. package/dist/types/primitives/venue-logo/svg/default-venue.d.mts +1 -1
  468. package/dist/types/primitives/venue-logo/svg/default-venue.d.ts +1 -1
  469. package/dist/types/primitives/venue-logo/svg/logo-betdex.d.mts +1 -1
  470. package/dist/types/primitives/venue-logo/svg/logo-betdex.d.ts +1 -1
  471. package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.mts +4 -4
  472. package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.ts +4 -4
  473. package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.mts +4 -4
  474. package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.ts +4 -4
  475. package/dist/types/primitives/venue-logo/svg/logo-limitless.d.mts +4 -4
  476. package/dist/types/primitives/venue-logo/svg/logo-limitless.d.ts +4 -4
  477. package/dist/types/primitives/venue-logo/svg/logo-myriad.d.mts +4 -4
  478. package/dist/types/primitives/venue-logo/svg/logo-myriad.d.ts +4 -4
  479. package/dist/types/primitives/venue-logo/svg/logo-novig.d.mts +4 -23
  480. package/dist/types/primitives/venue-logo/svg/logo-novig.d.ts +4 -23
  481. package/dist/types/primitives/venue-logo/svg/logo-opinion.d.mts +4 -4
  482. package/dist/types/primitives/venue-logo/svg/logo-opinion.d.ts +4 -4
  483. package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.mts +4 -4
  484. package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.ts +4 -4
  485. package/dist/types/primitives/venue-logo/svg/logo-pred.d.mts +4 -5
  486. package/dist/types/primitives/venue-logo/svg/logo-pred.d.ts +4 -5
  487. package/dist/types/primitives/venue-logo/svg/logo-predict.d.mts +4 -4
  488. package/dist/types/primitives/venue-logo/svg/logo-predict.d.ts +4 -4
  489. package/dist/types/primitives/venue-logo/svg/logo-probable.d.mts +4 -4
  490. package/dist/types/primitives/venue-logo/svg/logo-probable.d.ts +4 -4
  491. package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.mts +4 -26
  492. package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.ts +4 -26
  493. package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.mts +4 -5
  494. package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.ts +4 -5
  495. package/dist/types/primitives/venue-logo/venue-logo.constants.d.mts +1 -1
  496. package/dist/types/primitives/venue-logo/venue-logo.constants.d.ts +1 -1
  497. package/dist/types/profile/index.d.mts +4 -4
  498. package/dist/types/profile/index.d.ts +4 -4
  499. package/dist/types/profile/tabs/about-tab.d.mts +4 -4
  500. package/dist/types/profile/tabs/about-tab.d.ts +4 -4
  501. package/dist/types/profile/tabs/accounts-wallets-tab.d.mts +4 -4
  502. package/dist/types/profile/tabs/accounts-wallets-tab.d.ts +4 -4
  503. package/dist/types/profile/tabs/trading-access-tab.d.mts +4 -4
  504. package/dist/types/profile/tabs/trading-access-tab.d.ts +4 -4
  505. package/dist/types/shared/default-avatar.d.mts +4 -4
  506. package/dist/types/shared/default-avatar.d.ts +4 -4
  507. package/dist/types/shared/open-orders.d.mts +1 -1
  508. package/dist/types/shared/open-orders.d.ts +1 -1
  509. package/dist/types/shared/react-inert.d.mts +1 -0
  510. package/dist/types/shared/react-inert.d.ts +1 -0
  511. package/dist/types/shared/transfer-fee-summary.d.mts +1 -1
  512. package/dist/types/shared/transfer-fee-summary.d.ts +1 -1
  513. package/dist/types/trading/fund-kalshi-modal.d.mts +4 -4
  514. package/dist/types/trading/fund-kalshi-modal.d.ts +4 -4
  515. package/dist/types/trading/manage-betdex-account-modal.d.mts +1 -1
  516. package/dist/types/trading/manage-betdex-account-modal.d.ts +1 -1
  517. package/dist/types/trading/place-order/index.d.mts +4 -4
  518. package/dist/types/trading/place-order/index.d.ts +4 -4
  519. package/dist/types/trading/place-order/index.place-order.execution-view.d.mts +6 -6
  520. package/dist/types/trading/place-order/index.place-order.execution-view.d.ts +6 -6
  521. package/dist/types/trading/place-order/index.place-order.failure.d.mts +4 -4
  522. package/dist/types/trading/place-order/index.place-order.failure.d.ts +4 -4
  523. package/dist/types/trading/place-order/index.place-order.success.d.mts +4 -4
  524. package/dist/types/trading/place-order/index.place-order.success.d.ts +4 -4
  525. package/dist/types/trading/settlement/index.d.mts +4 -4
  526. package/dist/types/trading/settlement/index.d.ts +4 -4
  527. package/dist/types/trading/settlement/settlement-details.d.mts +4 -4
  528. package/dist/types/trading/settlement/settlement-details.d.ts +4 -4
  529. package/dist/types/trading/settlement/settlement-text-renderer.d.mts +4 -4
  530. package/dist/types/trading/settlement/settlement-text-renderer.d.ts +4 -4
  531. package/dist/types/withdraw/index.d.mts +4 -4
  532. package/dist/types/withdraw/index.d.ts +4 -4
  533. package/dist/types/withdraw/steps/withdraw-amount.d.mts +1 -1
  534. package/dist/types/withdraw/steps/withdraw-amount.d.ts +1 -1
  535. package/dist/types/withdraw/steps/withdraw-method.d.mts +1 -1
  536. package/dist/types/withdraw/steps/withdraw-method.d.ts +1 -1
  537. package/dist/types/withdraw/steps/withdraw-provider.d.mts +1 -1
  538. package/dist/types/withdraw/steps/withdraw-provider.d.ts +1 -1
  539. package/dist/types/withdraw/steps/withdraw-success.d.mts +2 -2
  540. package/dist/types/withdraw/steps/withdraw-success.d.ts +2 -2
  541. package/package.json +9 -8
  542. package/dist/chunk-6CZNJSRL.mjs +0 -3551
  543. package/dist/chunk-7G2GTWAS.mjs +0 -5189
  544. package/dist/chunk-7ORC3TUJ.mjs +0 -2883
  545. package/dist/chunk-EJXA32MG.mjs +0 -2377
  546. package/dist/chunk-JH4B3ZHQ.mjs +0 -1
  547. package/dist/chunk-KN7JN7F5.mjs +0 -8303
  548. package/dist/chunk-PN5HEBFC.mjs +0 -5789
  549. package/dist/chunk-W2LCFCW3.mjs +0 -2879
  550. package/dist/chunk-WOCZ4TVT.mjs +0 -1645
  551. package/dist/chunk-XZVGHKMW.mjs +0 -11426
  552. package/dist/event-market-A276CAYG.mjs +0 -21
@@ -0,0 +1,2993 @@
1
+ "use client";
2
+ import { Cn as BestPricesIcon, Ct as WarningIcon, Dt as WalletIcon, Fn as cn, Ft as StayInControlIcon, Gn as shortenAddress, Ln as formatCompactUsd, Ot as UsdcIcon, P as VenueLogo, Pt as SuccessCheckIcon, Q as RemoteImage, R as venueLogoLabels, Rn as formatTokenAmount, Vt as ProfileIcon, a as Tabs, bn as CheckCircleIcon, bt as Icon, cn as CreditCardIcon, dn as CloseIcon, f as Modal, gt as Button, ln as CreateAccountIcon, mn as ChevronLeftIcon, nn as ExternalLinkIcon, p as LoadingIcon, pn as ChevronRightIcon, qt as LinkAccountsIcon, r as useOptionalToast, t as Tooltip, u as Select, ut as CopyButton, xn as BoltIcon, zn as formatUsd } from "./primitives-Dz5aF8ma.mjs";
3
+ import { a as DEFAULT_CURRENCY_OPTIONS, c as withNetworkIcons, f as ConnectKalshiModal, h as dispatchAggDepositNotification, i as TransferFeeSummary, l as withTokenIcons, o as mapNetworksToOptions, s as mergeSelectOptionsUnique, t as ManageBetdexAccountModal } from "./manage-betdex-account-modal-D2vKHird.mjs";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ import { getVenueAvailabilityState, getVisibleVenuesByConfig, useAggAuthState, useAggClient, useAggUiConfig, useAppConfig, useDepositAddresses, useGeoBlock, useLabels, usePaperOnboarding, useResolvedExecutionMode, useVenueKeyStatus, useWithdrawEstimate } from "@agg-build/hooks";
7
+ import { Venue as Venue$1, isVenueActive } from "@agg-build/sdk";
8
+ import * as Dialog from "@radix-ui/react-dialog";
9
+ import { SVM_CHAIN_IDS, useDepositFlow } from "@agg-build/hooks/deposit";
10
+ import { QRCodeSVG } from "qrcode.react";
11
+ //#region src/paper-trading/paper-trading-badge.tsx
12
+ /**
13
+ * Header pill marking the whole app as simulated, with an explanatory tooltip.
14
+ *
15
+ * Figma node 4772:31077 — 10px bold uppercase in the app's primary colour on a
16
+ * 10%-alpha primary fill, 12/4 padding, fully rounded. Rendered directly
17
+ * rather than through the `Badge` primitive because Badge imposes its own
18
+ * type scale and padding, which do not match this spec.
19
+ *
20
+ * Renders nothing until the app mode has resolved from `/app/config` —
21
+ * flashing "PAPER TRADING" over a real-money app, even briefly, is the one
22
+ * mistake here that would genuinely mislead someone about their funds.
23
+ */
24
+ const PaperTradingBadge = ({ placement = "chip", isAuthenticated = false, forceVisible = false, label, showWhenAuthenticated = false, classNames }) => {
25
+ const labels = useLabels();
26
+ const { isPaperMode, isResolving } = useResolvedExecutionMode();
27
+ if (!forceVisible && (isResolving || !isPaperMode)) return null;
28
+ if (placement === "brand" && isAuthenticated && !forceVisible && !showWhenAuthenticated) return null;
29
+ const placementClassName = {
30
+ brand: "inline-flex md:hidden",
31
+ chip: "inline-flex",
32
+ signedOut: "hidden md:inline-flex"
33
+ }[placement];
34
+ return /* @__PURE__ */ jsx(Tooltip, {
35
+ content: labels.paperTrading.badgeTooltip,
36
+ side: "bottom",
37
+ sideOffset: 3,
38
+ size: "small",
39
+ classNames: { content: cn("max-w-[253px]! px-3! py-2! text-agg-xs! leading-agg-4! text-center", classNames?.tooltip) },
40
+ children: /* @__PURE__ */ jsx("span", {
41
+ className: cn("agg-paper-trading-badge items-center", placementClassName, classNames?.root),
42
+ "data-testid": "agg-paper-trading-badge",
43
+ "data-placement": placement,
44
+ children: /* @__PURE__ */ jsx("span", {
45
+ className: cn("inline-flex items-center justify-center rounded-full", "px-3 py-1", "h-6 md:h-auto", "bg-agg-primary/10 text-agg-primary", "text-[10px] leading-[14px] font-agg-bold uppercase whitespace-nowrap", classNames?.pill),
46
+ children: label ?? labels.paperTrading.badge
47
+ })
48
+ })
49
+ });
50
+ };
51
+ PaperTradingBadge.displayName = "PaperTradingBadge";
52
+ //#endregion
53
+ //#region src/onboarding/onboarding-modal.constants.ts
54
+ const HOW_IT_WORKS_FEATURE_KEYS = [
55
+ "createAccount",
56
+ "linkAccounts",
57
+ "bestPrices",
58
+ "stayInControl"
59
+ ];
60
+ const ONBOARDING_STEPS = {
61
+ HOW_IT_WORKS: 0,
62
+ PROFILE_SETUP: 1,
63
+ CONNECT_ACCOUNTS: 2
64
+ };
65
+ const ONCHAIN_VENUES = [
66
+ Venue$1.polymarket,
67
+ Venue$1.opinion,
68
+ Venue$1.predict,
69
+ Venue$1.pred
70
+ ].filter(isVenueActive);
71
+ //#endregion
72
+ //#region src/onboarding/steps/how-it-works.tsx
73
+ const defaultIcons = {
74
+ createAccount: /* @__PURE__ */ jsx(CreateAccountIcon, { className: "h-[28px] w-[28px] text-agg-muted-foreground" }),
75
+ linkAccounts: /* @__PURE__ */ jsx(LinkAccountsIcon, { className: "h-[28px] w-[28px] text-agg-muted-foreground" }),
76
+ bestPrices: /* @__PURE__ */ jsx(BestPricesIcon, { className: "h-[28px] w-[28px] text-agg-muted-foreground" }),
77
+ stayInControl: /* @__PURE__ */ jsx(StayInControlIcon, { className: "h-[28px] w-[28px] text-agg-muted-foreground" })
78
+ };
79
+ const HowItWorksStep = ({ onContinue, icons }) => {
80
+ const labels = useLabels();
81
+ const scrollRef = useRef(null);
82
+ const [showTopGradient, setShowTopGradient] = useState(false);
83
+ const [showBottomGradient, setShowBottomGradient] = useState(true);
84
+ const handleScroll = useCallback(() => {
85
+ const el = scrollRef.current;
86
+ if (!el) return;
87
+ setShowTopGradient(el.scrollTop > 0);
88
+ setShowBottomGradient(el.scrollTop + el.clientHeight < el.scrollHeight - 1);
89
+ }, []);
90
+ return /* @__PURE__ */ jsxs("div", {
91
+ className: "flex flex-col gap-6 h-[600px] sm:h-auto",
92
+ children: [
93
+ /* @__PURE__ */ jsx("h2", {
94
+ className: "text-center text-agg-2xl font-agg-bold text-agg-foreground",
95
+ children: labels.onboarding.howItWorks.title
96
+ }),
97
+ /* @__PURE__ */ jsxs("div", {
98
+ className: "relative flex-1 min-h-0 sm:flex-initial",
99
+ children: [
100
+ /* @__PURE__ */ jsx("div", {
101
+ ref: scrollRef,
102
+ onScroll: handleScroll,
103
+ className: "flex flex-col gap-4 overflow-y-auto sm:overflow-visible h-full",
104
+ children: HOW_IT_WORKS_FEATURE_KEYS.map((featureKey) => {
105
+ const icon = icons?.[featureKey] ?? defaultIcons[featureKey];
106
+ const feature = labels.onboarding.howItWorks.features[featureKey];
107
+ return /* @__PURE__ */ jsxs("div", {
108
+ className: cn("flex items-center gap-4 py-4 px-5 sm:px-4", "rounded-agg-md", "bg-agg-secondary-hover"),
109
+ children: [/* @__PURE__ */ jsxs("div", {
110
+ className: "flex flex-col flex-1 min-w-0 gap-[6px]",
111
+ children: [/* @__PURE__ */ jsx("p", {
112
+ className: "text-agg-base font-agg-bold leading-agg-6 text-agg-foreground",
113
+ children: feature.title
114
+ }), /* @__PURE__ */ jsx("p", {
115
+ className: "text-agg-sm leading-agg-5 text-agg-foreground",
116
+ children: feature.description
117
+ })]
118
+ }), icon ? /* @__PURE__ */ jsx("div", {
119
+ className: "hidden shrink-0 items-center justify-center text-agg-muted-foreground sm:flex",
120
+ children: icon
121
+ }) : null]
122
+ }, featureKey);
123
+ })
124
+ }),
125
+ /* @__PURE__ */ jsx("div", { className: cn("pointer-events-none absolute inset-x-0 top-0 h-20", "bg-gradient-to-b from-agg-secondary to-transparent", "sm:hidden transition-opacity", showTopGradient ? "opacity-100" : "opacity-0") }),
126
+ /* @__PURE__ */ jsx("div", { className: cn("pointer-events-none absolute inset-x-0 bottom-0 h-20", "bg-gradient-to-t from-agg-secondary to-transparent", "sm:hidden transition-opacity", showBottomGradient ? "opacity-100" : "opacity-0") })
127
+ ]
128
+ }),
129
+ /* @__PURE__ */ jsx(Button, {
130
+ variant: "primary",
131
+ size: "large",
132
+ className: "w-full",
133
+ onClick: onContinue,
134
+ children: labels.onboarding.howItWorks.continue
135
+ })
136
+ ]
137
+ });
138
+ };
139
+ HowItWorksStep.displayName = "HowItWorksStep";
140
+ //#endregion
141
+ //#region src/onboarding/steps/profile-setup.tsx
142
+ const ProfileSetupStep = ({ onContinue }) => {
143
+ const labels = useLabels();
144
+ const [username, setUsername] = useState("");
145
+ const [avatarFile, setAvatarFile] = useState();
146
+ const [avatarPreview, setAvatarPreview] = useState();
147
+ const fileInputRef = useRef(null);
148
+ const handleAvatarClick = useCallback(() => {
149
+ fileInputRef.current?.click();
150
+ }, []);
151
+ const handleFileChange = useCallback((e) => {
152
+ const file = e.target.files?.[0];
153
+ if (!file) return;
154
+ setAvatarFile(file);
155
+ const reader = new FileReader();
156
+ reader.onload = (event) => {
157
+ setAvatarPreview(event.target?.result);
158
+ };
159
+ reader.readAsDataURL(file);
160
+ }, []);
161
+ const handleContinue = useCallback(() => {
162
+ onContinue({
163
+ username,
164
+ avatarFile,
165
+ avatarPreview
166
+ });
167
+ }, [
168
+ username,
169
+ avatarFile,
170
+ avatarPreview,
171
+ onContinue
172
+ ]);
173
+ return /* @__PURE__ */ jsxs("div", {
174
+ className: "flex flex-col gap-7",
175
+ children: [
176
+ /* @__PURE__ */ jsx("h2", {
177
+ className: "text-center text-agg-2xl font-agg-bold text-agg-foreground",
178
+ children: labels.onboarding.profileSetup.title
179
+ }),
180
+ /* @__PURE__ */ jsxs("div", {
181
+ className: "flex flex-col gap-5 items-center w-full",
182
+ children: [/* @__PURE__ */ jsxs("div", {
183
+ className: "flex justify-center",
184
+ children: [/* @__PURE__ */ jsxs("button", {
185
+ type: "button",
186
+ onClick: handleAvatarClick,
187
+ className: cn("group relative flex items-center justify-center", "h-[80px] w-[80px]", "rounded-agg-full", "bg-agg-secondary-hover", !avatarPreview && "hover:bg-agg-tertiary", "transition-colors cursor-pointer", "overflow-hidden"),
188
+ "aria-label": labels.onboarding.profileSetup.uploadProfilePictureAria,
189
+ children: [!avatarPreview ? /* @__PURE__ */ jsx("svg", {
190
+ "aria-hidden": true,
191
+ viewBox: "0 0 80 80",
192
+ className: "pointer-events-none absolute inset-0 h-full w-full text-agg-separator group-hover:text-agg-muted-foreground",
193
+ children: /* @__PURE__ */ jsx("circle", {
194
+ cx: "40",
195
+ cy: "40",
196
+ r: "39.5",
197
+ fill: "none",
198
+ stroke: "currentColor",
199
+ strokeWidth: "1",
200
+ strokeDasharray: "8 8"
201
+ })
202
+ }) : null, avatarPreview ? /* @__PURE__ */ jsx(RemoteImage, {
203
+ src: avatarPreview,
204
+ alt: labels.onboarding.profileSetup.profilePreviewAlt,
205
+ className: "h-full w-full object-cover"
206
+ }) : /* @__PURE__ */ jsx(ProfileIcon, { className: "h-7 w-7 text-agg-muted-foreground" })]
207
+ }), /* @__PURE__ */ jsx("input", {
208
+ ref: fileInputRef,
209
+ type: "file",
210
+ accept: "image/*",
211
+ onChange: handleFileChange,
212
+ className: "hidden",
213
+ "aria-hidden": "true"
214
+ })]
215
+ }), /* @__PURE__ */ jsxs("div", {
216
+ className: "flex flex-col gap-2 w-full",
217
+ children: [/* @__PURE__ */ jsx("label", {
218
+ htmlFor: "onboarding-username",
219
+ className: "text-agg-sm font-agg-bold text-agg-foreground",
220
+ children: labels.onboarding.profileSetup.usernameLabel
221
+ }), /* @__PURE__ */ jsx("input", {
222
+ id: "onboarding-username",
223
+ type: "text",
224
+ value: username,
225
+ onChange: (e) => setUsername(e.target.value),
226
+ placeholder: labels.onboarding.profileSetup.usernamePlaceholder,
227
+ className: cn("w-full px-3 py-2.5", "rounded-[4px]", "border border-agg-separator", "bg-agg-secondary text-agg-foreground", "placeholder:text-agg-muted-foreground", "outline-none", "hover:bg-agg-secondary-hover", "focus:border-agg-primary focus:ring-1 focus:ring-agg-primary", "transition-colors", "text-agg-sm sm:text-agg-base")
228
+ })]
229
+ })]
230
+ }),
231
+ /* @__PURE__ */ jsx(Button, {
232
+ variant: "primary",
233
+ size: "large",
234
+ className: "w-full",
235
+ onClick: handleContinue,
236
+ children: labels.onboarding.profileSetup.continue
237
+ })
238
+ ]
239
+ });
240
+ };
241
+ ProfileSetupStep.displayName = "ProfileSetupStep";
242
+ //#endregion
243
+ //#region src/onboarding/steps/connect-accounts.tsx
244
+ const OnchainVenueLogos = () => {
245
+ return /* @__PURE__ */ jsx("div", {
246
+ className: "flex gap-1 sm:gap-0 sm:-space-x-5",
247
+ children: ONCHAIN_VENUES.map((venue, index) => /* @__PURE__ */ jsx("div", {
248
+ style: { zIndex: ONCHAIN_VENUES.length - index },
249
+ children: /* @__PURE__ */ jsx(VenueLogo, {
250
+ venue,
251
+ variant: "logo",
252
+ size: "medium",
253
+ className: "sm:h-8 sm:w-8"
254
+ })
255
+ }, venue))
256
+ });
257
+ };
258
+ const VenueCard = ({ logos, title, mobileTitle, description, mobileDescription, onConnect, connected = false }) => {
259
+ const labels = useLabels();
260
+ const action = connected ? /* @__PURE__ */ jsx(CheckCircleIcon, { className: "h-6 w-6 text-agg-success" }) : /* @__PURE__ */ jsx(Button, {
261
+ variant: "tertiary",
262
+ size: "large",
263
+ className: "!h-auto !px-0 !py-0 text-agg-primary hover:bg-transparent hover:text-agg-primary-hover",
264
+ onClick: onConnect,
265
+ children: labels.onboarding.connectAccounts.connect
266
+ });
267
+ const mobileAction = connected ? /* @__PURE__ */ jsx(CheckCircleIcon, { className: "h-6 w-6 text-agg-success" }) : /* @__PURE__ */ jsx(Button, {
268
+ variant: "tertiary",
269
+ size: "medium",
270
+ className: "!h-auto !px-0 !py-0 text-agg-primary hover:bg-transparent hover:text-agg-primary-hover",
271
+ onClick: onConnect,
272
+ suffix: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-4 w-4" }),
273
+ children: labels.onboarding.connectAccounts.connectAccount
274
+ });
275
+ return /* @__PURE__ */ jsxs("div", {
276
+ className: cn("rounded-agg-md p-5 transition-colors", connected ? "bg-agg-success/5" : "bg-agg-secondary-hover hover:bg-agg-tertiary"),
277
+ children: [/* @__PURE__ */ jsxs("div", {
278
+ className: "hidden sm:flex items-center justify-between",
279
+ children: [/* @__PURE__ */ jsxs("div", {
280
+ className: "flex items-center gap-5",
281
+ children: [/* @__PURE__ */ jsx("div", {
282
+ className: "shrink-0",
283
+ children: logos
284
+ }), /* @__PURE__ */ jsxs("div", {
285
+ className: "flex flex-col gap-[2px]",
286
+ children: [/* @__PURE__ */ jsx("p", {
287
+ className: "text-agg-base font-agg-bold text-agg-foreground",
288
+ children: title
289
+ }), /* @__PURE__ */ jsx("p", {
290
+ className: "text-agg-sm text-agg-foreground",
291
+ children: description
292
+ })]
293
+ })]
294
+ }), /* @__PURE__ */ jsx("div", {
295
+ className: "shrink-0",
296
+ children: action
297
+ })]
298
+ }), /* @__PURE__ */ jsxs("div", {
299
+ className: "flex flex-col gap-3 sm:hidden",
300
+ children: [/* @__PURE__ */ jsxs("div", {
301
+ className: "flex flex-col gap-3",
302
+ children: [/* @__PURE__ */ jsx("div", {
303
+ className: "shrink-0",
304
+ children: logos
305
+ }), /* @__PURE__ */ jsx("p", {
306
+ className: "text-agg-lg font-agg-bold text-agg-foreground",
307
+ children: mobileTitle ?? title
308
+ })]
309
+ }), /* @__PURE__ */ jsxs("div", {
310
+ className: "flex flex-col items-start gap-2",
311
+ children: [/* @__PURE__ */ jsx("p", {
312
+ className: "text-agg-base text-agg-foreground",
313
+ children: mobileDescription ?? description
314
+ }), mobileAction]
315
+ })]
316
+ })]
317
+ });
318
+ };
319
+ const ConnectAccountsStep = ({ onConnectOnchain, onContinue, connectedOnchain = false }) => {
320
+ const labels = useLabels();
321
+ const canContinue = connectedOnchain;
322
+ return /* @__PURE__ */ jsxs("div", {
323
+ className: "flex flex-col gap-6",
324
+ children: [
325
+ /* @__PURE__ */ jsx("h2", {
326
+ className: "text-center text-agg-2xl font-agg-bold text-agg-foreground",
327
+ children: labels.onboarding.connectAccounts.title
328
+ }),
329
+ /* @__PURE__ */ jsx("div", {
330
+ className: "flex flex-col gap-4",
331
+ children: /* @__PURE__ */ jsx(VenueCard, {
332
+ logos: /* @__PURE__ */ jsx(OnchainVenueLogos, {}),
333
+ title: labels.onboarding.connectAccounts.onchainTitle,
334
+ mobileTitle: labels.onboarding.connectAccounts.onchainMobileTitle(ONCHAIN_VENUES.length - 1),
335
+ description: labels.onboarding.connectAccounts.onchainDescription,
336
+ mobileDescription: labels.onboarding.connectAccounts.onchainMobileDescription,
337
+ onConnect: onConnectOnchain,
338
+ connected: connectedOnchain
339
+ })
340
+ }),
341
+ /* @__PURE__ */ jsx(Button, {
342
+ variant: "primary",
343
+ size: "large",
344
+ className: "w-full",
345
+ onClick: onContinue,
346
+ disabled: !canContinue,
347
+ children: labels.onboarding.connectAccounts.continue
348
+ })
349
+ ]
350
+ });
351
+ };
352
+ ConnectAccountsStep.displayName = "ConnectAccountsStep";
353
+ //#endregion
354
+ //#region src/onboarding/steps/connect-onchain-modal.tsx
355
+ const ConnectOnchainModal = ({ open, onOpenChange, onConnect }) => {
356
+ const labels = useLabels();
357
+ const [connecting, setConnecting] = useState(false);
358
+ const [error, setError] = useState();
359
+ const handleCancel = useCallback(() => {
360
+ onOpenChange(false);
361
+ }, [onOpenChange]);
362
+ const handleConnect = useCallback(async () => {
363
+ if (connecting) return;
364
+ setConnecting(true);
365
+ setError(void 0);
366
+ try {
367
+ await onConnect();
368
+ onOpenChange(false);
369
+ } catch (err) {
370
+ setError(err instanceof Error ? err.message : labels.onboarding.connectOnchainModal.fallbackError);
371
+ } finally {
372
+ setConnecting(false);
373
+ }
374
+ }, [
375
+ connecting,
376
+ labels.onboarding.connectOnchainModal.fallbackError,
377
+ onConnect,
378
+ onOpenChange
379
+ ]);
380
+ const handleOpenChange = useCallback((value) => {
381
+ if (value) {
382
+ setError(void 0);
383
+ setConnecting(false);
384
+ }
385
+ onOpenChange(value);
386
+ }, [onOpenChange]);
387
+ return /* @__PURE__ */ jsx(Modal, {
388
+ open,
389
+ onOpenChange: handleOpenChange,
390
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
391
+ maxWidth: "600px",
392
+ "aria-label": labels.onboarding.connectOnchainModal.ariaLabel,
393
+ classNames: { container: "!rounded-agg-lg" },
394
+ children: [
395
+ /* @__PURE__ */ jsx(Dialog.Title, {
396
+ className: "sr-only",
397
+ children: labels.onboarding.connectOnchainModal.title
398
+ }),
399
+ /* @__PURE__ */ jsx(Modal.Header, {
400
+ hideClose: false,
401
+ hideBorder: true,
402
+ classNames: {
403
+ root: "!min-h-0",
404
+ container: "!py-[18px] !px-8"
405
+ }
406
+ }),
407
+ /* @__PURE__ */ jsx(Modal.Body, {
408
+ classNames: { root: "!px-5 !pt-0 !pb-[60px] sm:!px-8" },
409
+ children: /* @__PURE__ */ jsxs("div", {
410
+ className: "flex flex-col gap-8 items-center",
411
+ children: [
412
+ /* @__PURE__ */ jsxs("div", {
413
+ className: "flex flex-col gap-4 items-center text-center",
414
+ children: [/* @__PURE__ */ jsx("h2", {
415
+ className: "text-agg-2xl font-agg-bold text-agg-foreground",
416
+ children: labels.onboarding.connectOnchainModal.title
417
+ }), /* @__PURE__ */ jsx("p", {
418
+ className: "text-agg-base text-center leading-agg-6 text-agg-foreground whitespace-pre-line",
419
+ children: labels.onboarding.connectOnchainModal.description
420
+ })]
421
+ }),
422
+ /* @__PURE__ */ jsxs("div", {
423
+ className: "flex w-full flex-col items-center gap-4 rounded-agg-xl bg-agg-secondary-hover p-6",
424
+ children: [/* @__PURE__ */ jsx("p", {
425
+ className: "text-agg-sm font-agg-bold uppercase leading-agg-5 text-agg-muted-foreground",
426
+ children: labels.onboarding.connectOnchainModal.supportedVenuesLabel
427
+ }), /* @__PURE__ */ jsx("div", {
428
+ className: "flex flex-wrap items-center justify-center gap-x-4 gap-y-3",
429
+ children: ONCHAIN_VENUES.map((venue, index) => /* @__PURE__ */ jsxs("div", {
430
+ className: "flex items-center gap-[6px]",
431
+ children: [
432
+ index > 0 && /* @__PURE__ */ jsx("span", { className: "mr-2.5 h-3 w-px bg-agg-separator" }),
433
+ /* @__PURE__ */ jsx(VenueLogo, {
434
+ venue,
435
+ size: "medium"
436
+ }),
437
+ /* @__PURE__ */ jsx("span", {
438
+ className: "text-agg-base text-agg-foreground",
439
+ children: labels.venues[venue]
440
+ })
441
+ ]
442
+ }, venue))
443
+ })]
444
+ }),
445
+ /* @__PURE__ */ jsxs("div", {
446
+ className: "flex flex-col gap-6 items-center",
447
+ children: [/* @__PURE__ */ jsxs("div", {
448
+ className: "flex flex-col gap-3 items-center",
449
+ children: [error ? /* @__PURE__ */ jsxs("div", {
450
+ className: "flex items-center gap-2",
451
+ children: [/* @__PURE__ */ jsx(WarningIcon, { className: "h-3.5 w-3.5 shrink-0 text-agg-error" }), /* @__PURE__ */ jsx("p", {
452
+ className: "text-agg-sm leading-agg-5 text-agg-error",
453
+ children: error
454
+ })]
455
+ }) : null, /* @__PURE__ */ jsx(Button, {
456
+ variant: "primary",
457
+ size: "large",
458
+ onClick: handleConnect,
459
+ isLoading: connecting,
460
+ children: labels.onboarding.connectOnchainModal.connect
461
+ })]
462
+ }), /* @__PURE__ */ jsx(Button, {
463
+ variant: "tertiary",
464
+ size: "medium",
465
+ className: "!h-auto !px-0 !py-0 text-agg-primary hover:bg-transparent hover:text-agg-primary-hover",
466
+ onClick: handleCancel,
467
+ children: labels.onboarding.connectOnchainModal.cancel
468
+ })]
469
+ })
470
+ ]
471
+ })
472
+ })
473
+ ]
474
+ })
475
+ });
476
+ };
477
+ ConnectOnchainModal.displayName = "ConnectOnchainModal";
478
+ //#endregion
479
+ //#region src/onboarding/index.tsx
480
+ const OnboardingModal = ({ open, onOpenChange, onProfileSubmit, onConnectOnchain, onComplete, howItWorksIcons, connectedOnchain = false }) => {
481
+ const labels = useLabels();
482
+ const [step, setStep] = useState(ONBOARDING_STEPS.HOW_IT_WORKS);
483
+ const resolvedTitle = {
484
+ [ONBOARDING_STEPS.HOW_IT_WORKS]: labels.onboarding.modal.stepHowItWorks,
485
+ [ONBOARDING_STEPS.PROFILE_SETUP]: labels.onboarding.modal.stepProfileSetup,
486
+ [ONBOARDING_STEPS.CONNECT_ACCOUNTS]: labels.onboarding.modal.stepConnectAccounts
487
+ }[step] ?? labels.onboarding.modal.title;
488
+ const [onchainModalOpen, setOnchainModalOpen] = useState(false);
489
+ const [onchainConnected, setOnchainConnected] = useState(false);
490
+ useEffect(() => {
491
+ if (open) {
492
+ setStep(ONBOARDING_STEPS.HOW_IT_WORKS);
493
+ setOnchainConnected(false);
494
+ }
495
+ }, [open]);
496
+ const handleHowItWorksContinue = useCallback(() => {
497
+ setStep(ONBOARDING_STEPS.PROFILE_SETUP);
498
+ }, []);
499
+ const handleProfileContinue = useCallback((data) => {
500
+ onProfileSubmit?.(data);
501
+ setStep(ONBOARDING_STEPS.CONNECT_ACCOUNTS);
502
+ }, [onProfileSubmit]);
503
+ const handleConnectContinue = useCallback(() => {
504
+ onComplete?.();
505
+ }, [onComplete]);
506
+ const handleOpenOnchainModal = useCallback(() => {
507
+ setOnchainModalOpen(true);
508
+ }, []);
509
+ const handleOnchainConnect = useCallback(async () => {
510
+ await onConnectOnchain?.();
511
+ setOnchainConnected(true);
512
+ }, [onConnectOnchain]);
513
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal, {
514
+ open,
515
+ onOpenChange,
516
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
517
+ maxWidth: "600px",
518
+ "aria-label": resolvedTitle,
519
+ classNames: { container: "!rounded-agg-lg" },
520
+ children: [/* @__PURE__ */ jsx(Dialog.Title, {
521
+ className: "sr-only",
522
+ children: resolvedTitle
523
+ }), /* @__PURE__ */ jsxs(Modal.Body, {
524
+ classNames: { root: "px-5 py-6 sm:px-10 sm:py-8" },
525
+ children: [
526
+ step === ONBOARDING_STEPS.HOW_IT_WORKS && /* @__PURE__ */ jsx(HowItWorksStep, {
527
+ onContinue: handleHowItWorksContinue,
528
+ icons: howItWorksIcons
529
+ }),
530
+ step === ONBOARDING_STEPS.PROFILE_SETUP && /* @__PURE__ */ jsx(ProfileSetupStep, { onContinue: handleProfileContinue }),
531
+ step === ONBOARDING_STEPS.CONNECT_ACCOUNTS && /* @__PURE__ */ jsx(ConnectAccountsStep, {
532
+ onConnectOnchain: handleOpenOnchainModal,
533
+ onContinue: handleConnectContinue,
534
+ connectedOnchain: connectedOnchain || onchainConnected
535
+ })
536
+ ]
537
+ })]
538
+ })
539
+ }), /* @__PURE__ */ jsx(ConnectOnchainModal, {
540
+ open: onchainModalOpen,
541
+ onOpenChange: setOnchainModalOpen,
542
+ onConnect: handleOnchainConnect
543
+ })] });
544
+ };
545
+ OnboardingModal.displayName = "OnboardingModal";
546
+ //#endregion
547
+ //#region src/deposit/deposit-modal.constants.ts
548
+ const BASE_URL = "https://assets.snagsolutions.io";
549
+ /** Default network options for the card deposit flow. */
550
+ const CARD_NETWORK_OPTIONS = [
551
+ {
552
+ value: "ethereum",
553
+ label: "Ethereum",
554
+ iconUrl: `${BASE_URL}/public/prediction-markets/logos/ETH.svg`
555
+ },
556
+ {
557
+ value: "arbitrum",
558
+ label: "Arbitrum",
559
+ iconUrl: `${BASE_URL}/public/prediction-markets/logos/Arbitrum.svg`
560
+ },
561
+ {
562
+ value: "base",
563
+ label: "Base",
564
+ iconUrl: `${BASE_URL}/public/prediction-markets/logos/Base.svg`
565
+ },
566
+ {
567
+ value: "solana",
568
+ label: "Solana",
569
+ iconUrl: `${BASE_URL}/public/prediction-markets/logos/Solana.svg`
570
+ },
571
+ {
572
+ value: "polygon",
573
+ label: "Polygon",
574
+ iconUrl: `${BASE_URL}/public/prediction-markets/logos/Polygon.svg`
575
+ }
576
+ ];
577
+ /** Maps network slugs to ramp destination currency codes. */
578
+ const NETWORK_TO_CURRENCY_CODE = {
579
+ ethereum: "USDC",
580
+ arbitrum: "USDC_ARBITRUM",
581
+ base: "USDC_BASE",
582
+ solana: "USDC_SOLANA",
583
+ polygon: "USDC_POLYGON"
584
+ };
585
+ //#endregion
586
+ //#region src/deposit/steps/card-deposit.tsx
587
+ const CardDepositStep = ({ amount, currency, networkOptions, selectedNetwork, minAmount, onBack, onAmountChange, onCurrencyChange, onNetworkChange, onContinue }) => {
588
+ const labels = useLabels();
589
+ const [localAmount, setLocalAmount] = useState(amount);
590
+ useEffect(() => {
591
+ setLocalAmount(amount);
592
+ }, [amount]);
593
+ const numericAmount = Number(localAmount) || 0;
594
+ const hasInput = localAmount.length > 0;
595
+ const isBelowMin = minAmount != null && hasInput && numericAmount < minAmount;
596
+ const isValid = numericAmount > 0 && !isBelowMin;
597
+ const formattedMin = minAmount != null ? `$${minAmount}` : void 0;
598
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
599
+ title: labels.deposit.cardFlow.title,
600
+ hideBorder: true,
601
+ leftElement: /* @__PURE__ */ jsx("button", {
602
+ type: "button",
603
+ className: "mr-2 flex items-center justify-center text-agg-foreground transition-colors hover:cursor-pointer hover:text-agg-foreground/80",
604
+ onClick: onBack,
605
+ "aria-label": "Go back",
606
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-6 w-6" })
607
+ })
608
+ }), /* @__PURE__ */ jsx(Modal.Body, {
609
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
610
+ children: /* @__PURE__ */ jsxs("div", {
611
+ className: "flex flex-col gap-5",
612
+ children: [
613
+ /* @__PURE__ */ jsxs("div", {
614
+ className: "flex flex-col gap-3",
615
+ children: [/* @__PURE__ */ jsxs("div", {
616
+ className: "flex-1 flex flex-col gap-2",
617
+ children: [/* @__PURE__ */ jsxs("div", {
618
+ className: "flex items-center justify-between",
619
+ children: [/* @__PURE__ */ jsx("p", {
620
+ className: "agg-type-label-strong text-agg-foreground",
621
+ children: labels.deposit.cardFlow.amountLabel
622
+ }), formattedMin ? /* @__PURE__ */ jsx("p", {
623
+ className: "agg-type-label text-agg-foreground",
624
+ children: labels.deposit.cardFlow.minRequired(formattedMin)
625
+ }) : null]
626
+ }), /* @__PURE__ */ jsxs("div", {
627
+ className: "flex gap-3 items-center",
628
+ children: [/* @__PURE__ */ jsxs("div", {
629
+ className: cn("flex h-10 flex-1 items-center gap-2 rounded-agg-sm border bg-agg-secondary px-3", isBelowMin ? "border-agg-primary border-2" : "border-agg-separator"),
630
+ children: [/* @__PURE__ */ jsx("input", {
631
+ type: "text",
632
+ inputMode: "decimal",
633
+ "aria-label": labels.deposit.cardFlow.amountLabel,
634
+ className: "agg-type-body w-full bg-transparent text-agg-foreground outline-none",
635
+ placeholder: "0.00",
636
+ value: localAmount,
637
+ onChange: (event) => {
638
+ const next = event.target.value;
639
+ setLocalAmount(next);
640
+ onAmountChange(next);
641
+ }
642
+ }), /* @__PURE__ */ jsx("span", {
643
+ className: "agg-type-body text-agg-muted-foreground",
644
+ children: "$"
645
+ })]
646
+ }), /* @__PURE__ */ jsx("div", {
647
+ className: "w-[100px]",
648
+ children: /* @__PURE__ */ jsx(Select, {
649
+ items: [{
650
+ value: currency,
651
+ label: currency
652
+ }],
653
+ value: currency,
654
+ onChange: onCurrencyChange,
655
+ ariaLabel: labels.deposit.cardFlow.currencyLabel,
656
+ triggerClassName: "rounded-agg-sm"
657
+ })
658
+ })]
659
+ })]
660
+ }), isBelowMin && formattedMin ? /* @__PURE__ */ jsxs("div", {
661
+ className: "flex items-center gap-2",
662
+ role: "alert",
663
+ "aria-live": "assertive",
664
+ children: [/* @__PURE__ */ jsx(Icon, {
665
+ name: "warning",
666
+ className: "!h-3.5 !w-3.5 shrink-0 text-agg-error",
667
+ "aria-hidden": "true"
668
+ }), /* @__PURE__ */ jsx("p", {
669
+ className: "agg-type-label text-agg-error",
670
+ children: labels.deposit.cardFlow.minAmountError(formattedMin)
671
+ })]
672
+ }) : null]
673
+ }),
674
+ /* @__PURE__ */ jsxs("div", {
675
+ className: "flex flex-col gap-2",
676
+ children: [/* @__PURE__ */ jsx("p", {
677
+ className: "agg-type-label-strong text-agg-foreground",
678
+ children: labels.deposit.cardFlow.networkLabel
679
+ }), /* @__PURE__ */ jsx(Select, {
680
+ items: networkOptions,
681
+ value: selectedNetwork,
682
+ onChange: onNetworkChange,
683
+ ariaLabel: labels.deposit.cardFlow.networkLabel,
684
+ triggerClassName: "rounded-agg-sm"
685
+ })]
686
+ }),
687
+ /* @__PURE__ */ jsx(Button, {
688
+ variant: "secondary",
689
+ size: "large",
690
+ className: "w-full",
691
+ disabled: !isValid,
692
+ onClick: () => onContinue(numericAmount),
693
+ children: labels.deposit.cardFlow.getQuotes
694
+ })
695
+ ]
696
+ })
697
+ })] });
698
+ };
699
+ //#endregion
700
+ //#region src/deposit/steps/card-payment-pending.tsx
701
+ const CardPaymentPendingStep = ({ providerName, walletAddress, onClose, onViewActivity, onChooseAnotherProvider }) => {
702
+ const labels = useLabels();
703
+ return /* @__PURE__ */ jsx("div", {
704
+ className: "relative",
705
+ children: /* @__PURE__ */ jsxs(Modal.Body, {
706
+ classNames: { root: "px-5 py-8 sm:px-8 sm:py-10" },
707
+ children: [/* @__PURE__ */ jsx("button", {
708
+ type: "button",
709
+ className: "absolute right-8 top-7 flex items-center justify-center text-agg-foreground transition-colors cursor-pointer hover:text-agg-foreground/80",
710
+ onClick: onClose,
711
+ "aria-label": labels.common.close,
712
+ children: /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6" })
713
+ }), /* @__PURE__ */ jsxs("div", {
714
+ className: "flex flex-col items-center gap-8",
715
+ children: [
716
+ /* @__PURE__ */ jsx("div", {
717
+ className: "flex h-[60px] w-[60px] items-center justify-center text-agg-muted-foreground",
718
+ children: /* @__PURE__ */ jsx(ExternalLinkIcon, { className: "h-[60px] w-[60px]" })
719
+ }),
720
+ /* @__PURE__ */ jsxs("div", {
721
+ className: "flex flex-col items-center gap-3 text-center",
722
+ children: [/* @__PURE__ */ jsx("h3", {
723
+ className: "text-agg-2xl leading-agg-8 font-agg-bold text-agg-foreground",
724
+ children: labels.deposit.cardFlow.pendingTitle(providerName)
725
+ }), /* @__PURE__ */ jsx("p", {
726
+ className: "agg-type-body text-agg-foreground",
727
+ children: labels.deposit.cardFlow.pendingDescription
728
+ })]
729
+ }),
730
+ walletAddress ? /* @__PURE__ */ jsxs("div", {
731
+ className: "flex w-full flex-col items-center gap-3 rounded-agg-md bg-agg-secondary-hover p-5",
732
+ children: [/* @__PURE__ */ jsx("p", {
733
+ className: "agg-type-label text-agg-foreground w-full",
734
+ children: labels.deposit.cardFlow.pendingWalletAddressHelp
735
+ }), /* @__PURE__ */ jsxs("div", {
736
+ className: "flex w-full h-10 items-center gap-2 rounded border border-agg-separator bg-agg-secondary px-3 py-[10px]",
737
+ children: [/* @__PURE__ */ jsx("p", {
738
+ className: "agg-type-body flex-1 min-w-0 truncate text-agg-foreground",
739
+ children: walletAddress
740
+ }), /* @__PURE__ */ jsx(CopyButton, {
741
+ value: walletAddress,
742
+ "aria-label": labels.deposit.cardFlow.pendingCopyAddress,
743
+ className: "text-agg-muted-foreground hover:text-agg-foreground"
744
+ })]
745
+ })]
746
+ }) : null,
747
+ /* @__PURE__ */ jsxs("div", {
748
+ className: "flex items-start justify-center gap-3",
749
+ children: [/* @__PURE__ */ jsx(Button, {
750
+ variant: "secondary",
751
+ size: "large",
752
+ className: "w-[120px]",
753
+ onClick: onClose,
754
+ children: labels.common.close
755
+ }), /* @__PURE__ */ jsx(Button, {
756
+ variant: "primary",
757
+ size: "large",
758
+ onClick: onViewActivity,
759
+ children: labels.deposit.cardFlow.viewActivity
760
+ })]
761
+ }),
762
+ /* @__PURE__ */ jsx("button", {
763
+ type: "button",
764
+ className: "agg-type-body font-agg-bold text-agg-primary transition-colors cursor-pointer hover:text-agg-primary/80",
765
+ onClick: onChooseAnotherProvider,
766
+ children: labels.deposit.cardFlow.chooseAnotherProvider
767
+ })
768
+ ]
769
+ })]
770
+ })
771
+ });
772
+ };
773
+ //#endregion
774
+ //#region src/deposit/steps/card-provider.tsx
775
+ const CardProviderItem = ({ provider, onSelect }) => {
776
+ const labels = useLabels();
777
+ const badgeText = provider.badge === "best" ? labels.deposit.cardFlow.providerBadges.best : provider.badge === "low-kyc" ? labels.deposit.cardFlow.providerBadges.lowKyc : void 0;
778
+ return /* @__PURE__ */ jsx("button", {
779
+ type: "button",
780
+ className: "w-full rounded-xl border border-agg-separator px-4 py-3 text-left bg-agg-secondary hover:bg-agg-secondary-hover transition-colors cursor-pointer",
781
+ onClick: () => onSelect(provider.id),
782
+ children: /* @__PURE__ */ jsxs("div", {
783
+ className: "flex items-center justify-between gap-4",
784
+ children: [/* @__PURE__ */ jsxs("div", {
785
+ className: "flex items-center gap-2",
786
+ children: [/* @__PURE__ */ jsx("p", {
787
+ className: "text-agg-base leading-agg-6 font-agg-bold text-agg-foreground",
788
+ children: provider.name
789
+ }), badgeText ? /* @__PURE__ */ jsx("span", {
790
+ className: `rounded border px-2 py-[2px] text-[10px] leading-[14px] font-agg-bold uppercase ${provider.badge === "best" ? "border-agg-primary/50 text-agg-primary bg-agg-secondary" : "border-agg-separator text-agg-foreground bg-agg-secondary"}`,
791
+ children: badgeText
792
+ }) : null]
793
+ }), /* @__PURE__ */ jsxs("div", {
794
+ className: "flex items-center gap-4",
795
+ children: [/* @__PURE__ */ jsxs("div", {
796
+ className: "text-right",
797
+ children: [/* @__PURE__ */ jsx("p", {
798
+ className: "agg-type-body text-agg-foreground",
799
+ children: provider.quote
800
+ }), /* @__PURE__ */ jsxs("p", {
801
+ className: "agg-type-label text-agg-muted-foreground",
802
+ children: [
803
+ labels.deposit.cardFlow.feeLabel,
804
+ " ",
805
+ provider.fee
806
+ ]
807
+ })]
808
+ }), /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5 text-agg-muted-foreground" })]
809
+ })]
810
+ })
811
+ });
812
+ };
813
+ const CardProviderStep = ({ token, amount, currency, providers, isLoading, error, sessionError, onBack, onSelectProvider, onRetry }) => {
814
+ const labels = useLabels();
815
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
816
+ title: labels.deposit.cardFlow.selectProviderTitle,
817
+ hideBorder: true,
818
+ leftElement: /* @__PURE__ */ jsx("button", {
819
+ type: "button",
820
+ className: "mr-2 flex items-center justify-center text-agg-foreground transition-colors hover:cursor-pointer hover:text-agg-foreground/80",
821
+ onClick: onBack,
822
+ "aria-label": labels.deposit.back,
823
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-6 w-6" })
824
+ })
825
+ }), /* @__PURE__ */ jsx(Modal.Body, {
826
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
827
+ children: /* @__PURE__ */ jsxs("div", {
828
+ className: "flex flex-col gap-4",
829
+ children: [/* @__PURE__ */ jsxs("div", {
830
+ className: "flex items-center gap-1.5",
831
+ children: [
832
+ /* @__PURE__ */ jsx(UsdcIcon, { className: "h-4 w-4 shrink-0" }),
833
+ /* @__PURE__ */ jsx("span", {
834
+ className: "agg-type-body font-agg-bold text-agg-foreground",
835
+ children: token
836
+ }),
837
+ /* @__PURE__ */ jsxs("span", {
838
+ className: "agg-type-body text-agg-foreground",
839
+ children: [
840
+ "$",
841
+ amount,
842
+ " ",
843
+ currency
844
+ ]
845
+ })
846
+ ]
847
+ }), isLoading ? /* @__PURE__ */ jsxs("div", {
848
+ className: "flex min-h-[200px] flex-col items-center justify-center gap-3",
849
+ children: [/* @__PURE__ */ jsx(LoadingIcon, { variant: "prominent" }), /* @__PURE__ */ jsx("p", {
850
+ className: "agg-type-body text-agg-foreground",
851
+ children: labels.deposit.cardFlow.loadingQuotes
852
+ })]
853
+ }) : error ? /* @__PURE__ */ jsxs("div", {
854
+ className: "flex min-h-[200px] flex-col items-center justify-center gap-6 px-2 text-center",
855
+ children: [
856
+ /* @__PURE__ */ jsx(Icon, {
857
+ name: "quotes-warning",
858
+ size: "large",
859
+ className: "!h-9 !w-9 shrink-0 text-agg-muted-foreground",
860
+ color: "currentColor"
861
+ }),
862
+ /* @__PURE__ */ jsxs("div", {
863
+ className: "flex max-w-[320px] flex-col gap-2",
864
+ children: [/* @__PURE__ */ jsx("p", {
865
+ className: "text-agg-base leading-agg-6 font-agg-bold text-agg-foreground",
866
+ children: labels.deposit.cardFlow.errorLoadingQuotesTitle
867
+ }), /* @__PURE__ */ jsx("p", {
868
+ className: "agg-type-body text-agg-muted-foreground",
869
+ children: labels.deposit.cardFlow.errorLoadingQuotesDescription
870
+ })]
871
+ }),
872
+ onRetry ? /* @__PURE__ */ jsx(Button, {
873
+ variant: "secondary",
874
+ size: "medium",
875
+ onClick: onRetry,
876
+ children: labels.deposit.cardFlow.retry
877
+ }) : null
878
+ ]
879
+ }) : providers.length === 0 ? /* @__PURE__ */ jsx("div", {
880
+ className: "flex min-h-[200px] items-center justify-center",
881
+ children: /* @__PURE__ */ jsx("p", {
882
+ className: "agg-type-body text-agg-muted-foreground",
883
+ children: labels.deposit.cardFlow.noQuotes
884
+ })
885
+ }) : /* @__PURE__ */ jsxs("div", {
886
+ className: "flex flex-col gap-4",
887
+ children: [providers.map((provider) => /* @__PURE__ */ jsx(CardProviderItem, {
888
+ provider,
889
+ onSelect: onSelectProvider
890
+ }, provider.id)), sessionError ? /* @__PURE__ */ jsx("p", {
891
+ className: "agg-type-label text-agg-error text-center",
892
+ children: sessionError
893
+ }) : null]
894
+ })]
895
+ })
896
+ })] });
897
+ };
898
+ //#endregion
899
+ //#region src/deposit/steps/card-purchase-success.tsx
900
+ const SummaryRow$1 = ({ label, value }) => /* @__PURE__ */ jsxs("div", {
901
+ className: "flex items-center justify-between border-b border-agg-separator py-2 last:border-b-0",
902
+ children: [/* @__PURE__ */ jsx("p", {
903
+ className: "text-[12px] leading-4 font-agg-bold uppercase text-agg-muted-foreground",
904
+ children: label
905
+ }), /* @__PURE__ */ jsx("p", {
906
+ className: "agg-type-label text-agg-foreground",
907
+ children: value
908
+ })]
909
+ });
910
+ const CardPurchaseSuccessStep = ({ summary, onDone, onClose }) => {
911
+ const labels = useLabels();
912
+ return /* @__PURE__ */ jsx("div", {
913
+ className: "relative",
914
+ children: /* @__PURE__ */ jsxs(Modal.Body, {
915
+ classNames: { root: "px-5 py-8 sm:px-8 sm:py-10" },
916
+ children: [/* @__PURE__ */ jsx("button", {
917
+ type: "button",
918
+ className: "absolute right-8 top-7 flex items-center justify-center text-agg-foreground transition-colors hover:text-agg-foreground/80",
919
+ onClick: onClose,
920
+ "aria-label": labels.common.close,
921
+ children: /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6" })
922
+ }), /* @__PURE__ */ jsxs("div", {
923
+ className: "flex flex-col items-center gap-8",
924
+ children: [
925
+ /* @__PURE__ */ jsx("div", {
926
+ className: "flex h-[60px] w-[60px] items-center justify-center rounded-full bg-agg-success/15",
927
+ children: /* @__PURE__ */ jsx(SuccessCheckIcon, { className: "h-6 w-6 text-agg-success" })
928
+ }),
929
+ /* @__PURE__ */ jsxs("div", {
930
+ className: "flex flex-col items-center gap-3 text-center",
931
+ children: [/* @__PURE__ */ jsx("h3", {
932
+ className: "text-agg-2xl leading-agg-8 font-agg-bold text-agg-foreground",
933
+ children: labels.deposit.cardFlow.successTitle
934
+ }), /* @__PURE__ */ jsx("p", {
935
+ className: "agg-type-body text-agg-foreground",
936
+ children: labels.deposit.cardFlow.successDescription
937
+ })]
938
+ }),
939
+ /* @__PURE__ */ jsxs("div", {
940
+ className: "w-full rounded-lg border border-agg-separator bg-agg-secondary px-3 py-1",
941
+ children: [
942
+ /* @__PURE__ */ jsx(SummaryRow$1, {
943
+ label: labels.deposit.summary.amountReceived,
944
+ value: summary.amountReceived
945
+ }),
946
+ /* @__PURE__ */ jsx(SummaryRow$1, {
947
+ label: labels.deposit.summary.network,
948
+ value: summary.network
949
+ }),
950
+ /* @__PURE__ */ jsx(SummaryRow$1, {
951
+ label: labels.deposit.cardFlow.summary.fees,
952
+ value: summary.fees
953
+ })
954
+ ]
955
+ }),
956
+ /* @__PURE__ */ jsx(Button, {
957
+ variant: "secondary",
958
+ size: "large",
959
+ className: "w-[120px]",
960
+ onClick: onDone,
961
+ children: labels.deposit.done
962
+ })
963
+ ]
964
+ })]
965
+ })
966
+ });
967
+ };
968
+ //#endregion
969
+ //#region src/deposit/components/DepositQRCode.tsx
970
+ function DepositQRCode({ depositAddress, networkLogoUrl, networkLogo, size = 160 }) {
971
+ return /* @__PURE__ */ jsx("div", {
972
+ className: "inline-flex items-center justify-center rounded-xl border",
973
+ style: {
974
+ padding: 16,
975
+ borderColor: "#E5E7EB",
976
+ backgroundColor: "#FFFFFF"
977
+ },
978
+ children: /* @__PURE__ */ jsxs("div", {
979
+ className: "relative",
980
+ style: {
981
+ width: size,
982
+ height: size
983
+ },
984
+ children: [/* @__PURE__ */ jsx(QRCodeSVG, {
985
+ value: depositAddress,
986
+ size,
987
+ level: "H"
988
+ }), networkLogo ? /* @__PURE__ */ jsx("div", {
989
+ className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-sm",
990
+ style: {
991
+ width: 32,
992
+ height: 32,
993
+ backgroundColor: "#FFFFFF",
994
+ padding: 2
995
+ },
996
+ children: networkLogo
997
+ }) : networkLogoUrl ? /* @__PURE__ */ jsx("img", {
998
+ src: networkLogoUrl,
999
+ alt: "",
1000
+ className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-sm",
1001
+ width: 32,
1002
+ height: 32,
1003
+ style: {
1004
+ backgroundColor: "#FFFFFF",
1005
+ padding: 2
1006
+ }
1007
+ }) : null]
1008
+ })
1009
+ });
1010
+ }
1011
+ DepositQRCode.displayName = "DepositQRCode";
1012
+ //#endregion
1013
+ //#region src/deposit/steps/crypto-transfer.tsx
1014
+ const CryptoAddressLoadingState = () => {
1015
+ const sendCryptoLabels = useLabels().deposit.sendCrypto;
1016
+ return /* @__PURE__ */ jsxs("div", {
1017
+ className: "flex w-full flex-col items-center justify-center gap-6 py-10 text-center text-agg-foreground",
1018
+ role: "status",
1019
+ "aria-live": "polite",
1020
+ children: [/* @__PURE__ */ jsx("span", {
1021
+ className: "h-9 w-9 animate-spin rounded-full border-2 border-agg-primary/25 border-t-agg-primary",
1022
+ "aria-hidden": "true"
1023
+ }), /* @__PURE__ */ jsxs("div", {
1024
+ className: "flex w-full flex-col items-center gap-2",
1025
+ children: [/* @__PURE__ */ jsx("p", {
1026
+ className: "text-agg-base font-agg-bold leading-agg-6",
1027
+ children: sendCryptoLabels.addressLoadingTitle
1028
+ }), /* @__PURE__ */ jsx("p", {
1029
+ className: "max-w-[300px] text-agg-sm leading-agg-5",
1030
+ children: sendCryptoLabels.addressLoadingDescription
1031
+ })]
1032
+ })]
1033
+ });
1034
+ };
1035
+ const getEstimateAmountFromMinDeposit = (minDeposit) => {
1036
+ return minDeposit.replace(/[^0-9.]/g, "") || "1";
1037
+ };
1038
+ const CryptoTransferStep = ({ tokenOptions, networkOptions, selectedToken, selectedNetwork, depositAddress, minDeposit, eta, isLoadingAddress, addressError, onBack, onTokenChange, onNetworkChange, onCopyAddress, onDone }) => {
1039
+ const labels = useLabels();
1040
+ const selectedNetworkOption = networkOptions.find((n) => n.value === selectedNetwork);
1041
+ const networkLogoUrl = selectedNetworkOption?.iconUrl ?? "";
1042
+ const networkLogo = selectedNetworkOption?.icon;
1043
+ const transferFeeEstimate = useWithdrawEstimate({
1044
+ amount: getEstimateAmountFromMinDeposit(minDeposit),
1045
+ selectedToken,
1046
+ selectedNetwork
1047
+ });
1048
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
1049
+ title: labels.deposit.sendCrypto.title,
1050
+ hideBorder: true,
1051
+ leftElement: /* @__PURE__ */ jsx("button", {
1052
+ type: "button",
1053
+ className: "mr-2 flex items-center justify-center text-agg-foreground transition-colors hover:cursor-pointer hover:text-agg-foreground/80",
1054
+ onClick: onBack,
1055
+ "aria-label": "Go back",
1056
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-6 w-6" })
1057
+ })
1058
+ }), /* @__PURE__ */ jsx(Modal.Body, {
1059
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
1060
+ children: /* @__PURE__ */ jsxs("div", {
1061
+ className: "flex flex-col gap-7",
1062
+ children: [
1063
+ /* @__PURE__ */ jsx("div", {
1064
+ className: "flex flex-col gap-5",
1065
+ children: /* @__PURE__ */ jsxs("div", {
1066
+ className: "flex gap-5",
1067
+ children: [/* @__PURE__ */ jsxs("div", {
1068
+ className: "flex flex-1 flex-col gap-2 min-w-0",
1069
+ children: [/* @__PURE__ */ jsx("p", {
1070
+ className: "agg-type-label-strong text-agg-foreground",
1071
+ children: labels.deposit.sendCrypto.tokenLabel
1072
+ }), /* @__PURE__ */ jsx(Select, {
1073
+ items: tokenOptions,
1074
+ value: selectedToken,
1075
+ onChange: onTokenChange,
1076
+ ariaLabel: labels.deposit.sendCrypto.tokenLabel
1077
+ })]
1078
+ }), /* @__PURE__ */ jsxs("div", {
1079
+ className: "flex flex-1 flex-col gap-2 min-w-0",
1080
+ children: [/* @__PURE__ */ jsx("p", {
1081
+ className: "agg-type-label-strong text-agg-foreground",
1082
+ children: labels.deposit.sendCrypto.networkLabel
1083
+ }), /* @__PURE__ */ jsx(Select, {
1084
+ items: networkOptions,
1085
+ value: selectedNetwork,
1086
+ onChange: onNetworkChange,
1087
+ ariaLabel: labels.deposit.sendCrypto.networkLabel
1088
+ })]
1089
+ })]
1090
+ })
1091
+ }),
1092
+ /* @__PURE__ */ jsx("div", {
1093
+ className: "mx-auto",
1094
+ children: isLoadingAddress ? /* @__PURE__ */ jsx(CryptoAddressLoadingState, {}) : addressError ? /* @__PURE__ */ jsx("div", {
1095
+ className: "flex h-[192px] w-[192px] items-center justify-center rounded-xl border border-agg-separator bg-agg-secondary",
1096
+ children: /* @__PURE__ */ jsx("p", {
1097
+ className: "agg-type-label text-center text-agg-error px-3",
1098
+ children: addressError
1099
+ })
1100
+ }) : /* @__PURE__ */ jsx(DepositQRCode, {
1101
+ depositAddress,
1102
+ networkLogoUrl,
1103
+ networkLogo
1104
+ })
1105
+ }),
1106
+ /* @__PURE__ */ jsxs("div", {
1107
+ className: "flex flex-col gap-3",
1108
+ children: [
1109
+ /* @__PURE__ */ jsx("p", {
1110
+ className: "agg-type-label-strong text-agg-foreground",
1111
+ children: labels.deposit.sendCrypto.depositAddressLabel
1112
+ }),
1113
+ /* @__PURE__ */ jsxs("div", {
1114
+ className: "flex items-center gap-2 rounded border border-agg-separator bg-agg-secondary h-10 px-3",
1115
+ children: [isLoadingAddress ? /* @__PURE__ */ jsx("div", { className: "h-4 flex-1 animate-pulse rounded bg-agg-muted-foreground/20" }) : /* @__PURE__ */ jsx("p", {
1116
+ className: "agg-type-body flex-1 min-w-0 truncate text-agg-foreground",
1117
+ children: depositAddress
1118
+ }), /* @__PURE__ */ jsx(CopyButton, {
1119
+ value: depositAddress,
1120
+ label: labels.deposit.sendCrypto.copy,
1121
+ copiedLabel: labels.deposit.sendCrypto.copied,
1122
+ disabled: isLoadingAddress || !!addressError || !depositAddress,
1123
+ onCopy: onCopyAddress,
1124
+ className: "text-agg-primary hover:text-agg-primary/80"
1125
+ })]
1126
+ }),
1127
+ /* @__PURE__ */ jsx(TransferFeeSummary, {
1128
+ estimate: transferFeeEstimate,
1129
+ view: "deposit",
1130
+ minDeposit,
1131
+ eta
1132
+ })
1133
+ ]
1134
+ }),
1135
+ /* @__PURE__ */ jsxs("div", {
1136
+ className: "flex items-start gap-3 rounded-lg bg-agg-secondary-hover p-3",
1137
+ children: [/* @__PURE__ */ jsx(WarningIcon, { className: "h-4 w-4 text-agg-muted-foreground mt-0.5" }), /* @__PURE__ */ jsx("p", {
1138
+ className: "text-agg-xs leading-agg-4 text-agg-foreground",
1139
+ children: labels.deposit.sendCrypto.warning
1140
+ })]
1141
+ }),
1142
+ /* @__PURE__ */ jsx(Button, {
1143
+ variant: "secondary",
1144
+ size: "large",
1145
+ className: "w-[120px] self-center",
1146
+ onClick: onDone,
1147
+ children: labels.deposit.done
1148
+ })
1149
+ ]
1150
+ })
1151
+ })] });
1152
+ };
1153
+ //#endregion
1154
+ //#region src/deposit/steps/deposit-method.tsx
1155
+ const DepositMethodCard = ({ icon, title, description, value, highlighted = false, disabled = false, onContinue }) => /* @__PURE__ */ jsxs("div", {
1156
+ className: cn("flex items-center gap-3 sm:gap-4", "rounded-xl border border-agg-separator", "p-3 sm:p-4", "transition-colors", disabled ? "opacity-50 cursor-not-allowed pointer-events-none" : "cursor-pointer hover:bg-agg-secondary-hover", highlighted ? "" : ""),
1157
+ role: "button",
1158
+ tabIndex: disabled ? -1 : 0,
1159
+ "aria-disabled": disabled || void 0,
1160
+ onClick: disabled ? void 0 : onContinue,
1161
+ onKeyDown: disabled ? void 0 : (e) => {
1162
+ if (e.key === "Enter" || e.key === " ") {
1163
+ e.preventDefault();
1164
+ onContinue();
1165
+ }
1166
+ },
1167
+ children: [
1168
+ /* @__PURE__ */ jsx("div", {
1169
+ className: "shrink-0 flex items-center justify-center h-10 w-10 rounded-lg bg-agg-secondary-hover",
1170
+ children: icon
1171
+ }),
1172
+ /* @__PURE__ */ jsxs("div", {
1173
+ className: "flex-1 min-w-0",
1174
+ children: [/* @__PURE__ */ jsx("p", {
1175
+ className: "agg-type-body-strong text-agg-foreground",
1176
+ children: title
1177
+ }), /* @__PURE__ */ jsx("p", {
1178
+ className: "agg-type-label text-agg-muted-foreground",
1179
+ children: description
1180
+ })]
1181
+ }),
1182
+ value ? /* @__PURE__ */ jsx("p", {
1183
+ className: "agg-type-label text-agg-muted-foreground",
1184
+ children: value
1185
+ }) : null,
1186
+ /* @__PURE__ */ jsx("div", {
1187
+ className: "shrink-0 text-agg-muted-foreground",
1188
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
1189
+ })
1190
+ ]
1191
+ });
1192
+ const DepositMethodStep = ({ balance, walletLabel, walletBalance, walletToken, isWalletBalanceLoading = false, showWalletMethod = true, highlightedMethod, depositAddressesReady = true, onSelectMethod }) => {
1193
+ const labels = useLabels();
1194
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
1195
+ title: labels.deposit.title,
1196
+ hideBorder: true
1197
+ }), /* @__PURE__ */ jsx(Modal.Body, {
1198
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
1199
+ children: /* @__PURE__ */ jsxs("div", {
1200
+ className: "flex flex-col gap-5",
1201
+ children: [/* @__PURE__ */ jsxs("p", {
1202
+ className: "agg-type-body text-agg-foreground",
1203
+ children: [
1204
+ labels.deposit.balancePrefix,
1205
+ " ",
1206
+ formatCompactUsd(balance)
1207
+ ]
1208
+ }), /* @__PURE__ */ jsxs("div", {
1209
+ className: "flex flex-col gap-4",
1210
+ children: [
1211
+ showWalletMethod ? /* @__PURE__ */ jsx(DepositMethodCard, {
1212
+ icon: /* @__PURE__ */ jsx(WalletIcon, { className: "h-6 w-6 text-agg-muted-foreground" }),
1213
+ title: labels.deposit.methods.walletTitle(walletLabel),
1214
+ description: labels.deposit.methods.walletDescription,
1215
+ value: isWalletBalanceLoading ? /* @__PURE__ */ jsx(LoadingIcon, { size: "small" }) : formatTokenAmount(walletBalance, walletToken),
1216
+ highlighted: highlightedMethod === "wallet",
1217
+ disabled: !depositAddressesReady,
1218
+ onContinue: () => onSelectMethod("wallet")
1219
+ }) : null,
1220
+ /* @__PURE__ */ jsx(DepositMethodCard, {
1221
+ icon: /* @__PURE__ */ jsx(BoltIcon, { className: "h-6 w-6 text-agg-muted-foreground" }),
1222
+ title: labels.deposit.methods.cryptoTitle,
1223
+ description: labels.deposit.methods.cryptoDescription,
1224
+ highlighted: highlightedMethod === "crypto",
1225
+ disabled: !depositAddressesReady,
1226
+ onContinue: () => onSelectMethod("crypto")
1227
+ }),
1228
+ /* @__PURE__ */ jsx(DepositMethodCard, {
1229
+ icon: /* @__PURE__ */ jsx(CreditCardIcon, { className: "h-6 w-6 text-agg-muted-foreground" }),
1230
+ title: labels.deposit.methods.cardTitle,
1231
+ description: labels.deposit.methods.cardDescription,
1232
+ highlighted: highlightedMethod === "card",
1233
+ onContinue: () => onSelectMethod("card")
1234
+ })
1235
+ ]
1236
+ })]
1237
+ })
1238
+ })] });
1239
+ };
1240
+ //#endregion
1241
+ //#region src/deposit/steps/wallet-form.tsx
1242
+ const WalletFormStep = ({ walletLabel, walletBalance, isBalanceLoading = false, tokenOptions, networkOptions, selectedToken, selectedNetwork, amount, isSubmitting = false, formErrorMessage, formErrorTone = "error", estimatedReceive, feeEstimate, eta, onBack, onTokenChange, onNetworkChange, onAmountChange, onMax, onConfirm }) => {
1243
+ const labels = useLabels();
1244
+ const isConfirmEnabled = !isSubmitting && !isBalanceLoading && Number(amount) > 0 && Number(amount) <= walletBalance;
1245
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
1246
+ title: labels.deposit.walletFlow.title,
1247
+ hideBorder: true,
1248
+ leftElement: /* @__PURE__ */ jsx("button", {
1249
+ type: "button",
1250
+ className: "mr-2 flex items-center justify-center text-agg-foreground transition-colors hover:cursor-pointer hover:text-agg-foreground/80",
1251
+ onClick: onBack,
1252
+ "aria-label": "Go back",
1253
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-6 w-6" })
1254
+ })
1255
+ }), /* @__PURE__ */ jsx(Modal.Body, {
1256
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
1257
+ children: /* @__PURE__ */ jsxs("div", {
1258
+ className: "flex flex-col gap-7",
1259
+ children: [
1260
+ /* @__PURE__ */ jsxs("div", {
1261
+ className: "flex items-center justify-between",
1262
+ children: [/* @__PURE__ */ jsx("p", {
1263
+ className: "agg-type-label text-agg-foreground",
1264
+ children: walletLabel
1265
+ }), /* @__PURE__ */ jsxs("p", {
1266
+ className: "agg-type-label text-agg-muted-foreground",
1267
+ children: [
1268
+ labels.deposit.balanceLabel,
1269
+ " ",
1270
+ isBalanceLoading ? /* @__PURE__ */ jsx(LoadingIcon, { size: "small" }) : formatTokenAmount(walletBalance, selectedToken)
1271
+ ]
1272
+ })]
1273
+ }),
1274
+ /* @__PURE__ */ jsxs("div", {
1275
+ className: "flex flex-col gap-5",
1276
+ children: [
1277
+ /* @__PURE__ */ jsxs("div", {
1278
+ className: "flex gap-5",
1279
+ children: [/* @__PURE__ */ jsxs("div", {
1280
+ className: "flex flex-1 flex-col gap-2 min-w-0",
1281
+ children: [/* @__PURE__ */ jsx("p", {
1282
+ className: "agg-type-label-strong text-agg-foreground",
1283
+ children: labels.deposit.walletFlow.tokenLabel
1284
+ }), /* @__PURE__ */ jsx(Select, {
1285
+ items: tokenOptions,
1286
+ value: selectedToken,
1287
+ onChange: onTokenChange,
1288
+ ariaLabel: labels.deposit.walletFlow.tokenLabel
1289
+ })]
1290
+ }), networkOptions.length >= 1 ? /* @__PURE__ */ jsxs("div", {
1291
+ className: "flex flex-1 flex-col gap-2 min-w-0",
1292
+ children: [/* @__PURE__ */ jsx("p", {
1293
+ className: "agg-type-label-strong text-agg-foreground",
1294
+ children: labels.deposit.walletFlow.networkLabel
1295
+ }), /* @__PURE__ */ jsx(Select, {
1296
+ items: networkOptions,
1297
+ value: selectedNetwork,
1298
+ onChange: onNetworkChange,
1299
+ ariaLabel: labels.deposit.walletFlow.networkLabel
1300
+ })]
1301
+ }) : null]
1302
+ }),
1303
+ /* @__PURE__ */ jsxs("div", {
1304
+ className: "flex flex-col gap-2",
1305
+ children: [/* @__PURE__ */ jsx("p", {
1306
+ className: "agg-type-label-strong text-agg-foreground",
1307
+ children: labels.deposit.walletFlow.amountLabel
1308
+ }), /* @__PURE__ */ jsxs("div", {
1309
+ className: cn("flex items-center gap-2", "rounded border border-agg-separator bg-agg-secondary", "h-10 px-3"),
1310
+ children: [/* @__PURE__ */ jsx("input", {
1311
+ type: "text",
1312
+ inputMode: "decimal",
1313
+ "aria-label": labels.deposit.walletFlow.amountLabel,
1314
+ className: "agg-type-body w-full bg-transparent outline-none text-agg-foreground",
1315
+ placeholder: "0.00",
1316
+ value: amount,
1317
+ onChange: (event) => onAmountChange(event.target.value)
1318
+ }), /* @__PURE__ */ jsx("button", {
1319
+ type: "button",
1320
+ className: "shrink-0 text-agg-sm font-agg-bold leading-agg-5 text-agg-primary transition-colors hover:text-agg-primary/80 cursor-pointer",
1321
+ onClick: onMax,
1322
+ "aria-label": labels.deposit.walletFlow.max,
1323
+ children: labels.deposit.walletFlow.max
1324
+ })]
1325
+ })]
1326
+ }),
1327
+ estimatedReceive && feeEstimate && eta ? /* @__PURE__ */ jsx("p", {
1328
+ className: "agg-type-label text-agg-foreground",
1329
+ children: `≈ ${estimatedReceive} · ${labels.deposit.walletFlow.feePrefix} ${feeEstimate} · ${eta}`
1330
+ }) : null,
1331
+ formErrorMessage ? /* @__PURE__ */ jsxs("div", {
1332
+ className: cn("flex items-start gap-2", formErrorTone === "warning" ? "text-agg-warning" : "text-agg-error"),
1333
+ children: [/* @__PURE__ */ jsx(WarningIcon, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ jsx("p", {
1334
+ className: "agg-type-label",
1335
+ children: formErrorMessage
1336
+ })]
1337
+ }) : null
1338
+ ]
1339
+ }),
1340
+ /* @__PURE__ */ jsx(Button, {
1341
+ variant: isConfirmEnabled ? "primary" : "secondary",
1342
+ size: "large",
1343
+ className: "w-full",
1344
+ disabled: !isConfirmEnabled,
1345
+ isLoading: isSubmitting,
1346
+ "aria-label": labels.deposit.walletFlow.confirm,
1347
+ onClick: onConfirm,
1348
+ children: labels.deposit.walletFlow.confirm
1349
+ })
1350
+ ]
1351
+ })
1352
+ })] });
1353
+ };
1354
+ //#endregion
1355
+ //#region src/deposit/steps/wallet-processing.tsx
1356
+ const WalletProcessingStep = ({ steps, errorMessage, onComplete }) => {
1357
+ const labels = useLabels();
1358
+ useEffect(() => {
1359
+ if (steps.length > 0 && steps.every((s) => s.status === "complete")) onComplete();
1360
+ }, [steps, onComplete]);
1361
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
1362
+ title: labels.deposit.processingTitle,
1363
+ hideBorder: true
1364
+ }), /* @__PURE__ */ jsx(Modal.Body, {
1365
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
1366
+ children: /* @__PURE__ */ jsxs("div", {
1367
+ className: "flex flex-col gap-5",
1368
+ children: [steps.map((step) => {
1369
+ const isComplete = step.status === "complete";
1370
+ const isActive = step.status === "active";
1371
+ return /* @__PURE__ */ jsxs("div", {
1372
+ className: "flex items-center gap-3",
1373
+ children: [isComplete ? /* @__PURE__ */ jsx(CheckCircleIcon, { className: "h-4 w-4 text-agg-primary" }) : /* @__PURE__ */ jsx("span", { className: [
1374
+ "inline-block h-4 w-4 rounded-full border",
1375
+ isActive ? "border-2 border-agg-primary border-r-transparent animate-spin" : "",
1376
+ !isActive ? "border-agg-separator" : ""
1377
+ ].join(" ") }), /* @__PURE__ */ jsx("p", {
1378
+ className: isComplete || isActive ? "agg-type-body text-agg-foreground" : "agg-type-body text-agg-muted-foreground",
1379
+ children: step.label
1380
+ })]
1381
+ }, step.id);
1382
+ }), errorMessage ? /* @__PURE__ */ jsx("p", {
1383
+ className: "agg-type-body text-agg-destructive",
1384
+ children: errorMessage
1385
+ }) : null]
1386
+ })
1387
+ })] });
1388
+ };
1389
+ //#endregion
1390
+ //#region src/deposit/steps/wallet-success.tsx
1391
+ const SummaryRow = ({ label, value }) => /* @__PURE__ */ jsxs("div", {
1392
+ className: "flex items-center justify-between border-b border-agg-separator py-2 last:border-b-0",
1393
+ children: [/* @__PURE__ */ jsx("p", {
1394
+ className: "text-[12px] leading-4 font-agg-bold uppercase text-agg-muted-foreground",
1395
+ children: label
1396
+ }), /* @__PURE__ */ jsx("p", {
1397
+ className: "agg-type-label text-agg-foreground",
1398
+ children: value
1399
+ })]
1400
+ });
1401
+ const WalletSuccessStep = ({ summary, onDone, onClose }) => {
1402
+ const labels = useLabels();
1403
+ return /* @__PURE__ */ jsx("div", {
1404
+ className: "relative",
1405
+ children: /* @__PURE__ */ jsxs(Modal.Body, {
1406
+ classNames: { root: "px-5 py-8 sm:px-8 sm:py-10" },
1407
+ children: [/* @__PURE__ */ jsx("button", {
1408
+ type: "button",
1409
+ className: "absolute right-8 top-7 flex items-center justify-center text-agg-foreground transition-colors hover:text-agg-foreground/80",
1410
+ onClick: onClose,
1411
+ "aria-label": labels.common.close,
1412
+ children: /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6" })
1413
+ }), /* @__PURE__ */ jsxs("div", {
1414
+ className: "flex flex-col items-center gap-8",
1415
+ children: [
1416
+ /* @__PURE__ */ jsx("div", {
1417
+ className: "flex h-[60px] w-[60px] items-center justify-center rounded-full bg-agg-success/15",
1418
+ children: /* @__PURE__ */ jsx(SuccessCheckIcon, { className: "h-6 w-6 text-agg-success" })
1419
+ }),
1420
+ /* @__PURE__ */ jsxs("div", {
1421
+ className: "flex flex-col items-center gap-3 text-center",
1422
+ children: [/* @__PURE__ */ jsx("h3", {
1423
+ className: "text-agg-2xl leading-agg-8 font-agg-bold text-agg-foreground",
1424
+ children: labels.deposit.successTitle
1425
+ }), /* @__PURE__ */ jsx("p", {
1426
+ className: "agg-type-body text-agg-foreground",
1427
+ children: labels.deposit.successDescription
1428
+ })]
1429
+ }),
1430
+ /* @__PURE__ */ jsxs("div", {
1431
+ className: "w-full rounded-lg border border-agg-separator bg-agg-secondary px-3 py-1",
1432
+ children: [
1433
+ /* @__PURE__ */ jsx(SummaryRow, {
1434
+ label: labels.deposit.summary.amountReceived,
1435
+ value: summary.amountReceived
1436
+ }),
1437
+ /* @__PURE__ */ jsx(SummaryRow, {
1438
+ label: labels.deposit.summary.network,
1439
+ value: summary.network
1440
+ }),
1441
+ /* @__PURE__ */ jsx(SummaryRow, {
1442
+ label: labels.deposit.summary.fromWallet,
1443
+ value: summary.fromWallet
1444
+ }),
1445
+ /* @__PURE__ */ jsx(SummaryRow, {
1446
+ label: labels.deposit.summary.gasFee,
1447
+ value: summary.gasFee
1448
+ })
1449
+ ]
1450
+ }),
1451
+ /* @__PURE__ */ jsx(Button, {
1452
+ variant: "secondary",
1453
+ size: "large",
1454
+ className: "w-[120px]",
1455
+ onClick: onDone,
1456
+ children: labels.deposit.done
1457
+ })
1458
+ ]
1459
+ })]
1460
+ })
1461
+ });
1462
+ };
1463
+ //#endregion
1464
+ //#region src/deposit/index.tsx
1465
+ const PENDING_CARD_SESSION_KEY = "agg-pending-card-session";
1466
+ const DEFAULT_WALLET_CHAIN_ID = "1";
1467
+ const DEFAULT_WALLET_TOKEN = "USDC";
1468
+ function savePendingCardSession(data) {
1469
+ try {
1470
+ localStorage.setItem(PENDING_CARD_SESSION_KEY, JSON.stringify(data));
1471
+ } catch {}
1472
+ }
1473
+ function clearPendingCardSession() {
1474
+ try {
1475
+ localStorage.removeItem(PENDING_CARD_SESSION_KEY);
1476
+ } catch {}
1477
+ }
1478
+ /**
1479
+ * Returns a pending card session if one exists in localStorage.
1480
+ * Consumers should use this on page load to detect a redirect from the ramp provider
1481
+ * and pass it as `pendingCardSession` to the DepositModal.
1482
+ */
1483
+ function getPendingCardSession() {
1484
+ try {
1485
+ const raw = localStorage.getItem(PENDING_CARD_SESSION_KEY);
1486
+ if (!raw) return null;
1487
+ return JSON.parse(raw);
1488
+ } catch {
1489
+ return null;
1490
+ }
1491
+ }
1492
+ function getDefaultProcessingSteps(transactionStatus, labels) {
1493
+ const defaultSteps = [{
1494
+ id: "submitting",
1495
+ label: labels.submitting,
1496
+ status: "active"
1497
+ }, {
1498
+ id: "confirming",
1499
+ label: labels.confirming,
1500
+ status: "pending"
1501
+ }];
1502
+ const activeByStatus = {
1503
+ submitting: 0,
1504
+ submitted: 1,
1505
+ confirming: 1,
1506
+ error: 1
1507
+ };
1508
+ if (transactionStatus === "settled") return defaultSteps.map((step) => ({
1509
+ ...step,
1510
+ status: "complete"
1511
+ }));
1512
+ const activeIndex = activeByStatus[transactionStatus ?? "submitted"] ?? 0;
1513
+ return defaultSteps.map((step, index) => ({
1514
+ ...step,
1515
+ status: index < activeIndex ? "complete" : index === activeIndex ? "active" : "pending"
1516
+ }));
1517
+ }
1518
+ function isControlledDepositModalProps(props) {
1519
+ return "walletFlow" in props;
1520
+ }
1521
+ function DepositModalSelfDriven({ open, onOpenChange }) {
1522
+ const depositProps = useDepositFlow({
1523
+ open,
1524
+ onOpenChange
1525
+ });
1526
+ return /* @__PURE__ */ jsx(DepositModalControlled, { ...depositProps });
1527
+ }
1528
+ function DepositModalControlled({ open, onOpenChange, onSelectDepositMethod, onContinueCardDeposit, onDoneCryptoTransfer, walletFlow, onWalletAmountChange, onWalletMax, onConfirmWalletDeposit, onCancelWalletDeposit, onDoneWalletDeposit, onWalletNetworkChange, onWalletTokenChange, initialWalletChainId, connectedWalletKind, sendCryptoConfig, onDoneSendCrypto, cardFlow, onCardAmountChange, onCardCurrencyChange, onCardTokenChange, onCardNetworkChange, onSelectCardProvider, onDoneCardPurchase, onViewActivity, cardRedirectUrl, onGetCardQuotes, onCreateCardSession, pendingCardPurchaseSummary }) {
1529
+ const { isWeb3User } = useAggAuthState();
1530
+ const { walletActions } = useAggUiConfig();
1531
+ const labels = useLabels();
1532
+ const defaultMethod = isWeb3User ? "wallet" : "crypto";
1533
+ const [step, setStep] = useState(() => pendingCardPurchaseSummary ? "card-success" : "method");
1534
+ const [highlightedMethod, setHighlightedMethod] = useState(defaultMethod);
1535
+ const walletSubmitInFlightRef = useRef(false);
1536
+ const walletDepositAttemptIdRef = useRef(0);
1537
+ const notifiedWalletDepositStatusesRef = useRef(/* @__PURE__ */ new Set());
1538
+ const [isWalletSubmitting, setIsWalletSubmitting] = useState(false);
1539
+ const [cardProviders, setCardProviders] = useState([]);
1540
+ const [quotesLoading, setQuotesLoading] = useState(false);
1541
+ const [quotesError, setQuotesError] = useState(null);
1542
+ const [sessionError, setSessionError] = useState(null);
1543
+ const [pendingProviderName, setPendingProviderName] = useState("");
1544
+ const [pendingProviderWalletAddress, setPendingProviderWalletAddress] = useState("");
1545
+ useEffect(() => {
1546
+ if (pendingCardPurchaseSummary) {
1547
+ clearPendingCardSession();
1548
+ setStep("card-success");
1549
+ }
1550
+ }, [pendingCardPurchaseSummary]);
1551
+ const [walletChainId, setWalletChainId] = useState("");
1552
+ const [walletToken, setWalletToken] = useState("");
1553
+ const [sendChainId, setSendChainId] = useState("");
1554
+ const [sendToken, setSendToken] = useState("");
1555
+ const { isReady, isTimedOut, error: addrError, supportedChains, getAddress } = useDepositAddresses({ enabled: open });
1556
+ const fallbackNetworkOptions = useMemo(() => mapNetworksToOptions(), []);
1557
+ const networkOptions = useMemo(() => {
1558
+ if (!supportedChains?.length) return fallbackNetworkOptions;
1559
+ return withNetworkIcons(supportedChains.map((c) => ({
1560
+ value: String(c.chainId),
1561
+ label: c.name
1562
+ })));
1563
+ }, [supportedChains, fallbackNetworkOptions]);
1564
+ const walletNetworkOptions = useMemo(() => {
1565
+ if (!supportedChains?.length || !connectedWalletKind) return networkOptions;
1566
+ const filtered = supportedChains.filter((c) => connectedWalletKind === "solana" ? SVM_CHAIN_IDS.has(c.chainId) : !SVM_CHAIN_IDS.has(c.chainId));
1567
+ if (filtered.length === 0) return networkOptions;
1568
+ return withNetworkIcons(filtered.map((c) => ({
1569
+ value: String(c.chainId),
1570
+ label: c.name
1571
+ })));
1572
+ }, [
1573
+ supportedChains,
1574
+ networkOptions,
1575
+ connectedWalletKind
1576
+ ]);
1577
+ const walletTokenOptions = useMemo(() => {
1578
+ const chain = supportedChains?.find((c) => String(c.chainId) === walletChainId);
1579
+ if (!chain) return withTokenIcons(DEFAULT_CURRENCY_OPTIONS);
1580
+ return withTokenIcons(chain.tokens.map((t) => ({
1581
+ value: t.symbol,
1582
+ label: t.symbol
1583
+ })));
1584
+ }, [supportedChains, walletChainId]);
1585
+ const sendTokenOptions = useMemo(() => {
1586
+ const chain = supportedChains?.find((c) => String(c.chainId) === sendChainId);
1587
+ if (!chain) return withTokenIcons(DEFAULT_CURRENCY_OPTIONS);
1588
+ return withTokenIcons(chain.tokens.map((t) => ({
1589
+ value: t.symbol,
1590
+ label: t.symbol
1591
+ })));
1592
+ }, [supportedChains, sendChainId]);
1593
+ useEffect(() => {
1594
+ if (walletNetworkOptions.length > 0) {
1595
+ if (!walletChainId || !walletNetworkOptions.some((o) => o.value === walletChainId)) {
1596
+ const ethereumMainnetOption = walletNetworkOptions.find((option) => option.value === DEFAULT_WALLET_CHAIN_ID || option.value === "mainnet" || option.label.toLowerCase() === "ethereum");
1597
+ const preferred = ethereumMainnetOption ? ethereumMainnetOption.value : initialWalletChainId && walletNetworkOptions.some((option) => option.value === initialWalletChainId) ? initialWalletChainId : walletNetworkOptions[0].value;
1598
+ setWalletChainId(preferred);
1599
+ }
1600
+ }
1601
+ }, [
1602
+ walletNetworkOptions,
1603
+ walletChainId,
1604
+ initialWalletChainId
1605
+ ]);
1606
+ useEffect(() => {
1607
+ if (networkOptions.length > 0) {
1608
+ if (!sendChainId || !networkOptions.some((o) => o.value === sendChainId)) setSendChainId(networkOptions[0].value);
1609
+ }
1610
+ }, [networkOptions, sendChainId]);
1611
+ useEffect(() => {
1612
+ if (walletTokenOptions.length > 0) {
1613
+ const preferredToken = walletTokenOptions.find((option) => option.value === DEFAULT_WALLET_TOKEN)?.value ?? walletTokenOptions[0].value;
1614
+ setWalletToken(preferredToken);
1615
+ }
1616
+ }, [walletTokenOptions]);
1617
+ useEffect(() => {
1618
+ setSendToken(sendTokenOptions?.[0]?.value ?? "");
1619
+ }, [sendTokenOptions]);
1620
+ useEffect(() => {
1621
+ if (walletChainId) onWalletNetworkChange?.(walletChainId);
1622
+ }, [walletChainId, onWalletNetworkChange]);
1623
+ useEffect(() => {
1624
+ if (walletToken) onWalletTokenChange?.(walletToken);
1625
+ }, [walletToken, onWalletTokenChange]);
1626
+ const depositAddress = getAddress(sendChainId ? Number(sendChainId) : void 0) ?? "";
1627
+ const isLoadingAddress = open && !isReady && !isTimedOut && !addrError;
1628
+ const addressError = isTimedOut && !isReady ? "Address generation timed out. Please try again." : addrError && !isReady ? "Failed to load deposit address." : void 0;
1629
+ const usesTransactionStatus = walletFlow.transactionStatus !== void 0;
1630
+ const processingStatus = isWalletSubmitting ? "submitting" : walletFlow.transactionStatus;
1631
+ const processingSteps = usesTransactionStatus ? walletFlow.processingSteps ?? getDefaultProcessingSteps(processingStatus, labels.deposit.processingSteps) : walletFlow.processingSteps ?? getDefaultProcessingSteps(processingStatus, labels.deposit.processingSteps);
1632
+ const selectedNetworkLabel = networkOptions.find((n) => n.value === walletChainId)?.label ?? "";
1633
+ const resolvedSuccessSummary = {
1634
+ amountReceived: `+${walletFlow.amount} ${walletToken}`,
1635
+ network: selectedNetworkLabel,
1636
+ fromWallet: walletFlow.walletLabel,
1637
+ gasFee: "",
1638
+ ...walletFlow.successSummary
1639
+ };
1640
+ const handleWalletDepositNotification = useCallback((status, errorMessage) => {
1641
+ if (notifiedWalletDepositStatusesRef.current.has(status)) return;
1642
+ notifiedWalletDepositStatusesRef.current.add(status);
1643
+ dispatchAggDepositNotification({
1644
+ id: `wallet-${walletDepositAttemptIdRef.current}`,
1645
+ status,
1646
+ amount: walletFlow.amount,
1647
+ tokenSymbol: walletToken || DEFAULT_WALLET_TOKEN,
1648
+ errorMessage
1649
+ });
1650
+ }, [walletFlow.amount, walletToken]);
1651
+ useEffect(() => {
1652
+ if (step === "wallet-processing" && !isWalletSubmitting && walletFlow.transactionStatus === "settled") {
1653
+ handleWalletDepositNotification("completed");
1654
+ setStep("wallet-success");
1655
+ }
1656
+ }, [
1657
+ handleWalletDepositNotification,
1658
+ isWalletSubmitting,
1659
+ step,
1660
+ walletFlow.transactionStatus
1661
+ ]);
1662
+ useEffect(() => {
1663
+ if (!onCancelWalletDeposit) return;
1664
+ if (step === "wallet-processing" && !isWalletSubmitting && walletFlow.transactionStatus === "error") {
1665
+ walletSubmitInFlightRef.current = false;
1666
+ handleWalletDepositNotification("failed", walletFlow.transactionErrorMessage);
1667
+ onCancelWalletDeposit();
1668
+ setStep("wallet-form");
1669
+ }
1670
+ }, [
1671
+ handleWalletDepositNotification,
1672
+ isWalletSubmitting,
1673
+ onCancelWalletDeposit,
1674
+ step,
1675
+ walletFlow.transactionErrorMessage,
1676
+ walletFlow.transactionStatus
1677
+ ]);
1678
+ const cardTokenOptions = withTokenIcons(mergeSelectOptionsUnique(cardFlow?.tokenOptions, DEFAULT_CURRENCY_OPTIONS));
1679
+ const cardNetworkOptions = withNetworkIcons(mergeSelectOptionsUnique(cardFlow?.networkOptions, CARD_NETWORK_OPTIONS));
1680
+ const handleSelectMethod = (method) => {
1681
+ if (method === "wallet" && !isWeb3User) return;
1682
+ if (!isReady && (method === "wallet" || method === "crypto")) return;
1683
+ setHighlightedMethod(method);
1684
+ onSelectDepositMethod?.(method);
1685
+ if (method === "wallet") {
1686
+ setStep("wallet-form");
1687
+ return;
1688
+ }
1689
+ if (method === "card") setStep("card-deposit");
1690
+ else if (method === "crypto") setStep("crypto-transfer");
1691
+ };
1692
+ const handleContinueCardDeposit = async (amount) => {
1693
+ onContinueCardDeposit?.(amount);
1694
+ setStep("card-provider");
1695
+ if (onGetCardQuotes) {
1696
+ setQuotesLoading(true);
1697
+ setQuotesError(null);
1698
+ setCardProviders([]);
1699
+ try {
1700
+ const providers = await onGetCardQuotes({
1701
+ sourceAmount: String(amount),
1702
+ sourceCurrencyCode: cardFlow?.currency ?? "USD",
1703
+ destinationCurrencyCode: NETWORK_TO_CURRENCY_CODE[cardFlow?.selectedNetwork ?? ""] ?? cardFlow?.selectedNetwork ?? ""
1704
+ });
1705
+ setCardProviders(providers);
1706
+ } catch (err) {
1707
+ setQuotesError(err instanceof Error ? err.message : "Failed to load quotes");
1708
+ } finally {
1709
+ setQuotesLoading(false);
1710
+ }
1711
+ } else setCardProviders(cardFlow?.providers ?? []);
1712
+ };
1713
+ const handleRetryQuotes = () => {
1714
+ const amount = Number(cardFlow?.amount) || 0;
1715
+ if (amount > 0) handleContinueCardDeposit(amount);
1716
+ };
1717
+ const handleSelectProvider = async (providerId) => {
1718
+ onSelectCardProvider?.(providerId);
1719
+ if (onCreateCardSession) {
1720
+ setSessionError(null);
1721
+ try {
1722
+ const networkVal = cardFlow?.selectedNetwork ?? "";
1723
+ const numericId = Number(networkVal);
1724
+ const cardChainId = Number.isFinite(numericId) && numericId > 0 ? numericId : supportedChains?.find((c) => c.name.toLowerCase() === networkVal.toLowerCase())?.chainId;
1725
+ const depositAddr = getAddress(cardChainId) ?? "";
1726
+ const session = await onCreateCardSession({
1727
+ serviceProvider: providerId,
1728
+ sourceAmount: cardFlow?.amount ?? "",
1729
+ sourceCurrencyCode: cardFlow?.currency ?? "USD",
1730
+ destinationCurrencyCode: NETWORK_TO_CURRENCY_CODE[networkVal] ?? networkVal,
1731
+ walletAddress: depositAddr,
1732
+ redirectUrl: cardRedirectUrl
1733
+ });
1734
+ const selectedProvider = cardProviders.find((p) => p.id === providerId);
1735
+ const networkLabel = cardFlow?.networkOptions?.find((o) => o.value === cardFlow?.selectedNetwork)?.label ?? cardFlow?.selectedNetwork ?? "";
1736
+ savePendingCardSession({
1737
+ sessionId: session.id,
1738
+ summary: {
1739
+ amountReceived: selectedProvider?.quote ?? "",
1740
+ network: networkLabel,
1741
+ fees: selectedProvider?.fee ?? ""
1742
+ }
1743
+ });
1744
+ window.open(session.widgetUrl, "_blank", "noopener,noreferrer");
1745
+ setPendingProviderName(selectedProvider?.name ?? providerId);
1746
+ setPendingProviderWalletAddress(depositAddr);
1747
+ setStep("card-payment-pending");
1748
+ } catch (err) {
1749
+ setSessionError(err instanceof Error ? err.message : "Failed to create session");
1750
+ }
1751
+ }
1752
+ };
1753
+ const handleViewActivity = () => {
1754
+ onViewActivity?.();
1755
+ if (typeof window !== "undefined") window.location.href = "/profile?tab=activity";
1756
+ };
1757
+ const handleChooseAnotherProvider = () => {
1758
+ setCardProviders([]);
1759
+ setQuotesError(null);
1760
+ setSessionError(null);
1761
+ setPendingProviderName("");
1762
+ setPendingProviderWalletAddress("");
1763
+ setStep("card-deposit");
1764
+ };
1765
+ const handleDoneCryptoTransfer = () => {
1766
+ onDoneCryptoTransfer?.();
1767
+ onDoneSendCrypto?.();
1768
+ };
1769
+ const handleDoneWalletDeposit = () => {
1770
+ handleOpenChange(false);
1771
+ onDoneWalletDeposit?.();
1772
+ };
1773
+ const handleDoneCardPurchase = () => {
1774
+ handleOpenChange(false);
1775
+ onDoneCardPurchase?.();
1776
+ };
1777
+ const handleOpenChange = (isOpen) => {
1778
+ if (!isOpen) {
1779
+ setStep("method");
1780
+ setHighlightedMethod(defaultMethod);
1781
+ setWalletChainId("");
1782
+ setWalletToken("");
1783
+ setSendChainId("");
1784
+ setSendToken("");
1785
+ walletSubmitInFlightRef.current = false;
1786
+ walletDepositAttemptIdRef.current = 0;
1787
+ notifiedWalletDepositStatusesRef.current = /* @__PURE__ */ new Set();
1788
+ setIsWalletSubmitting(false);
1789
+ setCardProviders([]);
1790
+ setQuotesLoading(false);
1791
+ setQuotesError(null);
1792
+ setSessionError(null);
1793
+ setPendingProviderName("");
1794
+ setPendingProviderWalletAddress("");
1795
+ clearPendingCardSession();
1796
+ }
1797
+ onOpenChange(isOpen);
1798
+ };
1799
+ const depositModalMaxWidth = step === "method" ? "600px" : "480px";
1800
+ return /* @__PURE__ */ jsx(Modal, {
1801
+ open,
1802
+ onOpenChange: handleOpenChange,
1803
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
1804
+ maxWidth: depositModalMaxWidth,
1805
+ "aria-label": "Deposit",
1806
+ children: [
1807
+ step === "method" ? /* @__PURE__ */ jsx(DepositMethodStep, {
1808
+ balance: walletFlow.balance,
1809
+ walletLabel: walletFlow.walletLabel,
1810
+ walletBalance: walletFlow.walletBalance,
1811
+ walletToken,
1812
+ isWalletBalanceLoading: walletFlow.isWalletBalanceLoading,
1813
+ showWalletMethod: isWeb3User,
1814
+ highlightedMethod,
1815
+ depositAddressesReady: isReady,
1816
+ onSelectMethod: handleSelectMethod
1817
+ }) : null,
1818
+ step === "wallet-form" ? /* @__PURE__ */ jsx(WalletFormStep, {
1819
+ walletLabel: walletFlow.walletLabel,
1820
+ walletBalance: walletFlow.walletBalance,
1821
+ isBalanceLoading: walletFlow.isWalletBalanceLoading,
1822
+ tokenOptions: walletTokenOptions,
1823
+ networkOptions: walletNetworkOptions,
1824
+ selectedToken: walletToken,
1825
+ selectedNetwork: walletChainId,
1826
+ amount: walletFlow.amount,
1827
+ formErrorMessage: walletFlow.formErrorMessage,
1828
+ formErrorTone: walletFlow.formErrorTone,
1829
+ estimatedReceive: walletFlow.estimatedReceive,
1830
+ feeEstimate: walletFlow.feeEstimate,
1831
+ eta: walletFlow.eta,
1832
+ isSubmitting: isWalletSubmitting,
1833
+ onBack: () => setStep("method"),
1834
+ onTokenChange: setWalletToken,
1835
+ onNetworkChange: (id) => {
1836
+ setWalletChainId(id);
1837
+ setWalletToken("");
1838
+ },
1839
+ onAmountChange: onWalletAmountChange,
1840
+ onMax: onWalletMax,
1841
+ onConfirm: async () => {
1842
+ if (walletSubmitInFlightRef.current) return;
1843
+ walletSubmitInFlightRef.current = true;
1844
+ walletDepositAttemptIdRef.current += 1;
1845
+ notifiedWalletDepositStatusesRef.current = /* @__PURE__ */ new Set();
1846
+ setIsWalletSubmitting(true);
1847
+ setStep("wallet-processing");
1848
+ const walletChainIdNum = walletChainId ? Number(walletChainId) : void 0;
1849
+ const address = getAddress(walletChainIdNum) ?? "";
1850
+ try {
1851
+ if (walletActions?.sendToken) {
1852
+ const tokenMeta = (supportedChains?.find((c) => String(c.chainId) === walletChainId))?.tokens.find((t) => t.symbol === walletToken);
1853
+ await walletActions.sendToken({
1854
+ chainId: walletChainIdNum ?? 0,
1855
+ token: {
1856
+ symbol: walletToken,
1857
+ address: tokenMeta?.address,
1858
+ decimals: tokenMeta?.decimals ?? 6
1859
+ },
1860
+ to: address,
1861
+ amount: walletFlow.amount
1862
+ });
1863
+ } else await onConfirmWalletDeposit?.({
1864
+ address,
1865
+ amount: walletFlow.amount,
1866
+ chainId: walletChainIdNum ?? 0,
1867
+ token: walletToken
1868
+ });
1869
+ } catch {
1870
+ walletSubmitInFlightRef.current = false;
1871
+ setStep("wallet-form");
1872
+ } finally {
1873
+ setIsWalletSubmitting(false);
1874
+ }
1875
+ }
1876
+ }) : null,
1877
+ step === "wallet-processing" ? /* @__PURE__ */ jsx(WalletProcessingStep, {
1878
+ steps: processingSteps,
1879
+ errorMessage: walletFlow.transactionStatus === "error" ? walletFlow.transactionErrorMessage ?? "Something went wrong with the transaction." : void 0,
1880
+ onComplete: () => setStep("wallet-success")
1881
+ }) : null,
1882
+ step === "wallet-success" ? /* @__PURE__ */ jsx(WalletSuccessStep, {
1883
+ summary: resolvedSuccessSummary,
1884
+ onDone: handleDoneWalletDeposit,
1885
+ onClose: () => handleOpenChange(false)
1886
+ }) : null,
1887
+ step === "card-deposit" && cardFlow ? /* @__PURE__ */ jsx(CardDepositStep, {
1888
+ amount: cardFlow.amount,
1889
+ currency: cardFlow.currency,
1890
+ tokenOptions: cardTokenOptions,
1891
+ networkOptions: cardNetworkOptions,
1892
+ selectedToken: cardFlow.selectedToken,
1893
+ selectedNetwork: cardFlow.selectedNetwork,
1894
+ minAmount: cardFlow.minAmount,
1895
+ onBack: () => setStep("method"),
1896
+ onAmountChange: onCardAmountChange ?? ignoreCardChange,
1897
+ onCurrencyChange: onCardCurrencyChange ?? ignoreCardChange,
1898
+ onTokenChange: onCardTokenChange ?? ignoreCardChange,
1899
+ onNetworkChange: onCardNetworkChange ?? ignoreCardChange,
1900
+ onContinue: handleContinueCardDeposit
1901
+ }) : null,
1902
+ step === "card-provider" && cardFlow ? /* @__PURE__ */ jsx(CardProviderStep, {
1903
+ amount: cardFlow.amount,
1904
+ currency: cardFlow.currency,
1905
+ token: cardFlow.selectedToken,
1906
+ providers: cardProviders,
1907
+ isLoading: quotesLoading,
1908
+ error: quotesError,
1909
+ sessionError,
1910
+ onBack: () => setStep("card-deposit"),
1911
+ onSelectProvider: handleSelectProvider,
1912
+ onRetry: handleRetryQuotes
1913
+ }) : null,
1914
+ step === "card-payment-pending" ? /* @__PURE__ */ jsx(CardPaymentPendingStep, {
1915
+ providerName: pendingProviderName,
1916
+ walletAddress: pendingProviderWalletAddress || void 0,
1917
+ onClose: () => handleOpenChange(false),
1918
+ onViewActivity: handleViewActivity,
1919
+ onChooseAnotherProvider: handleChooseAnotherProvider
1920
+ }) : null,
1921
+ step === "card-success" ? /* @__PURE__ */ jsx(CardPurchaseSuccessStep, {
1922
+ summary: pendingCardPurchaseSummary ?? cardFlow?.purchaseSummary ?? {
1923
+ amountReceived: "",
1924
+ network: "",
1925
+ fees: ""
1926
+ },
1927
+ onClose: () => handleOpenChange(false),
1928
+ onDone: handleDoneCardPurchase
1929
+ }) : null,
1930
+ step === "crypto-transfer" ? /* @__PURE__ */ jsx(CryptoTransferStep, {
1931
+ tokenOptions: sendTokenOptions,
1932
+ networkOptions,
1933
+ selectedToken: sendToken,
1934
+ selectedNetwork: sendChainId,
1935
+ depositAddress,
1936
+ minDeposit: sendCryptoConfig?.minDeposit ?? "$1",
1937
+ eta: sendCryptoConfig?.eta ?? "~30s",
1938
+ isLoadingAddress,
1939
+ addressError,
1940
+ onBack: () => setStep("method"),
1941
+ onTokenChange: setSendToken,
1942
+ onNetworkChange: (id) => {
1943
+ setSendChainId(id);
1944
+ if (id !== sendChainId) setSendToken("");
1945
+ },
1946
+ onDone: handleDoneCryptoTransfer
1947
+ }) : null
1948
+ ]
1949
+ })
1950
+ });
1951
+ }
1952
+ const ignoreCardChange = (_value) => {};
1953
+ const DepositModal = (props) => {
1954
+ if (!isControlledDepositModalProps(props)) return /* @__PURE__ */ jsx(DepositModalSelfDriven, { ...props });
1955
+ return /* @__PURE__ */ jsx(DepositModalControlled, { ...props });
1956
+ };
1957
+ DepositModal.displayName = "DepositModal";
1958
+ //#endregion
1959
+ //#region src/paper-trading/paper-onboarding-modal.tsx
1960
+ /**
1961
+ * Three-step intro shown once, on a user's first sign-in to a paper app.
1962
+ *
1963
+ * Figma node 4772:31182 lays the three states out side by side; this is one
1964
+ * modal that advances through them, not three modals.
1965
+ *
1966
+ * All copy resolves through `labels.paperTrading.onboarding` — the design's
1967
+ * strings were written against an earlier daily-allowance model and are still
1968
+ * being revised, so nothing here renders a literal.
1969
+ */
1970
+ const PaperOnboardingModal = ({ open, onDismiss, startingBalanceLabel, classNames }) => {
1971
+ const copy = useLabels().paperTrading.onboarding;
1972
+ const [stepIndex, setStepIndex] = useState(0);
1973
+ const steps = useMemo(() => [
1974
+ {
1975
+ key: "realMarkets",
1976
+ icon: "paper-onboarding-markets",
1977
+ title: copy.realMarkets.title,
1978
+ body: copy.realMarkets.body
1979
+ },
1980
+ {
1981
+ key: "zeroRisk",
1982
+ icon: "paper-onboarding-funds",
1983
+ title: copy.zeroRisk.title,
1984
+ body: copy.zeroRisk.body({ amount: startingBalanceLabel })
1985
+ },
1986
+ {
1987
+ key: "readyToTrade",
1988
+ icon: "paper-onboarding-performance",
1989
+ title: copy.readyToTrade.title,
1990
+ body: copy.readyToTrade.body
1991
+ }
1992
+ ], [copy, startingBalanceLabel]);
1993
+ const total = steps.length;
1994
+ const isFirst = stepIndex === 0;
1995
+ const isLast = stepIndex === total - 1;
1996
+ const step = steps[stepIndex];
1997
+ const handleBack = useCallback(() => {
1998
+ setStepIndex((current) => Math.max(0, current - 1));
1999
+ }, []);
2000
+ const handleNext = useCallback(() => {
2001
+ if (isLast) {
2002
+ onDismiss();
2003
+ return;
2004
+ }
2005
+ setStepIndex((current) => Math.min(total - 1, current + 1));
2006
+ }, [
2007
+ isLast,
2008
+ onDismiss,
2009
+ total
2010
+ ]);
2011
+ const handleOpenChange = useCallback((next) => {
2012
+ if (next) return;
2013
+ setStepIndex(0);
2014
+ onDismiss();
2015
+ }, [onDismiss]);
2016
+ return /* @__PURE__ */ jsx(Modal, {
2017
+ open,
2018
+ onOpenChange: handleOpenChange,
2019
+ children: /* @__PURE__ */ jsx(Modal.Container, {
2020
+ maxWidth: "480px",
2021
+ "aria-label": step.title,
2022
+ classNames: {
2023
+ overlay: classNames?.overlay,
2024
+ center: "items-center! p-6!",
2025
+ container: cn("rounded-agg-xl! md:rounded-agg-xl!", classNames?.card)
2026
+ },
2027
+ children: /* @__PURE__ */ jsxs("div", {
2028
+ className: cn("agg-paper-onboarding", "flex w-full flex-col gap-5 p-6"),
2029
+ children: [/* @__PURE__ */ jsxs("div", {
2030
+ className: "flex w-full items-start justify-center gap-5",
2031
+ children: [/* @__PURE__ */ jsx("div", {
2032
+ className: cn("flex size-11 shrink-0 items-center justify-center overflow-hidden", "rounded-agg-lg bg-agg-primary/10 text-agg-primary", classNames?.icon),
2033
+ children: /* @__PURE__ */ jsx(Icon, {
2034
+ name: step.icon,
2035
+ className: "!h-6 !w-6",
2036
+ "aria-hidden": "true"
2037
+ })
2038
+ }), /* @__PURE__ */ jsxs("div", {
2039
+ className: "flex min-w-0 flex-1 flex-col gap-2 break-words",
2040
+ children: [/* @__PURE__ */ jsxs("div", {
2041
+ className: "flex flex-col gap-1",
2042
+ children: [/* @__PURE__ */ jsx("p", {
2043
+ className: cn("text-agg-2xs leading-agg-14 font-agg-bold uppercase", "text-agg-muted-foreground", classNames?.eyebrow),
2044
+ children: copy.stepEyebrow({
2045
+ current: stepIndex + 1,
2046
+ total
2047
+ })
2048
+ }), /* @__PURE__ */ jsx("p", {
2049
+ className: cn("text-agg-base leading-agg-6 font-agg-bold text-agg-foreground", classNames?.title),
2050
+ children: step.title
2051
+ })]
2052
+ }), /* @__PURE__ */ jsx("p", {
2053
+ className: cn("text-agg-sm leading-agg-5 text-agg-foreground", classNames?.body),
2054
+ children: step.body
2055
+ })]
2056
+ })]
2057
+ }), /* @__PURE__ */ jsxs("div", {
2058
+ className: cn("flex w-full items-center justify-between", classNames?.footer),
2059
+ children: [/* @__PURE__ */ jsx("div", {
2060
+ className: cn("flex items-center gap-1", classNames?.dots),
2061
+ "aria-hidden": "true",
2062
+ children: steps.map((dotStep, index) => /* @__PURE__ */ jsx("span", { className: cn("rounded-full transition-all", index === stepIndex ? "h-1 w-4 bg-agg-primary" : "size-1 bg-agg-separator") }, dotStep.key))
2063
+ }), /* @__PURE__ */ jsxs("div", {
2064
+ className: "flex items-start gap-3",
2065
+ children: [/* @__PURE__ */ jsx(Button, {
2066
+ variant: "secondary",
2067
+ size: "small",
2068
+ onClick: isFirst ? onDismiss : handleBack,
2069
+ className: "w-20 rounded-full",
2070
+ children: isFirst ? copy.skip : copy.back
2071
+ }), /* @__PURE__ */ jsx(Button, {
2072
+ variant: "primary",
2073
+ size: "small",
2074
+ onClick: handleNext,
2075
+ className: "w-[120px] rounded-full",
2076
+ children: isLast ? copy.done : copy.next
2077
+ })]
2078
+ })]
2079
+ })]
2080
+ })
2081
+ })
2082
+ });
2083
+ };
2084
+ PaperOnboardingModal.displayName = "PaperOnboardingModal";
2085
+ //#endregion
2086
+ //#region src/paper-trading/paper-trading-onboarding.tsx
2087
+ const FALLBACK_STARTING_BALANCE = 1e4;
2088
+ /**
2089
+ * Drop-in paper-trading intro. Renders nothing in a live app, and nothing for
2090
+ * a user who has already seen it — mount it once, high in the tree, and forget
2091
+ * about it.
2092
+ *
2093
+ * Pairs `usePaperOnboarding` (when to show) with `PaperOnboardingModal` (what
2094
+ * to show). Use the modal directly if you need to drive visibility yourself.
2095
+ */
2096
+ const PaperTradingOnboarding = ({ classNames }) => {
2097
+ const { isOpen, dismiss } = usePaperOnboarding();
2098
+ const { paperStartingBalance } = useAppConfig();
2099
+ if (!isOpen) return null;
2100
+ return /* @__PURE__ */ jsx(PaperOnboardingModal, {
2101
+ open: true,
2102
+ onDismiss: dismiss,
2103
+ startingBalanceLabel: formatUsd(paperStartingBalance ?? FALLBACK_STARTING_BALANCE, { maximumFractionDigits: 0 }),
2104
+ classNames
2105
+ });
2106
+ };
2107
+ PaperTradingOnboarding.displayName = "PaperTradingOnboarding";
2108
+ //#endregion
2109
+ //#region src/profile/profile-modal.constants.ts
2110
+ const PROFILE_TAB_KEYS = {
2111
+ PROFILE_ACCOUNTS: "profile-accounts",
2112
+ TRADING_ACCESS: "trading-access"
2113
+ };
2114
+ const getProfileTabItems = () => [{
2115
+ value: PROFILE_TAB_KEYS.PROFILE_ACCOUNTS,
2116
+ label: "Profile & accounts",
2117
+ icon: "profile-about-tab"
2118
+ }, {
2119
+ value: PROFILE_TAB_KEYS.TRADING_ACCESS,
2120
+ label: "Trading access",
2121
+ icon: "shield-trust"
2122
+ }];
2123
+ //#endregion
2124
+ //#region src/profile/tabs/about-tab.tsx
2125
+ const AboutTab = ({ avatarPreview, onDeleteProfile: _onDeleteProfile, draftUsername, onDraftUsernameChange, onDraftAvatarChange, draftAvatarPreview, avatarError: _avatarError }) => {
2126
+ const labels = useLabels();
2127
+ const fileInputRef = useRef(null);
2128
+ const handleAvatarClick = useCallback(() => {
2129
+ fileInputRef.current?.click();
2130
+ }, []);
2131
+ const handleFileChange = useCallback((e) => {
2132
+ const file = e.target.files?.[0];
2133
+ if (!file) return;
2134
+ const reader = new FileReader();
2135
+ reader.onload = (event) => {
2136
+ onDraftAvatarChange(file, event.target?.result);
2137
+ };
2138
+ reader.readAsDataURL(file);
2139
+ }, [onDraftAvatarChange]);
2140
+ const resolvedPreview = draftAvatarPreview ?? avatarPreview;
2141
+ const hasAvatarPreview = Boolean(resolvedPreview);
2142
+ return /* @__PURE__ */ jsx("div", {
2143
+ className: "agg-profile-about flex flex-col gap-8",
2144
+ children: /* @__PURE__ */ jsxs("div", {
2145
+ className: "agg-profile-avatar-section flex w-full items-center gap-6",
2146
+ children: [
2147
+ /* @__PURE__ */ jsxs("button", {
2148
+ type: "button",
2149
+ onClick: handleAvatarClick,
2150
+ className: cn("agg-profile-avatar-trigger", "group relative flex items-center justify-center self-start", "h-[80px] w-[80px]", "rounded-agg-full", "bg-agg-secondary-hover", !hasAvatarPreview && "hover:bg-agg-tertiary", "transition-colors cursor-pointer", "overflow-hidden"),
2151
+ "aria-label": labels.onboarding.profileSetup.uploadProfilePictureAria,
2152
+ children: [!hasAvatarPreview ? /* @__PURE__ */ jsx("svg", {
2153
+ "aria-hidden": true,
2154
+ viewBox: "0 0 80 80",
2155
+ className: "pointer-events-none absolute inset-0 h-full w-full text-agg-separator group-hover:text-agg-muted-foreground",
2156
+ children: /* @__PURE__ */ jsx("circle", {
2157
+ cx: "40",
2158
+ cy: "40",
2159
+ r: "39.5",
2160
+ fill: "none",
2161
+ stroke: "currentColor",
2162
+ strokeWidth: "1",
2163
+ strokeDasharray: "8 8"
2164
+ })
2165
+ }) : null, resolvedPreview ? /* @__PURE__ */ jsx(RemoteImage, {
2166
+ src: resolvedPreview,
2167
+ alt: labels.onboarding.profileSetup.profilePreviewAlt,
2168
+ className: "h-full w-full object-cover"
2169
+ }) : /* @__PURE__ */ jsx(Icon, {
2170
+ name: "profile",
2171
+ className: "h-7 w-7 text-agg-muted-foreground"
2172
+ })]
2173
+ }),
2174
+ /* @__PURE__ */ jsx("input", {
2175
+ ref: fileInputRef,
2176
+ type: "file",
2177
+ accept: "image/*",
2178
+ onChange: handleFileChange,
2179
+ className: "hidden",
2180
+ "aria-hidden": "true"
2181
+ }),
2182
+ /* @__PURE__ */ jsxs("div", {
2183
+ className: "agg-form-section flex min-w-0 flex-1 flex-col gap-2",
2184
+ children: [/* @__PURE__ */ jsx("label", {
2185
+ htmlFor: "profile-username",
2186
+ className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground",
2187
+ children: "Username"
2188
+ }), /* @__PURE__ */ jsx("input", {
2189
+ id: "profile-username",
2190
+ type: "text",
2191
+ placeholder: "e.g. CryptoJohn",
2192
+ value: draftUsername,
2193
+ onChange: (e) => onDraftUsernameChange(e.target.value),
2194
+ className: cn("h-10 w-full px-3 py-2.5", "rounded-agg-sm", "border border-agg-separator", "bg-agg-secondary text-agg-foreground", "placeholder:text-agg-muted-foreground", "outline-none", "focus:border-agg-primary focus:ring-1 focus:ring-agg-primary", "transition-colors", "text-agg-sm sm:text-agg-base")
2195
+ })]
2196
+ })
2197
+ ]
2198
+ })
2199
+ });
2200
+ };
2201
+ AboutTab.displayName = "AboutTab";
2202
+ //#endregion
2203
+ //#region src/profile/tabs/accounts-wallets-tab.tsx
2204
+ const SectionTitle$1 = ({ children }) => /* @__PURE__ */ jsx("h3", {
2205
+ className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground",
2206
+ children
2207
+ });
2208
+ const AccountRow = ({ children, className }) => /* @__PURE__ */ jsx("div", {
2209
+ className: cn("flex h-12 items-center justify-between", "rounded-agg-lg border border-agg-separator bg-agg-secondary", "px-5", className),
2210
+ children
2211
+ });
2212
+ const AccountIdentity = ({ icon, label, iconClassName }) => /* @__PURE__ */ jsxs("div", {
2213
+ className: "flex min-w-0 items-center gap-3",
2214
+ children: [/* @__PURE__ */ jsx("span", {
2215
+ className: cn("flex h-5 w-5 shrink-0 items-center justify-center", iconClassName),
2216
+ children: /* @__PURE__ */ jsx(Icon, {
2217
+ name: icon,
2218
+ size: "small",
2219
+ color: "currentColor"
2220
+ })
2221
+ }), /* @__PURE__ */ jsx("span", {
2222
+ className: "truncate text-agg-base font-agg-normal leading-6 text-agg-foreground",
2223
+ children: label
2224
+ })]
2225
+ });
2226
+ const ConnectTextButton = ({ onClick }) => /* @__PURE__ */ jsx("button", {
2227
+ type: "button",
2228
+ onClick,
2229
+ className: "shrink-0 cursor-pointer text-agg-sm font-agg-bold leading-agg-5 text-agg-primary whitespace-nowrap",
2230
+ children: "Connect"
2231
+ });
2232
+ const DisconnectTextButton = ({ onClick }) => /* @__PURE__ */ jsx("button", {
2233
+ type: "button",
2234
+ onClick,
2235
+ className: "shrink-0 cursor-pointer text-agg-sm font-agg-bold leading-agg-5 text-agg-muted-foreground whitespace-nowrap",
2236
+ children: "Disconnect"
2237
+ });
2238
+ const VerifiedBadge = () => /* @__PURE__ */ jsx(Icon, {
2239
+ name: "check-badge",
2240
+ size: "small",
2241
+ color: "var(--agg-color-primary, #536dfe)"
2242
+ });
2243
+ const getWalletIconName = (wallet) => {
2244
+ const chain = wallet.chain.toLowerCase();
2245
+ if (chain === "solana" || chain === "svm") return "solana";
2246
+ return "ethereum";
2247
+ };
2248
+ const ConnectedAccountRow = ({ icon, label, connectedLabel, connected, iconClassName, onConnect, onDisconnect }) => {
2249
+ return /* @__PURE__ */ jsxs(AccountRow, {
2250
+ className: "agg-social-account-row gap-4",
2251
+ children: [/* @__PURE__ */ jsxs("div", {
2252
+ className: "flex min-w-0 items-center gap-3",
2253
+ children: [/* @__PURE__ */ jsx(AccountIdentity, {
2254
+ icon,
2255
+ label: connected ? connectedLabel ?? label : label,
2256
+ iconClassName
2257
+ }), connected ? /* @__PURE__ */ jsx(VerifiedBadge, {}) : null]
2258
+ }), connected ? /* @__PURE__ */ jsx(DisconnectTextButton, { onClick: onDisconnect }) : /* @__PURE__ */ jsx(ConnectTextButton, { onClick: onConnect })]
2259
+ });
2260
+ };
2261
+ const AccountsWalletsTab = ({ socialAccounts, email, wallets = [], onConnectTwitter, onDisconnectTwitter, onConnectGoogle, onDisconnectGoogle, onConnectApple, onDisconnectApple, onConnectEmail }) => {
2262
+ const twitter = socialAccounts?.twitter;
2263
+ const google = socialAccounts?.google;
2264
+ const apple = socialAccounts?.apple;
2265
+ const hasEmail = Boolean(email);
2266
+ return /* @__PURE__ */ jsxs("div", {
2267
+ className: "agg-accounts-wallets-tab flex flex-col gap-6",
2268
+ children: [/* @__PURE__ */ jsxs("div", {
2269
+ className: "agg-social-accounts-section flex flex-col gap-3",
2270
+ children: [/* @__PURE__ */ jsx(SectionTitle$1, { children: "Connected accounts" }), /* @__PURE__ */ jsxs("div", {
2271
+ className: "agg-social-accounts-list flex flex-col gap-4",
2272
+ children: [
2273
+ /* @__PURE__ */ jsx(ConnectedAccountRow, {
2274
+ icon: "google",
2275
+ iconClassName: "text-agg-foreground",
2276
+ label: "Google",
2277
+ connected: google?.connected,
2278
+ connectedLabel: google?.handle,
2279
+ onConnect: onConnectGoogle,
2280
+ onDisconnect: onDisconnectGoogle
2281
+ }),
2282
+ /* @__PURE__ */ jsx(ConnectedAccountRow, {
2283
+ icon: "apple",
2284
+ iconClassName: "text-agg-foreground",
2285
+ label: "Apple",
2286
+ connected: apple?.connected,
2287
+ connectedLabel: apple?.handle,
2288
+ onConnect: onConnectApple,
2289
+ onDisconnect: onDisconnectApple
2290
+ }),
2291
+ /* @__PURE__ */ jsx(ConnectedAccountRow, {
2292
+ icon: "twitter",
2293
+ iconClassName: "text-agg-foreground",
2294
+ label: "X (Twitter)",
2295
+ connected: twitter?.connected,
2296
+ connectedLabel: twitter?.handle,
2297
+ onConnect: onConnectTwitter,
2298
+ onDisconnect: onDisconnectTwitter
2299
+ }),
2300
+ /* @__PURE__ */ jsx(ConnectedAccountRow, {
2301
+ icon: "email",
2302
+ iconClassName: "text-agg-foreground",
2303
+ label: "Email address",
2304
+ connected: hasEmail,
2305
+ connectedLabel: email ?? void 0,
2306
+ onConnect: onConnectEmail
2307
+ })
2308
+ ]
2309
+ })]
2310
+ }), wallets.length > 0 ? /* @__PURE__ */ jsxs("div", {
2311
+ className: "agg-wallets-section flex flex-col gap-3",
2312
+ children: [/* @__PURE__ */ jsx(SectionTitle$1, { children: "Wallets" }), /* @__PURE__ */ jsx("div", {
2313
+ className: "flex flex-col gap-2",
2314
+ children: wallets.map((wallet) => /* @__PURE__ */ jsx(AccountRow, {
2315
+ className: "gap-4",
2316
+ children: /* @__PURE__ */ jsxs("div", {
2317
+ className: "flex min-w-0 items-center gap-3",
2318
+ children: [/* @__PURE__ */ jsx(AccountIdentity, {
2319
+ icon: getWalletIconName(wallet),
2320
+ iconClassName: "text-agg-foreground",
2321
+ label: wallet.displayAddress ?? wallet.address
2322
+ }), /* @__PURE__ */ jsx(VerifiedBadge, {})]
2323
+ })
2324
+ }, `${wallet.chain}:${wallet.address}`))
2325
+ })]
2326
+ }) : null]
2327
+ });
2328
+ };
2329
+ AccountsWalletsTab.displayName = "AccountsWalletsTab";
2330
+ //#endregion
2331
+ //#region src/profile/tabs/trading-access-tab.tsx
2332
+ const TRADING_ACCESS_VENUE_ITEMS = [
2333
+ "kalshi",
2334
+ "betdex",
2335
+ "tiprun",
2336
+ "polymarket",
2337
+ "opinion",
2338
+ "probable",
2339
+ "limitless",
2340
+ "predict",
2341
+ "myriad",
2342
+ "hyperliquid",
2343
+ "novig",
2344
+ "prophetx",
2345
+ "pred"
2346
+ ].map((id) => ({ id }));
2347
+ const SectionTitle = ({ children }) => /* @__PURE__ */ jsx("h3", {
2348
+ className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground",
2349
+ children
2350
+ });
2351
+ const AccessRow = ({ children }) => /* @__PURE__ */ jsx("div", {
2352
+ className: cn("flex h-12 items-center justify-between gap-4", "rounded-agg-lg border border-agg-separator bg-agg-secondary", "px-5"),
2353
+ children
2354
+ });
2355
+ const AvailableStatus = () => {
2356
+ const labels = useLabels();
2357
+ return /* @__PURE__ */ jsxs("div", {
2358
+ className: "flex items-center gap-2",
2359
+ children: [/* @__PURE__ */ jsx(Icon, {
2360
+ name: "check-badge",
2361
+ size: "small",
2362
+ className: "text-agg-primary"
2363
+ }), /* @__PURE__ */ jsx("span", {
2364
+ className: "text-agg-sm font-agg-normal leading-agg-5 text-agg-foreground whitespace-nowrap",
2365
+ children: labels.trading.tradingAccessAvailable
2366
+ })]
2367
+ });
2368
+ };
2369
+ const GeoblockedStatus = () => {
2370
+ const labels = useLabels();
2371
+ return /* @__PURE__ */ jsxs("div", {
2372
+ className: "flex items-center gap-2 text-agg-muted-foreground",
2373
+ children: [/* @__PURE__ */ jsx(Icon, {
2374
+ name: "warning-filled",
2375
+ size: "small",
2376
+ color: "currentColor"
2377
+ }), /* @__PURE__ */ jsx("span", {
2378
+ className: "text-agg-sm font-agg-normal leading-agg-5 whitespace-nowrap",
2379
+ children: labels.trading.venueUnavailableInRegion
2380
+ })]
2381
+ });
2382
+ };
2383
+ const TradingAccessTab = ({ venueAccounts, onConnectKalshi, onDisconnectKalshi, onConfigureBetdex }) => {
2384
+ const labels = useLabels();
2385
+ const { disabledVenues, isLoading: isAppConfigLoading } = useAppConfig();
2386
+ const { isLocationBlocked } = useGeoBlock();
2387
+ const hasBetdexAccount = venueAccounts?.some((account) => account.venue === "betdex") ?? false;
2388
+ const visibleVenues = useMemo(() => {
2389
+ const visible = getVisibleVenuesByConfig(TRADING_ACCESS_VENUE_ITEMS, disabledVenues);
2390
+ return TRADING_ACCESS_VENUE_ITEMS.filter((item) => visible.includes(item) || item.id === "betdex" && hasBetdexAccount);
2391
+ }, [disabledVenues, hasBetdexAccount]);
2392
+ return /* @__PURE__ */ jsxs("div", {
2393
+ className: "agg-trading-access-section flex flex-col gap-4",
2394
+ children: [/* @__PURE__ */ jsx(SectionTitle, { children: labels.trading.tradingAccessVenues }), /* @__PURE__ */ jsx("div", {
2395
+ className: "flex flex-col gap-3",
2396
+ children: visibleVenues.map(({ id: venue }) => {
2397
+ const venueAccount = venueAccounts?.find((account) => account.venue === venue);
2398
+ const isKalshi = venue === "kalshi";
2399
+ const isBetdex = venue === "betdex";
2400
+ const canManageBetdex = isBetdex && hasBetdexAccount && !isAppConfigLoading;
2401
+ const isConnected = venueAccount?.status === "active";
2402
+ const availabilityState = getVenueAvailabilityState({
2403
+ venueId: venue,
2404
+ disabledVenues,
2405
+ isConfigLoading: (isKalshi || isBetdex) && isAppConfigLoading,
2406
+ isLocationBlocked
2407
+ });
2408
+ const displayName = venueLogoLabels[venue] ?? venue;
2409
+ if (availabilityState === "hidden" && !canManageBetdex) return null;
2410
+ return /* @__PURE__ */ jsxs(AccessRow, { children: [/* @__PURE__ */ jsxs("div", {
2411
+ className: "flex min-w-0 items-center gap-3",
2412
+ children: [/* @__PURE__ */ jsx(VenueLogo, {
2413
+ venue,
2414
+ size: "small"
2415
+ }), /* @__PURE__ */ jsx("span", {
2416
+ className: "truncate text-agg-base font-agg-normal leading-6 text-agg-foreground",
2417
+ children: displayName
2418
+ })]
2419
+ }), isBetdex && (availabilityState === "available" || canManageBetdex) ? /* @__PURE__ */ jsx("button", {
2420
+ type: "button",
2421
+ onClick: onConfigureBetdex,
2422
+ disabled: !onConfigureBetdex,
2423
+ "aria-label": labels.trading.manageBetdexAccount,
2424
+ className: "min-h-11 shrink-0 cursor-pointer text-agg-sm font-agg-bold leading-agg-5 text-agg-primary whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-not-allowed disabled:opacity-60",
2425
+ children: labels.trading.configureBetdexAccount
2426
+ }) : availabilityState === "geoblocked" ? /* @__PURE__ */ jsx(GeoblockedStatus, {}) : isKalshi && !isConnected ? /* @__PURE__ */ jsx("button", {
2427
+ type: "button",
2428
+ onClick: onConnectKalshi,
2429
+ disabled: !onConnectKalshi,
2430
+ className: "shrink-0 cursor-pointer text-agg-sm font-agg-bold leading-agg-5 text-agg-primary whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-not-allowed disabled:opacity-60",
2431
+ children: labels.trading.tradingAccessAddKalshiAccount
2432
+ }) : isKalshi ? /* @__PURE__ */ jsxs("div", {
2433
+ className: "flex items-center gap-4",
2434
+ children: [/* @__PURE__ */ jsx(AvailableStatus, {}), onDisconnectKalshi ? /* @__PURE__ */ jsx("button", {
2435
+ type: "button",
2436
+ onClick: onDisconnectKalshi,
2437
+ className: "min-h-11 cursor-pointer text-agg-sm font-agg-bold leading-agg-5 text-agg-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
2438
+ children: labels.auth.disconnect
2439
+ }) : null]
2440
+ }) : /* @__PURE__ */ jsx(AvailableStatus, {})] }, venue);
2441
+ })
2442
+ })]
2443
+ });
2444
+ };
2445
+ TradingAccessTab.displayName = "TradingAccessTab";
2446
+ //#endregion
2447
+ //#region src/profile/index.tsx
2448
+ const ProfileModal = ({ open, onOpenChange, username, avatarPreview, onSave, onDeleteProfile, socialAccounts, wallets, email, onConnectTwitter, onDisconnectTwitter, onConnectGoogle, onDisconnectGoogle, onConnectApple, onDisconnectApple, onDisconnectWallet, onConnectEmail, onKycError, onConnectKalshi, onDisconnectExchange }) => {
2449
+ const client = useAggClient();
2450
+ const { user } = useAggAuthState();
2451
+ const toastCtx = useOptionalToast();
2452
+ const [activeTab, setActiveTab] = useState(PROFILE_TAB_KEYS.PROFILE_ACCOUNTS);
2453
+ const profileTabItems = useMemo(() => getProfileTabItems(), []);
2454
+ const resolvedInitialUsername = username ?? user?.username ?? "";
2455
+ const [draftUsername, setDraftUsername] = useState(resolvedInitialUsername);
2456
+ const [draftAvatarFile, setDraftAvatarFile] = useState();
2457
+ const [draftAvatarPreview, setDraftAvatarPreview] = useState();
2458
+ const [isSaving, setIsSaving] = useState(false);
2459
+ const [avatarTypeError, setAvatarTypeError] = useState(null);
2460
+ const [isConnectKalshiModalOpen, setIsConnectKalshiModalOpen] = useState(false);
2461
+ const [betdexAccountUserId, setBetdexAccountUserId] = useState(null);
2462
+ const isBetdexAccountModalOpen = !!user?.id && betdexAccountUserId === user.id;
2463
+ const { data: kalshiStatus, refetch: refetchKalshiStatus } = useVenueKeyStatus(Venue$1.kalshi, open);
2464
+ useEffect(() => {
2465
+ setDraftUsername(username ?? user?.username ?? "");
2466
+ }, [username, user?.username]);
2467
+ useEffect(() => {
2468
+ if (open) return;
2469
+ setIsConnectKalshiModalOpen(false);
2470
+ setBetdexAccountUserId(null);
2471
+ }, [open]);
2472
+ useEffect(() => setBetdexAccountUserId(null), [user?.id]);
2473
+ const handleOpenChange = useCallback((isOpen) => {
2474
+ if (!isOpen) {
2475
+ setActiveTab(PROFILE_TAB_KEYS.PROFILE_ACCOUNTS);
2476
+ setIsSaving(false);
2477
+ setDraftUsername(username ?? user?.username ?? "");
2478
+ setDraftAvatarFile(void 0);
2479
+ setDraftAvatarPreview(void 0);
2480
+ setAvatarTypeError(null);
2481
+ }
2482
+ onOpenChange(isOpen);
2483
+ }, [
2484
+ onOpenChange,
2485
+ username,
2486
+ user?.username,
2487
+ setActiveTab,
2488
+ setIsSaving,
2489
+ setDraftUsername,
2490
+ setDraftAvatarFile,
2491
+ setDraftAvatarPreview
2492
+ ]);
2493
+ const handleDraftAvatarChange = useCallback((file, preview) => {
2494
+ if (file && ![
2495
+ "image/jpeg",
2496
+ "image/png",
2497
+ "image/gif",
2498
+ "image/webp"
2499
+ ].includes(file.type)) {
2500
+ setAvatarTypeError("Unsupported format. Please use JPEG, PNG, GIF, or WebP.");
2501
+ return;
2502
+ }
2503
+ setAvatarTypeError(null);
2504
+ setDraftAvatarFile(file);
2505
+ setDraftAvatarPreview(preview);
2506
+ }, []);
2507
+ const originalUsername = username ?? user?.username ?? "";
2508
+ const hasChanges = draftUsername !== originalUsername || draftAvatarFile !== void 0;
2509
+ const handleSave = useCallback(async () => {
2510
+ setIsSaving(true);
2511
+ try {
2512
+ const normalizedUsername = draftUsername.trim();
2513
+ if (normalizedUsername !== originalUsername) await client.updateUser({ username: normalizedUsername || void 0 });
2514
+ let avatarCdnUrl;
2515
+ if (draftAvatarFile) {
2516
+ const { uploadUrl, cdnUrl } = await client.createAvatarUploadUrl(draftAvatarFile.type);
2517
+ const uploadResponse = await fetch(uploadUrl, {
2518
+ method: "PUT",
2519
+ headers: { "Content-Type": draftAvatarFile.type },
2520
+ body: draftAvatarFile
2521
+ });
2522
+ if (!uploadResponse.ok) throw new Error(`Avatar upload failed (${uploadResponse.status})`);
2523
+ avatarCdnUrl = cdnUrl || void 0;
2524
+ await new Promise((resolve) => setTimeout(resolve, 5e3));
2525
+ await client.updateUser({ confirmAvatar: true });
2526
+ }
2527
+ const resolvedAvatarPreview = (await client.getCurrentUser())?.avatarUrl ?? avatarCdnUrl ?? draftAvatarPreview;
2528
+ onSave({
2529
+ username: normalizedUsername || void 0,
2530
+ avatarFile: draftAvatarFile,
2531
+ avatarPreview: resolvedAvatarPreview
2532
+ });
2533
+ onOpenChange(false);
2534
+ } catch (err) {
2535
+ const apiError = err;
2536
+ const fieldErrors = (apiError.errors ?? []).map((e) => e?.message).filter((m) => typeof m === "string" && m.length > 0);
2537
+ const toastMessage = fieldErrors.length > 0 ? fieldErrors.join("\n") : apiError.message || "Failed to save profile. Please try again.";
2538
+ if (toastCtx) toastCtx.toast(toastMessage, {
2539
+ tone: "error",
2540
+ title: "Could not save profile"
2541
+ });
2542
+ else if (typeof console !== "undefined") console.error("[ProfileModal] save failed:", toastMessage);
2543
+ } finally {
2544
+ setIsSaving(false);
2545
+ }
2546
+ }, [
2547
+ client,
2548
+ draftAvatarFile,
2549
+ draftAvatarPreview,
2550
+ draftUsername,
2551
+ onOpenChange,
2552
+ onSave,
2553
+ originalUsername,
2554
+ toastCtx
2555
+ ]);
2556
+ const handleCancel = useCallback(() => {
2557
+ handleOpenChange(false);
2558
+ }, [handleOpenChange]);
2559
+ const handleVerifyKalshi = useCallback(async (credentials) => {
2560
+ if (onConnectKalshi) await onConnectKalshi(credentials);
2561
+ else await client.upsertVenueKey({
2562
+ venue: Venue$1.kalshi,
2563
+ credentials: {
2564
+ keyId: credentials.apiKeyId,
2565
+ privateKey: credentials.privateKey
2566
+ }
2567
+ });
2568
+ await refetchKalshiStatus();
2569
+ await client.getCurrentUser();
2570
+ }, [
2571
+ client,
2572
+ onConnectKalshi,
2573
+ refetchKalshiStatus
2574
+ ]);
2575
+ const handleDisconnectKalshi = useCallback(async () => {
2576
+ await client.deleteVenueKey(Venue$1.kalshi);
2577
+ await refetchKalshiStatus();
2578
+ onDisconnectExchange?.(Venue$1.kalshi);
2579
+ }, [
2580
+ client,
2581
+ onDisconnectExchange,
2582
+ refetchKalshiStatus
2583
+ ]);
2584
+ const resolvedVenueAccounts = useMemo(() => {
2585
+ const nonKalshiAccounts = user?.venueAccounts?.filter((account) => account.venue !== "kalshi");
2586
+ if (!kalshiStatus) return user?.venueAccounts;
2587
+ if (!kalshiStatus?.connected) return nonKalshiAccounts;
2588
+ return [...nonKalshiAccounts ?? [], {
2589
+ id: "kalshi-venue-key",
2590
+ venue: Venue$1.kalshi,
2591
+ status: "active",
2592
+ kycStatus: kalshiStatus.kycStatus
2593
+ }];
2594
+ }, [kalshiStatus, user?.venueAccounts]);
2595
+ const isAccountConnected = (providers) => {
2596
+ const normalizedProviders = providers.map((provider) => provider.toLowerCase());
2597
+ const fromAccounts = user?.accounts?.some((account) => normalizedProviders.includes(String(account.provider).toLowerCase())) ?? false;
2598
+ const fromLegacy = (user?.identities)?.some((identity) => normalizedProviders.includes(String(identity.provider ?? "").toLowerCase())) ?? false;
2599
+ return fromAccounts || fromLegacy;
2600
+ };
2601
+ const resolvedSocialAccounts = socialAccounts ?? {
2602
+ twitter: { connected: isAccountConnected(["twitter"]) },
2603
+ google: { connected: isAccountConnected(["google"]) },
2604
+ apple: { connected: isAccountConnected(["apple"]) }
2605
+ };
2606
+ const resolvedEmail = email ?? user?.accounts?.find((account) => String(account.provider).toLowerCase() === "email")?.providerAccountId ?? user?.identities?.find((identity) => String(identity.provider ?? "").toLowerCase() === "email")?.providerAccountId ?? null;
2607
+ const resolveRedirectUrl = () => {
2608
+ if (typeof window === "undefined") return "http://localhost";
2609
+ return `${window.location.origin}${window.location.pathname}${window.location.search}`;
2610
+ };
2611
+ const navigateTopWindow = (url) => {
2612
+ if (typeof window === "undefined") return;
2613
+ (window.top ?? window).location.assign(url);
2614
+ };
2615
+ const surfaceError = useCallback((err, title) => {
2616
+ const message = err?.message || "Something went wrong. Please try again.";
2617
+ if (toastCtx) toastCtx.toast(message, {
2618
+ tone: "error",
2619
+ title
2620
+ });
2621
+ else console.error(`[ProfileModal] ${title}:`, message);
2622
+ }, [toastCtx]);
2623
+ const handleConnectTwitter = useCallback(async () => {
2624
+ try {
2625
+ const result = await client.linkAccount({
2626
+ provider: "twitter",
2627
+ redirectUrl: resolveRedirectUrl()
2628
+ });
2629
+ onConnectTwitter?.();
2630
+ if (result.type === "redirect") navigateTopWindow(result.url);
2631
+ } catch (err) {
2632
+ surfaceError(err, "Could not connect X (Twitter)");
2633
+ }
2634
+ }, [
2635
+ client,
2636
+ onConnectTwitter,
2637
+ surfaceError
2638
+ ]);
2639
+ const handleConnectGoogle = useCallback(async () => {
2640
+ try {
2641
+ const result = await client.linkAccount({
2642
+ provider: "google",
2643
+ redirectUrl: resolveRedirectUrl()
2644
+ });
2645
+ onConnectGoogle?.();
2646
+ if (result.type === "redirect") navigateTopWindow(result.url);
2647
+ } catch (err) {
2648
+ surfaceError(err, "Could not connect Google");
2649
+ }
2650
+ }, [
2651
+ client,
2652
+ onConnectGoogle,
2653
+ surfaceError
2654
+ ]);
2655
+ const handleConnectApple = useCallback(async () => {
2656
+ try {
2657
+ const result = await client.linkAccount({
2658
+ provider: "apple",
2659
+ redirectUrl: resolveRedirectUrl()
2660
+ });
2661
+ onConnectApple?.();
2662
+ if (result.type === "redirect") navigateTopWindow(result.url);
2663
+ } catch (err) {
2664
+ surfaceError(err, "Could not connect Apple");
2665
+ }
2666
+ }, [
2667
+ client,
2668
+ onConnectApple,
2669
+ surfaceError
2670
+ ]);
2671
+ const handleDisconnectTwitter = useCallback(async () => {
2672
+ try {
2673
+ await client.disconnectAccount("twitter");
2674
+ await client.getCurrentUser();
2675
+ onDisconnectTwitter?.();
2676
+ } catch (err) {
2677
+ surfaceError(err, "Could not disconnect X (Twitter)");
2678
+ }
2679
+ }, [
2680
+ client,
2681
+ onDisconnectTwitter,
2682
+ surfaceError
2683
+ ]);
2684
+ const handleDisconnectGoogle = useCallback(async () => {
2685
+ try {
2686
+ await client.disconnectAccount("google");
2687
+ await client.getCurrentUser();
2688
+ onDisconnectGoogle?.();
2689
+ } catch (err) {
2690
+ surfaceError(err, "Could not disconnect Google");
2691
+ }
2692
+ }, [
2693
+ client,
2694
+ onDisconnectGoogle,
2695
+ surfaceError
2696
+ ]);
2697
+ const handleDisconnectApple = useCallback(async () => {
2698
+ try {
2699
+ await client.disconnectAccount("apple");
2700
+ await client.getCurrentUser();
2701
+ onDisconnectApple?.();
2702
+ } catch (err) {
2703
+ surfaceError(err, "Could not disconnect Apple");
2704
+ }
2705
+ }, [
2706
+ client,
2707
+ onDisconnectApple,
2708
+ surfaceError
2709
+ ]);
2710
+ const handleConnectEmail = useCallback(async () => {
2711
+ const typedEmail = typeof window !== "undefined" ? window.prompt("Enter your email to receive a magic link")?.trim() : void 0;
2712
+ if (!typedEmail) return;
2713
+ try {
2714
+ await client.linkAccount({
2715
+ provider: "email",
2716
+ email: typedEmail,
2717
+ redirectUrl: resolveRedirectUrl()
2718
+ });
2719
+ onConnectEmail?.();
2720
+ toastCtx?.toast(`We sent a link to ${typedEmail} to connect your email.`, {
2721
+ tone: "success",
2722
+ title: "Check your inbox"
2723
+ });
2724
+ } catch (err) {
2725
+ surfaceError(err, "Could not connect email");
2726
+ }
2727
+ }, [
2728
+ client,
2729
+ onConnectEmail,
2730
+ surfaceError,
2731
+ toastCtx
2732
+ ]);
2733
+ const handleDisconnectWallet = useCallback(async (wallet) => {
2734
+ const normalizedChain = wallet.chain.toLowerCase();
2735
+ const provider = normalizedChain === "solana" || normalizedChain === "svm" ? "solana_wallet" : "wallet";
2736
+ try {
2737
+ await client.disconnectAccount(provider);
2738
+ await client.getCurrentUser();
2739
+ onDisconnectWallet?.(wallet);
2740
+ } catch (err) {
2741
+ surfaceError(err, "Could not disconnect wallet");
2742
+ }
2743
+ }, [
2744
+ client,
2745
+ onDisconnectWallet,
2746
+ surfaceError
2747
+ ]);
2748
+ const providerActionMap = useMemo(() => ({
2749
+ twitter: {
2750
+ connect: () => {
2751
+ handleConnectTwitter();
2752
+ },
2753
+ disconnect: () => {
2754
+ handleDisconnectTwitter();
2755
+ }
2756
+ },
2757
+ google: {
2758
+ connect: () => {
2759
+ handleConnectGoogle();
2760
+ },
2761
+ disconnect: () => {
2762
+ handleDisconnectGoogle();
2763
+ }
2764
+ },
2765
+ apple: {
2766
+ connect: () => {
2767
+ handleConnectApple();
2768
+ },
2769
+ disconnect: () => {
2770
+ handleDisconnectApple();
2771
+ }
2772
+ },
2773
+ email: { connect: () => {
2774
+ handleConnectEmail();
2775
+ } }
2776
+ }), [
2777
+ handleConnectApple,
2778
+ handleConnectEmail,
2779
+ handleConnectGoogle,
2780
+ handleConnectTwitter,
2781
+ handleDisconnectApple,
2782
+ handleDisconnectGoogle,
2783
+ handleDisconnectTwitter
2784
+ ]);
2785
+ const resolvedWallets = useMemo(() => {
2786
+ if (wallets) return wallets;
2787
+ return ((user?.accounts)?.filter((account) => {
2788
+ const provider = account.provider?.toLowerCase();
2789
+ return provider === "wallet" || provider === "solana_wallet";
2790
+ }) ?? []).filter((account) => Boolean(account.providerAccountId)).map((account) => {
2791
+ const chain = account.provider?.toLowerCase() === "solana_wallet" ? "solana" : "evm";
2792
+ const address = account.providerAccountId;
2793
+ return {
2794
+ chain,
2795
+ address,
2796
+ displayAddress: shortenAddress(address, { chain }) ?? address
2797
+ };
2798
+ });
2799
+ }, [user?.accounts, wallets]);
2800
+ return /* @__PURE__ */ jsxs(Modal, {
2801
+ open: open && !isConnectKalshiModalOpen && !isBetdexAccountModalOpen,
2802
+ onOpenChange: handleOpenChange,
2803
+ children: [
2804
+ /* @__PURE__ */ jsxs(Modal.Container, {
2805
+ maxWidth: "800px",
2806
+ "aria-label": "Edit Profile",
2807
+ classNames: { container: cn("agg-profile-modal", "min-h-[37.5rem]") },
2808
+ children: [
2809
+ /* @__PURE__ */ jsx(Modal.Header, {
2810
+ title: "Edit Profile",
2811
+ classNames: { root: "agg-profile-modal-header" }
2812
+ }),
2813
+ /* @__PURE__ */ jsx("div", {
2814
+ className: "agg-profile-tabs sm:hidden w-full",
2815
+ children: /* @__PURE__ */ jsx(Tabs, {
2816
+ className: "w-full [&>div]:w-full",
2817
+ variant: "underline",
2818
+ classNames: { tabList: "w-full" },
2819
+ items: profileTabItems.map((tab) => ({
2820
+ value: tab.value,
2821
+ label: tab.label,
2822
+ icon: /* @__PURE__ */ jsx(Icon, {
2823
+ name: tab.icon,
2824
+ size: "small"
2825
+ })
2826
+ })),
2827
+ value: activeTab,
2828
+ onChange: (val) => setActiveTab(val)
2829
+ })
2830
+ }),
2831
+ /* @__PURE__ */ jsx(Modal.Body, {
2832
+ classNames: { root: cn("agg-profile-modal-body", "overflow-x-visible") },
2833
+ children: /* @__PURE__ */ jsxs("div", {
2834
+ className: "agg-profile-layout flex flex-col sm:flex-row sm:gap-10",
2835
+ children: [/* @__PURE__ */ jsx("div", {
2836
+ className: "shrink-0",
2837
+ children: /* @__PURE__ */ jsx("nav", {
2838
+ className: cn("agg-profile-sidebar", "hidden sm:sticky sm:top-0 sm:self-start sm:flex sm:flex-col", "w-[240px]", "overflow-hidden rounded-agg-lg", "border border-agg-separator", "bg-agg-secondary", "py-3"),
2839
+ role: "tablist",
2840
+ "aria-label": "Profile sections",
2841
+ children: profileTabItems.map((tab) => {
2842
+ const isActive = activeTab === tab.value;
2843
+ return /* @__PURE__ */ jsxs("button", {
2844
+ type: "button",
2845
+ role: "tab",
2846
+ "aria-selected": isActive,
2847
+ onClick: () => setActiveTab(tab.value),
2848
+ className: cn("agg-profile-tab-trigger", "relative flex items-center gap-3", "h-[49px] px-6 py-4", "text-agg-sm leading-agg-5 font-agg-sans", "transition-colors cursor-pointer", isActive ? "font-agg-normal text-agg-foreground bg-agg-secondary-hover" : "font-agg-normal text-agg-foreground"),
2849
+ children: [
2850
+ isActive ? /* @__PURE__ */ jsx("div", { className: "absolute left-0 top-0 bottom-0 w-1 bg-agg-primary" }) : null,
2851
+ /* @__PURE__ */ jsx(Icon, {
2852
+ name: tab.icon,
2853
+ size: "small",
2854
+ color: "currentColor"
2855
+ }),
2856
+ /* @__PURE__ */ jsx("span", {
2857
+ className: "shrink-0 whitespace-nowrap",
2858
+ children: tab.label
2859
+ })
2860
+ ]
2861
+ }, tab.value);
2862
+ })
2863
+ })
2864
+ }), /* @__PURE__ */ jsxs("div", {
2865
+ className: "agg-profile-content min-w-0 flex-1",
2866
+ children: [activeTab === PROFILE_TAB_KEYS.PROFILE_ACCOUNTS ? /* @__PURE__ */ jsxs("div", {
2867
+ className: "agg-profile-accounts-tab flex flex-col gap-8",
2868
+ children: [/* @__PURE__ */ jsx(AboutTab, {
2869
+ username: username ?? user?.username,
2870
+ avatarPreview: user?.avatarUrl ?? avatarPreview,
2871
+ onDeleteProfile,
2872
+ draftUsername,
2873
+ onDraftUsernameChange: setDraftUsername,
2874
+ draftAvatarFile,
2875
+ onDraftAvatarChange: handleDraftAvatarChange,
2876
+ draftAvatarPreview,
2877
+ avatarError: avatarTypeError
2878
+ }), /* @__PURE__ */ jsx(AccountsWalletsTab, {
2879
+ socialAccounts: resolvedSocialAccounts,
2880
+ wallets: resolvedWallets,
2881
+ email: resolvedEmail,
2882
+ onConnectTwitter: providerActionMap.twitter.connect,
2883
+ onDisconnectTwitter: providerActionMap.twitter.disconnect,
2884
+ onConnectGoogle: providerActionMap.google.connect,
2885
+ onDisconnectGoogle: providerActionMap.google.disconnect,
2886
+ onConnectApple: providerActionMap.apple.connect,
2887
+ onDisconnectApple: providerActionMap.apple.disconnect,
2888
+ onDisconnectWallet: (wallet) => {
2889
+ handleDisconnectWallet(wallet);
2890
+ },
2891
+ onConnectEmail: providerActionMap.email.connect
2892
+ })]
2893
+ }) : null, activeTab === PROFILE_TAB_KEYS.TRADING_ACCESS ? /* @__PURE__ */ jsx(TradingAccessTab, {
2894
+ venueAccounts: resolvedVenueAccounts,
2895
+ onConnectKalshi: () => setIsConnectKalshiModalOpen(true),
2896
+ onConfigureBetdex: user?.id ? () => setBetdexAccountUserId(user.id) : void 0,
2897
+ onDisconnectKalshi: handleDisconnectKalshi,
2898
+ onKycError
2899
+ }) : null]
2900
+ })]
2901
+ })
2902
+ }),
2903
+ /* @__PURE__ */ jsxs(Modal.Footer, {
2904
+ classNames: { root: "agg-profile-modal-footer" },
2905
+ children: [/* @__PURE__ */ jsx(Button, {
2906
+ variant: "secondary",
2907
+ size: "large",
2908
+ onClick: handleCancel,
2909
+ className: "min-w-[120px]",
2910
+ children: "Cancel"
2911
+ }), /* @__PURE__ */ jsx(Button, {
2912
+ variant: "primary",
2913
+ size: "large",
2914
+ disabled: !hasChanges,
2915
+ isLoading: isSaving,
2916
+ onClick: handleSave,
2917
+ children: "Save changes"
2918
+ })]
2919
+ })
2920
+ ]
2921
+ }),
2922
+ /* @__PURE__ */ jsx(ManageBetdexAccountModal, {
2923
+ userId: user?.id,
2924
+ open: open && isBetdexAccountModalOpen,
2925
+ onOpenChange: (isOpen) => setBetdexAccountUserId(isOpen ? user?.id ?? null : null)
2926
+ }, user?.id ?? "signed-out"),
2927
+ /* @__PURE__ */ jsx(ConnectKalshiModal, {
2928
+ open: open && isConnectKalshiModalOpen,
2929
+ onOpenChange: setIsConnectKalshiModalOpen,
2930
+ onVerify: handleVerifyKalshi
2931
+ })
2932
+ ]
2933
+ });
2934
+ };
2935
+ ProfileModal.displayName = "ProfileModal";
2936
+ //#endregion
2937
+ //#region src/geo-block-modal/index.tsx
2938
+ const GeoBlockModal = ({ open, onOpenChange, onConfirm, classNames }) => {
2939
+ const labels = useLabels();
2940
+ const handleConfirm = useCallback(() => {
2941
+ onConfirm?.();
2942
+ onOpenChange(false);
2943
+ }, [onConfirm, onOpenChange]);
2944
+ return /* @__PURE__ */ jsx(Modal, {
2945
+ open,
2946
+ onOpenChange,
2947
+ "aria-label": labels.trading.geoBlockModalAriaLabel,
2948
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
2949
+ maxWidth: "480px",
2950
+ classNames: { container: cn("!rounded-agg-2xl", classNames?.container) },
2951
+ children: [/* @__PURE__ */ jsx(Modal.Header, {
2952
+ title: "",
2953
+ hideBorder: true,
2954
+ classNames: {
2955
+ root: "min-h-0! h-12!",
2956
+ container: "p-0! sm:p-0!",
2957
+ close: "absolute top-8 right-8"
2958
+ }
2959
+ }), /* @__PURE__ */ jsx(Modal.Body, {
2960
+ classNames: { root: cn("!px-10 !pt-0 !pb-12", classNames?.body) },
2961
+ children: /* @__PURE__ */ jsxs("div", {
2962
+ className: "flex flex-col items-center gap-8",
2963
+ children: [
2964
+ /* @__PURE__ */ jsx(Icon, {
2965
+ name: "internet-security",
2966
+ className: "h-[60px] w-[60px] text-agg-muted-foreground"
2967
+ }),
2968
+ /* @__PURE__ */ jsxs("div", {
2969
+ className: "flex flex-col items-center gap-3 text-center",
2970
+ children: [/* @__PURE__ */ jsx("h2", {
2971
+ className: "text-agg-2xl font-agg-bold leading-agg-8 text-agg-foreground",
2972
+ children: labels.trading.geoBlockModalTitle
2973
+ }), /* @__PURE__ */ jsx("p", {
2974
+ className: "text-agg-base font-agg-normal leading-agg-6 text-agg-foreground",
2975
+ children: labels.trading.geoBlockModalDescription
2976
+ })]
2977
+ }),
2978
+ /* @__PURE__ */ jsx(Button, {
2979
+ variant: "secondary",
2980
+ size: "large",
2981
+ className: "h-10 min-w-[140px] px-6",
2982
+ onClick: handleConfirm,
2983
+ children: labels.trading.geoBlockModalConfirm
2984
+ })
2985
+ ]
2986
+ })
2987
+ })]
2988
+ })
2989
+ });
2990
+ };
2991
+ GeoBlockModal.displayName = "GeoBlockModal";
2992
+ //#endregion
2993
+ export { DepositModal as a, CARD_NETWORK_OPTIONS as c, ConnectAccountsStep as d, ProfileSetupStep as f, PaperOnboardingModal as i, OnboardingModal as l, PaperTradingBadge as m, ProfileModal as n, clearPendingCardSession as o, HowItWorksStep as p, PaperTradingOnboarding as r, getPendingCardSession as s, GeoBlockModal as t, ConnectOnchainModal as u };