@sponsorcoin/merit-wallet 0.0.0-stage → 0.0.1

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 (276) hide show
  1. package/README.md +9 -3
  2. package/dist/AgentSelectDropDown.d.ts +11 -0
  3. package/dist/AgentSelectDropDown.js +51 -0
  4. package/dist/AgentSelectDropDownWithAvatar.d.ts +10 -0
  5. package/dist/AgentSelectDropDownWithAvatar.js +12 -0
  6. package/dist/ChangePasswordPanel.d.ts +11 -0
  7. package/dist/ChangePasswordPanel.js +42 -0
  8. package/dist/ConnectedMessagePanel.d.ts +7 -0
  9. package/dist/ConnectedMessagePanel.js +35 -0
  10. package/dist/ConnectedNetworkPanel.d.ts +15 -0
  11. package/dist/ConnectedNetworkPanel.js +123 -0
  12. package/dist/ConnectedPasswordPanel.d.ts +13 -0
  13. package/dist/ConnectedPasswordPanel.js +30 -0
  14. package/dist/DeleteWalletDialog.d.ts +13 -0
  15. package/dist/DeleteWalletDialog.js +27 -0
  16. package/dist/MeritWallet.d.ts +298 -0
  17. package/dist/MeritWallet.js +1742 -0
  18. package/dist/MeritWalletHostView.d.ts +19 -0
  19. package/dist/MeritWalletHostView.js +16 -0
  20. package/dist/PasswordPromptDialog.d.ts +8 -0
  21. package/dist/PasswordPromptDialog.js +31 -0
  22. package/dist/RecoveryPhraseScreen.d.ts +9 -0
  23. package/dist/RecoveryPhraseScreen.js +33 -0
  24. package/dist/TestAccountsSection.d.ts +26 -0
  25. package/dist/TestAccountsSection.js +63 -0
  26. package/dist/TokenPanel.d.ts +9 -0
  27. package/dist/TokenPanel.js +110 -0
  28. package/dist/TokenSlotPanels.d.ts +19 -0
  29. package/dist/TokenSlotPanels.js +116 -0
  30. package/dist/VaultAccountsPanel.d.ts +27 -0
  31. package/dist/VaultAccountsPanel.js +125 -0
  32. package/dist/WalletOnboardingPanel.d.ts +13 -0
  33. package/dist/WalletOnboardingPanel.js +106 -0
  34. package/dist/WalletOverlayHost.d.ts +35 -0
  35. package/dist/WalletOverlayHost.js +46 -0
  36. package/dist/WalletSecuritySection.d.ts +9 -0
  37. package/dist/WalletSecuritySection.js +56 -0
  38. package/dist/account/AccountDetailScreen.d.ts +32 -0
  39. package/dist/account/AccountDetailScreen.js +68 -0
  40. package/dist/account/AccountPrivateKeyRow.d.ts +13 -0
  41. package/dist/account/AccountPrivateKeyRow.js +56 -0
  42. package/dist/account/AccountProfileEditor.d.ts +23 -0
  43. package/dist/account/AccountProfileEditor.js +43 -0
  44. package/dist/account/AddAccountFlow.d.ts +65 -0
  45. package/dist/account/AddAccountFlow.js +249 -0
  46. package/dist/account/accountDetailHostFromProfile.d.ts +21 -0
  47. package/dist/account/accountDetailHostFromProfile.js +24 -0
  48. package/dist/account/accountProfileClient.d.ts +18 -0
  49. package/dist/account/accountProfileClient.js +50 -0
  50. package/dist/account/form/AccountAvatarPanel.d.ts +42 -0
  51. package/dist/account/form/AccountAvatarPanel.js +261 -0
  52. package/dist/account/form/AccountFormPanel.d.ts +46 -0
  53. package/dist/account/form/AccountFormPanel.js +156 -0
  54. package/dist/account/form/DisconnectedControl.d.ts +6 -0
  55. package/dist/account/form/DisconnectedControl.js +7 -0
  56. package/dist/account/form/formHelpers.d.ts +37 -0
  57. package/dist/account/form/formHelpers.js +180 -0
  58. package/dist/account/form/formTypes.d.ts +12 -0
  59. package/dist/account/form/formTypes.js +1 -0
  60. package/dist/account/form/useAccountForm.d.ts +64 -0
  61. package/dist/account/form/useAccountForm.js +520 -0
  62. package/dist/account/form/useAccountFormDerivedState.d.ts +27 -0
  63. package/dist/account/form/useAccountFormDerivedState.js +59 -0
  64. package/dist/account/logoImage.d.ts +1 -0
  65. package/dist/account/logoImage.js +49 -0
  66. package/dist/account/profileForm.d.ts +22 -0
  67. package/dist/account/profileForm.js +63 -0
  68. package/dist/account/signIn.d.ts +13 -0
  69. package/dist/account/signIn.js +54 -0
  70. package/dist/approval/meritApproval.d.ts +182 -0
  71. package/dist/approval/meritApproval.js +153 -0
  72. package/dist/auth/ApprovalWaitingNotice.d.ts +4 -0
  73. package/dist/auth/ApprovalWaitingNotice.js +20 -0
  74. package/dist/auth/approvalWaiting.d.ts +42 -0
  75. package/dist/auth/approvalWaiting.js +108 -0
  76. package/dist/auth/authenticationType.d.ts +6 -0
  77. package/dist/auth/authenticationType.js +24 -0
  78. package/dist/auth/authenticator.d.ts +117 -0
  79. package/dist/auth/authenticator.js +64 -0
  80. package/dist/auth/connect.d.ts +38 -0
  81. package/dist/auth/connect.js +87 -0
  82. package/dist/auth/hardwareAuthenticator.d.ts +41 -0
  83. package/dist/auth/hardwareAuthenticator.js +90 -0
  84. package/dist/auth/hardwareShared.d.ts +42 -0
  85. package/dist/auth/hardwareShared.js +83 -0
  86. package/dist/auth/injectedAuthenticator.d.ts +22 -0
  87. package/dist/auth/injectedAuthenticator.js +128 -0
  88. package/dist/auth/ledgerTransport.d.ts +62 -0
  89. package/dist/auth/ledgerTransport.js +167 -0
  90. package/dist/auth/resolve.d.ts +29 -0
  91. package/dist/auth/resolve.js +68 -0
  92. package/dist/auth/trezorTransport.d.ts +74 -0
  93. package/dist/auth/trezorTransport.js +126 -0
  94. package/dist/auth/useApprovalMessagePanel.d.ts +2 -0
  95. package/dist/auth/useApprovalMessagePanel.js +37 -0
  96. package/dist/chain/directReads.d.ts +34 -0
  97. package/dist/chain/directReads.js +60 -0
  98. package/dist/config/ConnectedWalletConfig.d.ts +24 -0
  99. package/dist/config/ConnectedWalletConfig.js +18 -0
  100. package/dist/config/WalletSessionDialogs.d.ts +17 -0
  101. package/dist/config/WalletSessionDialogs.js +28 -0
  102. package/dist/hostContract.d.ts +93 -0
  103. package/dist/hostContract.js +1 -0
  104. package/dist/index.d.ts +129 -0
  105. package/dist/index.js +102 -0
  106. package/dist/panels/AccountDetailPanel.d.ts +14 -0
  107. package/dist/panels/AccountDetailPanel.js +82 -0
  108. package/dist/panels/AddressPanel.d.ts +9 -0
  109. package/dist/panels/AddressPanel.js +16 -0
  110. package/dist/panels/AgentSelectDropDown.d.ts +44 -0
  111. package/dist/panels/AgentSelectDropDown.js +96 -0
  112. package/dist/panels/AnonymousAvatar.d.ts +6 -0
  113. package/dist/panels/AnonymousAvatar.js +26 -0
  114. package/dist/panels/DetailPanelEmptyState.d.ts +10 -0
  115. package/dist/panels/DetailPanelEmptyState.js +19 -0
  116. package/dist/panels/GenericListPanel.d.ts +15 -0
  117. package/dist/panels/GenericListPanel.js +33 -0
  118. package/dist/panels/HexAddressInput.d.ts +11 -0
  119. package/dist/panels/HexAddressInput.js +49 -0
  120. package/dist/panels/MenuTabHeaderBar.d.ts +51 -0
  121. package/dist/panels/MenuTabHeaderBar.js +113 -0
  122. package/dist/panels/MeritInfoPanel.d.ts +11 -0
  123. package/dist/panels/MeritInfoPanel.js +17 -0
  124. package/dist/panels/MeritInfoPanelReal.d.ts +7 -0
  125. package/dist/panels/MeritInfoPanelReal.js +71 -0
  126. package/dist/panels/MessageDetailsSection.d.ts +12 -0
  127. package/dist/panels/MessageDetailsSection.js +28 -0
  128. package/dist/panels/MessageLabelValueRow.d.ts +5 -0
  129. package/dist/panels/MessageLabelValueRow.js +10 -0
  130. package/dist/panels/MessagePanel.d.ts +19 -0
  131. package/dist/panels/MessagePanel.js +57 -0
  132. package/dist/panels/MessagePanelReal.d.ts +10 -0
  133. package/dist/panels/MessagePanelReal.js +88 -0
  134. package/dist/panels/NetworkDetailPanel.d.ts +8 -0
  135. package/dist/panels/NetworkDetailPanel.js +68 -0
  136. package/dist/panels/NetworkSelectDropDown.d.ts +17 -0
  137. package/dist/panels/NetworkSelectDropDown.js +53 -0
  138. package/dist/panels/PanelTitle.d.ts +23 -0
  139. package/dist/panels/PanelTitle.js +99 -0
  140. package/dist/panels/ReadOnlyMetaDataTable.d.ts +19 -0
  141. package/dist/panels/ReadOnlyMetaDataTable.js +20 -0
  142. package/dist/panels/RewardsPendingByAccountTypePanel.d.ts +9 -0
  143. package/dist/panels/RewardsPendingByAccountTypePanel.js +39 -0
  144. package/dist/panels/SendAddressHeaderBar.d.ts +14 -0
  145. package/dist/panels/SendAddressHeaderBar.js +80 -0
  146. package/dist/panels/SendTabPanel.d.ts +36 -0
  147. package/dist/panels/SendTabPanel.js +45 -0
  148. package/dist/panels/SendTitle.d.ts +1 -0
  149. package/dist/panels/SendTitle.js +13 -0
  150. package/dist/panels/SendToAddressComponent.d.ts +5 -0
  151. package/dist/panels/SendToAddressComponent.js +13 -0
  152. package/dist/panels/TokenAddressComponent.d.ts +12 -0
  153. package/dist/panels/TokenAddressComponent.js +48 -0
  154. package/dist/panels/TokenDetailPanel.d.ts +14 -0
  155. package/dist/panels/TokenDetailPanel.js +69 -0
  156. package/dist/panels/TokenSelectDropDown.d.ts +47 -0
  157. package/dist/panels/TokenSelectDropDown.js +55 -0
  158. package/dist/panels/TradingStationPanel.d.ts +9 -0
  159. package/dist/panels/TradingStationPanel.js +73 -0
  160. package/dist/panels/WalletAccountHeader.d.ts +50 -0
  161. package/dist/panels/WalletAccountHeader.js +93 -0
  162. package/dist/panels/WalletRadioPanels.d.ts +16 -0
  163. package/dist/panels/WalletRadioPanels.js +54 -0
  164. package/dist/panels/errorPanelDisplayStore.d.ts +8 -0
  165. package/dist/panels/errorPanelDisplayStore.js +46 -0
  166. package/dist/panels/index.d.ts +46 -0
  167. package/dist/panels/index.js +32 -0
  168. package/dist/panels/meritWalletDataFetch.d.ts +43 -0
  169. package/dist/panels/meritWalletDataFetch.js +185 -0
  170. package/dist/panels/recordFields.d.ts +51 -0
  171. package/dist/panels/recordFields.js +147 -0
  172. package/dist/platform/domPlatform.d.ts +2 -0
  173. package/dist/platform/domPlatform.js +52 -0
  174. package/dist/platform/platform.d.ts +26 -0
  175. package/dist/platform/platform.js +12 -0
  176. package/dist/platform/useCopyFeedback.d.ts +5 -0
  177. package/dist/platform/useCopyFeedback.js +24 -0
  178. package/dist/provider/injectedWallet.d.ts +48 -0
  179. package/dist/provider/injectedWallet.js +62 -0
  180. package/dist/radioPanelGroups.d.ts +27 -0
  181. package/dist/radioPanelGroups.js +51 -0
  182. package/dist/receipt/transactionReceipts.d.ts +63 -0
  183. package/dist/receipt/transactionReceipts.js +134 -0
  184. package/dist/receipt/useTransactionReceipt.d.ts +2 -0
  185. package/dist/receipt/useTransactionReceipt.js +18 -0
  186. package/dist/rewards/ConnectedRewardsPanel.d.ts +52 -0
  187. package/dist/rewards/ConnectedRewardsPanel.js +81 -0
  188. package/dist/rewards/estimateRewards.d.ts +37 -0
  189. package/dist/rewards/estimateRewards.js +150 -0
  190. package/dist/security/secretClearing.d.ts +17 -0
  191. package/dist/security/secretClearing.js +62 -0
  192. package/dist/send/SendComponent.d.ts +1 -0
  193. package/dist/send/SendComponent.js +120 -0
  194. package/dist/send/sendTransfer.d.ts +61 -0
  195. package/dist/send/sendTransfer.js +73 -0
  196. package/dist/session/validateLogin.d.ts +28 -0
  197. package/dist/session/validateLogin.js +44 -0
  198. package/dist/session/walletSession.d.ts +49 -0
  199. package/dist/session/walletSession.js +83 -0
  200. package/dist/session/walletSessionReact.d.ts +9 -0
  201. package/dist/session/walletSessionReact.js +40 -0
  202. package/dist/sponsor/ConnectedSponsorStakingList.d.ts +31 -0
  203. package/dist/sponsor/ConnectedSponsorStakingList.js +150 -0
  204. package/dist/sponsor/sponsorReads.d.ts +43 -0
  205. package/dist/sponsor/sponsorReads.js +122 -0
  206. package/dist/sponsor/unstakeWalk.d.ts +37 -0
  207. package/dist/sponsor/unstakeWalk.js +148 -0
  208. package/dist/swap/ConnectedUniSelectPanel.d.ts +7 -0
  209. package/dist/swap/ConnectedUniSelectPanel.js +23 -0
  210. package/dist/swap/SwapTradeButton.d.ts +41 -0
  211. package/dist/swap/SwapTradeButton.js +49 -0
  212. package/dist/swap/activeAccountProfile.d.ts +9 -0
  213. package/dist/swap/activeAccountProfile.js +11 -0
  214. package/dist/swap/quoteClient.d.ts +28 -0
  215. package/dist/swap/quoteClient.js +50 -0
  216. package/dist/swap/swapPrice.d.ts +30 -0
  217. package/dist/swap/swapPrice.js +46 -0
  218. package/dist/swap/useSwapQuote.d.ts +20 -0
  219. package/dist/swap/useSwapQuote.js +142 -0
  220. package/dist/vault/accountTransfer.d.ts +25 -0
  221. package/dist/vault/accountTransfer.js +61 -0
  222. package/dist/vault/approvals.d.ts +39 -0
  223. package/dist/vault/approvals.js +72 -0
  224. package/dist/vault/browserStorage.d.ts +12 -0
  225. package/dist/vault/browserStorage.js +74 -0
  226. package/dist/vault/index.d.ts +9 -0
  227. package/dist/vault/index.js +14 -0
  228. package/dist/vault/localSigner.d.ts +53 -0
  229. package/dist/vault/localSigner.js +112 -0
  230. package/dist/vault/phoneVault.d.ts +52 -0
  231. package/dist/vault/phoneVault.js +146 -0
  232. package/dist/vault/providerController.d.ts +82 -0
  233. package/dist/vault/providerController.js +241 -0
  234. package/dist/vault/vaultAuthenticator.d.ts +17 -0
  235. package/dist/vault/vaultAuthenticator.js +72 -0
  236. package/dist/vault/vaultCapability.d.ts +96 -0
  237. package/dist/vault/vaultCapability.js +176 -0
  238. package/dist/vault/vaultCrypto.d.ts +35 -0
  239. package/dist/vault/vaultCrypto.js +95 -0
  240. package/dist/vault/vaultSession.d.ts +117 -0
  241. package/dist/vault/vaultSession.js +253 -0
  242. package/dist/vault/walletAccounts.d.ts +113 -0
  243. package/dist/vault/walletAccounts.js +313 -0
  244. package/dist/vault/workerVault.d.ts +47 -0
  245. package/dist/vault/workerVault.js +189 -0
  246. package/dist/wallet/AccountSigningSection.d.ts +5 -0
  247. package/dist/wallet/AccountSigningSection.js +40 -0
  248. package/dist/wallet/WalletBackupSection.d.ts +6 -0
  249. package/dist/wallet/WalletBackupSection.js +37 -0
  250. package/dist/wallet/accountSigning.d.ts +29 -0
  251. package/dist/wallet/accountSigning.js +51 -0
  252. package/dist/wallet/addTarget.d.ts +24 -0
  253. package/dist/wallet/addTarget.js +35 -0
  254. package/dist/wallet/approverAccounts.d.ts +52 -0
  255. package/dist/wallet/approverAccounts.js +131 -0
  256. package/dist/wallet/approverAccountsReact.d.ts +12 -0
  257. package/dist/wallet/approverAccountsReact.js +71 -0
  258. package/dist/wallet/wallet.d.ts +72 -0
  259. package/dist/wallet/wallet.js +178 -0
  260. package/dist/wallet/walletLock.d.ts +27 -0
  261. package/dist/wallet/walletLock.js +91 -0
  262. package/dist/wallet/walletProps.d.ts +20 -0
  263. package/dist/wallet/walletProps.js +83 -0
  264. package/dist/wallet/walletSecurity.d.ts +4 -0
  265. package/dist/wallet/walletSecurity.js +36 -0
  266. package/dist/walletConfig.d.ts +42 -0
  267. package/dist/walletConfig.js +127 -0
  268. package/dist/walletConfigPanelProps.d.ts +46 -0
  269. package/dist/walletConfigPanelProps.js +47 -0
  270. package/dist/walletData.d.ts +18 -0
  271. package/dist/walletData.js +17 -0
  272. package/dist/walletRefresh.d.ts +22 -0
  273. package/dist/walletRefresh.js +60 -0
  274. package/dist/walletSessionHost.d.ts +17 -0
  275. package/dist/walletSessionHost.js +1 -0
  276. package/package.json +39 -3
package/README.md CHANGED
@@ -1,3 +1,9 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # @sponsorcoin/merit-wallet
2
+
3
+ The Merit Wallet component, shared by the web app, the browser extension and later the phone apps.
4
+
5
+ Status (2026-10-08): created by moving `MeritWallet.tsx` out of `@sponsorcoin/spcoin-panels`, unchanged apart from its imports.
6
+ It depends on `@sponsorcoin/spcoin-panels` (peer dependency). The plan for merging the web and extension wallets into this one component
7
+ is in `docs/meritWalletNpmDesignToDo.txt` of the web app repo.
8
+
9
+ Build: `npm run build` (tsc, output in `dist/`, which is tracked like the other packages).
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { spCoinAccount } from '@sponsorcoin/spcoin-common/context';
3
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
4
+ export interface ConnectedAgentSelectDropDownProps {
5
+ panelGateId?: SP_COIN_DISPLAY | null;
6
+ label?: string;
7
+ addrPrePostSize?: number;
8
+ /** Host-specific avatar for a selected agent (the web app's opens the account panel on click). Default: the package's plain AccountAvatar. */
9
+ renderAccountAvatar?: (account: spCoinAccount) => React.ReactNode;
10
+ }
11
+ export default function ConnectedAgentSelectDropDown({ panelGateId, label, addrPrePostSize, renderAccountAvatar, }: ConnectedAgentSelectDropDownProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,51 @@
1
+ // File: node_source/meritWallet/packages/@sponsorcoin/merit-wallet/src/AgentSelectDropDown.tsx
2
+ //
3
+ // 2026-10-08 (docs/meritWalletNpmDesignToDo.txt row 5, S2b-2) -- the agent picker, wired to the exchange engine, written once for both
4
+ // hosts. It is a move, not a rewrite, of the web app's node_source/spCoinPanels/AssetSelectDropDowns/AgentSelectDropDown.tsx: the same
5
+ // data resolution (useAgentAccount), the same open/close orchestration (useOpenActiveListPanel), the same Sponsor/Recipient/Agent
6
+ // mutual-exclusion rule (validateAccount), feeding the portable, hook-free AgentSelectDropDown from @sponsorcoin/spcoin-panels. Only
7
+ // engine and package imports are used, so it runs wherever an ExchangeContext provider does: the web app's ExchangeProvider and the
8
+ // extension's LiteExchangeProvider.
9
+ //
10
+ // The one host-specific thing is the avatar. The web app's avatar opens the account panel on click (web-only hooks), so a host that wants
11
+ // that passes renderAccountAvatar; without it the package's plain AccountAvatar is used (no click behaviour).
12
+ 'use client';
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ import { useCallback } from 'react';
15
+ import { FEED_TYPE } from '@sponsorcoin/spcoin-common/context';
16
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
17
+ import { useExchangeContext, usePanelVisible, useOpenActiveListPanel, useAgentAccount, validateAccount, } from '@sponsorcoin/spcoin-exchange-engine';
18
+ import { AccountAvatar, PanelGate } from '@sponsorcoin/spcoin-panels';
19
+ import { AgentSelectDropDown as PortableAgentSelectDropDown } from './panels';
20
+ export default function ConnectedAgentSelectDropDown({ panelGateId, label = 'Select Agent', addrPrePostSize = 4, renderAccountAvatar, }) {
21
+ const { exchangeContext } = useExchangeContext();
22
+ const [agentAccount, setAgentAccount] = useAgentAccount();
23
+ const { openActiveListPanel, closeActiveListPanel } = useOpenActiveListPanel();
24
+ const agentListVisible = usePanelVisible(SP_COIN_DISPLAY.REMOTE_ACCOUNT_AGENT_LIST);
25
+ const address = String(agentAccount?.address ?? '');
26
+ // A real account with a deliberately blanked address is the "unselected" placeholder.
27
+ const isUnselected = !!agentAccount && !address;
28
+ const openAgentList = useCallback((e) => {
29
+ e.preventDefault();
30
+ e.stopPropagation();
31
+ if (agentListVisible) {
32
+ closeActiveListPanel('AgentSelectDropDown:closeAgentList');
33
+ return;
34
+ }
35
+ openActiveListPanel({
36
+ feedType: FEED_TYPE.REMOTE_AGENT_ACCOUNTS,
37
+ onCommit: (asset) => setAgentAccount(asset),
38
+ selectOnLogoClick: true,
39
+ validateSelection: (addr) => validateAccount('AGENT', addr, exchangeContext?.apiCoreSyncedMembers?.accounts ?? {}),
40
+ }, 'AgentSelectDropDown:openAgentList', SP_COIN_DISPLAY.REMOTE_ACCOUNT_AGENT_LIST);
41
+ }, [agentListVisible, openActiveListPanel, closeActiveListPanel, setAgentAccount, exchangeContext?.apiCoreSyncedMembers?.accounts]);
42
+ return (_jsx(PortableAgentSelectDropDown
43
+ // No agent (never selected, or selection cleared) falls through to the portable component's shared Anonymous avatar.
44
+ , {
45
+ // No agent (never selected, or selection cleared) falls through to the portable component's shared Anonymous avatar.
46
+ icon: agentAccount && !isUnselected
47
+ ? (renderAccountAvatar
48
+ ? renderAccountAvatar(agentAccount)
49
+ : _jsx(AccountAvatar, { account: agentAccount, mode: SP_COIN_DISPLAY.AGENT_ACCOUNT, className: "h-full w-full object-cover", roleLabel: "AGENT" }))
50
+ : undefined, address: isUnselected ? undefined : address || undefined, symbol: isUnselected ? undefined : agentAccount?.symbol, placeholderLabel: label, onSelectClick: openAgentList, listOpen: agentListVisible, addrPrePostSize: addrPrePostSize, panelGateId: panelGateId === null ? undefined : (panelGateId ?? SP_COIN_DISPLAY.AGENT_SELECT_DROP_DOWN), panelGate: panelGateId === null ? undefined : PanelGate }));
51
+ }
@@ -0,0 +1,10 @@
1
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
2
+ interface Props {
3
+ panelGateId?: SP_COIN_DISPLAY | null;
4
+ label?: string;
5
+ addrPrePostSize?: number;
6
+ /** Accepted and ignored, so existing callers do not change. */
7
+ collapseKey?: unknown;
8
+ }
9
+ export default function AgentSelectDropDownWithAvatar({ panelGateId, label, addrPrePostSize }: Props): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,12 @@
1
+ // File: src/AgentSelectDropDownWithAvatar.tsx
2
+ //
3
+ // 2026-10-10 (docs/nodeSourceMigrationPlan.txt row 16) -- the agent picker as the web app mounts it, moved from node_source/spCoinPanels/AssetSelectDropDowns/AgentSelectDropDown.tsx: this package's ConnectedAgentSelectDropDown with the shared avatar that opens
4
+ // the account panel on click (spcoin-panels' AccountAvatarWithOpen), so a host no longer has to write the adapter.
5
+ 'use client';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
8
+ import { AccountAvatarWithOpen } from '@sponsorcoin/spcoin-panels';
9
+ import ConnectedAgentSelectDropDown from './AgentSelectDropDown';
10
+ export default function AgentSelectDropDownWithAvatar({ panelGateId, label = 'Select Agent', addrPrePostSize = 4 }) {
11
+ return (_jsx(ConnectedAgentSelectDropDown, { panelGateId: panelGateId, label: label, addrPrePostSize: addrPrePostSize, renderAccountAvatar: (account) => _jsx(AccountAvatarWithOpen, { account: account, mode: SP_COIN_DISPLAY.AGENT_ACCOUNT, className: "h-full w-full object-cover", roleLabel: "AGENT" }) }));
12
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 2026-10-11 (docs/design/accountAuthDesign.txt 14.3, item V5): `note` is the host's own small print (the web's development keystore says that every account is re-encrypted); `title` and `confirmLabel`
3
+ * let a host keep its wording. The new password must also differ from the current one.
4
+ */
5
+ export default function ChangePasswordPanel({ changePassword, onDone, note, title, confirmLabel }: {
6
+ changePassword(oldPassword: string, newPassword: string): Promise<void>;
7
+ onDone(): void;
8
+ note?: string;
9
+ title?: string;
10
+ confirmLabel?: string;
11
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,42 @@
1
+ // File: node_source/meritWallet/packages/@sponsorcoin/merit-wallet/src/ChangePasswordPanel.tsx
2
+ //
3
+ // 2026-10-08 -- change the wallet password: old password, new password, confirmation. Host-independent: the host supplies the call that
4
+ // re-encrypts the vault (the extension sends merit/vault/changePassword to its worker, which checks the old password again).
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { useState } from 'react';
8
+ import { MIN_WALLET_PASSWORD_LENGTH } from './session/walletSession';
9
+ const BORDER = '#334155';
10
+ const box = { boxSizing: 'border-box', width: '100%', padding: 12, color: '#fff', display: 'flex', flexDirection: 'column', gap: 8 };
11
+ const field = { boxSizing: 'border-box', width: '100%', borderRadius: 8, border: '1px solid ' + BORDER, background: '#0E111B', padding: '8px 12px', color: '#fff', font: 'inherit', outline: 'none' };
12
+ const primary = { boxSizing: 'border-box', width: '100%', borderRadius: 8, border: 0, background: '#5981F3', padding: '8px 16px', fontWeight: 600, color: '#fff', cursor: 'pointer', font: 'inherit' };
13
+ /**
14
+ * 2026-10-11 (docs/design/accountAuthDesign.txt 14.3, item V5): `note` is the host's own small print (the web's development keystore says that every account is re-encrypted); `title` and `confirmLabel`
15
+ * let a host keep its wording. The new password must also differ from the current one.
16
+ */
17
+ export default function ChangePasswordPanel({ changePassword, onDone, note, title = 'Change password', confirmLabel = 'Change password' }) {
18
+ const [oldPw, setOldPw] = useState('');
19
+ const [newPw, setNewPw] = useState('');
20
+ const [confirm, setConfirm] = useState('');
21
+ const [error, setError] = useState('');
22
+ const [busy, setBusy] = useState(false);
23
+ const [changed, setChanged] = useState(false);
24
+ if (changed) {
25
+ return (_jsxs("div", { id: "WALLET_PASSWORD_CHANGED", style: box, children: [_jsx("p", { style: { margin: 0 }, children: "Your password was changed." }), _jsx("button", { type: "button", style: primary, onClick: onDone, children: "Done" })] }));
26
+ }
27
+ return (_jsxs("form", { id: "WALLET_CHANGE_PASSWORD", style: box, onSubmit: (e) => {
28
+ e.preventDefault();
29
+ if (newPw.length < MIN_WALLET_PASSWORD_LENGTH)
30
+ return setError('Password must be at least ' + MIN_WALLET_PASSWORD_LENGTH + ' characters.');
31
+ if (newPw !== confirm)
32
+ return setError('Passwords do not match.');
33
+ if (newPw === oldPw)
34
+ return setError('The new password must be different from the current password.');
35
+ setBusy(true);
36
+ setError('');
37
+ changePassword(oldPw, newPw)
38
+ .then(() => setChanged(true))
39
+ .catch((err) => setError(err instanceof Error ? err.message : 'The password could not be changed.'))
40
+ .finally(() => setBusy(false));
41
+ }, children: [_jsx("p", { style: { margin: 0, fontWeight: 600 }, children: title }), _jsx("input", { type: "password", autoComplete: "current-password", placeholder: "Current password", value: oldPw, onChange: (e) => setOldPw(e.target.value), style: field }), _jsx("input", { type: "password", autoComplete: "new-password", placeholder: "New password", value: newPw, onChange: (e) => setNewPw(e.target.value), style: field }), _jsx("input", { type: "password", autoComplete: "new-password", placeholder: "Confirm new password", value: confirm, onChange: (e) => setConfirm(e.target.value), style: field }), error && _jsx("p", { style: { color: '#f87171', fontSize: 12, margin: 0 }, children: error }), _jsx("button", { type: "submit", disabled: busy || !oldPw, style: { ...primary, opacity: busy || !oldPw ? 0.6 : 1 }, children: busy ? 'Changing…' : confirmLabel }), note && _jsx("p", { style: { margin: 0, fontSize: 12, color: '#9ca3af' }, children: note })] }));
42
+ }
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { MessageAccountEntry, MessageTokenEntry } from '@sponsorcoin/spcoin-common/context';
3
+ export interface ConnectedMessagePanelProps {
4
+ renderAccountRow?: (entry: MessageAccountEntry, index: number) => React.ReactNode;
5
+ renderTokenRow?: (entry: MessageTokenEntry, index: number) => React.ReactNode;
6
+ }
7
+ export default function ConnectedMessagePanel({ renderAccountRow, renderTokenRow }: ConnectedMessagePanelProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,35 @@
1
+ // File: node_source/meritWallet/packages/@sponsorcoin/merit-wallet/src/ConnectedMessagePanel.tsx
2
+ //
3
+ // 2026-10-08 (docs/meritWalletNpmDesignToDo.txt, row 8 / S2b-4b) -- the message panel (MESSAGE_PANEL), wired to the exchange engine, written
4
+ // once for both hosts. The card itself is spcoin-panels' MessagePanelReal; what the web app's components/views/MessagePanel.tsx added was
5
+ // reading the current error message from the exchange context and filling the account / token row slots. This is that wiring, moved: the
6
+ // message comes from the engine's useExchangeContext (the same field the web hook useErrorMessage reads; the hook's only extras were a
7
+ // dedupe on write and a debug trace, neither used by a reader).
8
+ //
9
+ // Rows: a host may pass its own renderers (the web app passes rows built on its click-through account pill and token logo). Without them
10
+ // the package renders plain rows: the token row is the web app's MessageTokenRow, unchanged (it only uses the package TokenLogo); the
11
+ // account row is a simple avatar + "ROLE: symbol | name" + address line, since the web pill's click behaviour is web-only.
12
+ 'use client';
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
15
+ import { useExchangeContext } from '@sponsorcoin/spcoin-exchange-engine';
16
+ import { AccountAvatar, TokenLogo } from '@sponsorcoin/spcoin-panels';
17
+ import { MessagePanelReal } from './panels';
18
+ const ROLE_TO_MODE = {
19
+ SPONSOR: SP_COIN_DISPLAY.SPONSOR_ACCOUNT,
20
+ RECIPIENT: SP_COIN_DISPLAY.RECIPIENT_ACCOUNT,
21
+ AGENT: SP_COIN_DISPLAY.AGENT_ACCOUNT,
22
+ ACCOUNT: SP_COIN_DISPLAY.ACTIVE_ACCOUNT,
23
+ };
24
+ function DefaultAccountRow({ entry }) {
25
+ const label = [entry.account.symbol, entry.account.name].filter(Boolean).join(' | ');
26
+ return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AccountAvatar, { account: entry.account, mode: ROLE_TO_MODE[entry.role], roleLabel: entry.role, className: "h-8 w-8 rounded-full object-cover" }), _jsxs("span", { className: "text-sm", children: [_jsxs("span", { className: "font-semibold", children: [entry.role, ":"] }), " ", label] })] }), _jsx("div", { className: "pl-10 text-xs opacity-80 break-all", children: String(entry.account.address ?? '') }), entry.detail && _jsx("div", { className: "pl-10 text-xs opacity-80", children: entry.detail })] }));
27
+ }
28
+ /** The web app's MessageTokenRow, unchanged. */
29
+ function DefaultTokenRow({ entry }) {
30
+ return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(TokenLogo, { tokenContract: entry.token, className: "h-8 w-8 rounded-full object-contain" }), _jsxs("span", { className: "text-sm", children: [_jsxs("span", { className: "font-semibold", children: [entry.label, ":"] }), ' ', [entry.token.symbol, entry.token.name].filter(Boolean).join(': ')] })] }), entry.detail && _jsx("div", { className: "pl-10 text-xs opacity-80", children: entry.detail })] }));
31
+ }
32
+ export default function ConnectedMessagePanel({ renderAccountRow, renderTokenRow }) {
33
+ const { errorMessage } = useExchangeContext();
34
+ return (_jsx(MessagePanelReal, { errorMessage: errorMessage, renderAccountRow: renderAccountRow ?? ((entry, i) => _jsx(DefaultAccountRow, { entry: entry }, `${entry.role}-${i}`)), renderTokenRow: renderTokenRow ?? ((entry, i) => _jsx(DefaultTokenRow, { entry: entry }, `token-${i}`)) }));
35
+ }
@@ -0,0 +1,15 @@
1
+ import type { NetworkElement } from '@sponsorcoin/spcoin-common/context';
2
+ /** A NetworkElement for a chain id straight from the registry (the default for previewing a chain other than the live one). */
3
+ export declare function networkElementFromRegistry(chainId: number): NetworkElement;
4
+ export interface LiveNetwork {
5
+ network: NetworkElement & Record<string, unknown>;
6
+ chainId: number;
7
+ }
8
+ /** Default live network: the exchange context's network, filled in from the registry the way the web app's useNetwork fills it from its helpers. */
9
+ export declare function useLiveNetworkFromContext(): LiveNetwork;
10
+ export interface ConnectedNetworkPanelProps {
11
+ onClose?: () => void;
12
+ /** Host hook for the live network (stable module-level function). Default: the exchange context filled from the registry. */
13
+ useLiveNetwork?: () => LiveNetwork;
14
+ }
15
+ export default function ConnectedNetworkPanel({ useLiveNetwork }: ConnectedNetworkPanelProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,123 @@
1
+ // File: node_source/meritWallet/packages/@sponsorcoin/merit-wallet/src/ConnectedNetworkPanel.tsx
2
+ //
3
+ // 2026-10-08 (docs/meritWalletNpmDesignToDo.txt, row 8 / S2b-4b) -- the network detail overlay (NETWORK_PANEL), wired to the exchange engine,
4
+ // written once for both hosts. It is the web app's components/views/RadioOverlayPanels/NetworkPanel/index.tsx moved: same gates, same
5
+ // preview-then-live logic, same rows. Where the inputs come from is what changed, the MetaMask way (one network registry that every screen
6
+ // reads, like its NetworkController):
7
+ // - the preview store is the engine's (previewNetworkStore, moved there unchanged);
8
+ // - a chain's name, symbol, logo, explorer and RPC come from spcoin-feeds' network registry (getNetworkConfiguration);
9
+ // - the host may override how the live network and a previewed chain are resolved, and how the extra info.json fields are loaded: the web
10
+ // app does, so what it shows stays exactly what it showed (it still resolves names and symbols through its own helpers until those are
11
+ // rebased on the registry, a separate step: the two sources differ for Base, Polygon and Sepolia).
12
+ // A host that passes nothing gets the registry defaults, which is what the extension uses.
13
+ 'use client';
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ import { useEffect, useMemo, useRef, useState } from 'react';
16
+ import { CopyBtn } from './TokenSlotPanels';
17
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
18
+ import { defaultMissingImage, previewNetworkStore, useExchangeContext, usePanelVisible, usePreviewNetworkChainId, } from '@sponsorcoin/spcoin-exchange-engine';
19
+ import { getNetworkConfiguration } from '@sponsorcoin/spcoin-feeds/networks';
20
+ import { getNetworkMetaData } from '@sponsorcoin/spcoin-panels';
21
+ import { ReadOnlyMetaDataTable } from './panels';
22
+ import { useWalletData } from './walletData';
23
+ // text-sp-sm is a Tailwind token only the web app defines (var(--sp-text-sm), 1rem); an inline style gives every host the same size.
24
+ const SP_TEXT_SM = { fontSize: 'var(--sp-text-sm, 1rem)' };
25
+ /** A NetworkElement for a chain id straight from the registry (the default for previewing a chain other than the live one). */
26
+ export function networkElementFromRegistry(chainId) {
27
+ const cfg = getNetworkConfiguration(chainId);
28
+ return {
29
+ connected: false,
30
+ appChainId: 0,
31
+ chainId,
32
+ name: cfg?.name ?? '',
33
+ symbol: cfg?.symbol ?? '',
34
+ logoURL: cfg?.logoURL ?? '',
35
+ url: cfg?.explorerUrl ?? '',
36
+ rpcUrl: cfg?.rpcUrl ?? '',
37
+ };
38
+ }
39
+ /** Default live network: the exchange context's network, filled in from the registry the way the web app's useNetwork fills it from its helpers. */
40
+ export function useLiveNetworkFromContext() {
41
+ const { exchangeContext } = useExchangeContext();
42
+ const ctxNet = (exchangeContext?.apiCoreSyncedMembers?.network ?? {});
43
+ const chainId = ctxNet.appChainId || 0;
44
+ const cfg = getNetworkConfiguration(chainId);
45
+ const network = {
46
+ ...ctxNet,
47
+ chainId,
48
+ name: ctxNet.name || cfg?.name || '',
49
+ logoURL: ctxNet.logoURL || cfg?.logoURL || '',
50
+ url: ctxNet.url || cfg?.explorerUrl || '',
51
+ rpcUrl: ctxNet.rpcUrl || '',
52
+ connected: !!ctxNet.connected,
53
+ };
54
+ return { network, chainId };
55
+ }
56
+ export default function ConnectedNetworkPanel({ useLiveNetwork = useLiveNetworkFromContext }) {
57
+ const vNetworkPanel = usePanelVisible(SP_COIN_DISPLAY.NETWORK_PANEL);
58
+ const vNetworkMetaData = usePanelVisible(SP_COIN_DISPLAY.NETWORK_META_DATA);
59
+ const vNetworkLogo = usePanelVisible(SP_COIN_DISPLAY.NETWORK_LOGO);
60
+ const { resolveNetwork, loadNetworkInfo } = useWalletData();
61
+ const { network: liveNetwork, chainId: liveChainId } = useLiveNetwork();
62
+ const previewChainId = usePreviewNetworkChainId();
63
+ const isPreviewMode = previewChainId != null;
64
+ const previewNetwork = useMemo(() => (isPreviewMode ? (resolveNetwork ?? networkElementFromRegistry)(previewChainId) : undefined), [isPreviewMode, previewChainId, resolveNetwork]);
65
+ const network = previewNetwork ?? liveNetwork;
66
+ const chainId = isPreviewMode ? previewChainId : liveChainId;
67
+ // Self-heal the fields NetworkElement doesn't carry (website/description) from the network's own info.json.
68
+ const [info, setInfo] = useState(undefined);
69
+ useEffect(() => {
70
+ if (!vNetworkPanel || !chainId) {
71
+ setInfo(undefined);
72
+ return;
73
+ }
74
+ let cancelled = false;
75
+ const load = loadNetworkInfo
76
+ ? loadNetworkInfo(chainId)
77
+ : fetch(`/assets/blockchains/${chainId}/info.json`).then((res) => (res.ok ? res.json() : undefined));
78
+ load
79
+ .then((data) => {
80
+ if (!cancelled)
81
+ setInfo(data);
82
+ })
83
+ .catch(() => {
84
+ if (!cancelled)
85
+ setInfo(undefined);
86
+ });
87
+ return () => {
88
+ cancelled = true;
89
+ };
90
+ }, [vNetworkPanel, chainId, loadNetworkInfo]);
91
+ // Clear the preview once NETWORK_PANEL closes, so a stale preview doesn't linger for the next time it's opened.
92
+ const prevVisibleRef = useRef(false);
93
+ useEffect(() => {
94
+ const wasVisible = prevVisibleRef.current;
95
+ prevVisibleRef.current = vNetworkPanel;
96
+ if (!wasVisible || vNetworkPanel)
97
+ return;
98
+ previewNetworkStore.clear();
99
+ }, [vNetworkPanel]);
100
+ if (!vNetworkPanel)
101
+ return null;
102
+ if (!chainId) {
103
+ return (_jsx("div", { id: "NETWORK_PANEL", children: _jsxs("div", { className: "p-4 text-slate-200 text-center", style: SP_TEXT_SM, children: [_jsx("p", { className: "mb-2 font-semibold", children: "No network selected." }), _jsx("p", { className: "m-0", children: "Select a network to view its details." })] }) }));
104
+ }
105
+ const resolvedNetwork = { ...network, ...info };
106
+ const logoURL = (resolvedNetwork.logoURL ?? '').toString().trim();
107
+ const name = (resolvedNetwork.name ?? '').toString().trim();
108
+ const rows = getNetworkMetaData(resolvedNetwork).map((f) => {
109
+ if (!f.value)
110
+ return { label: f.label, value: 'N/A' };
111
+ if (f.kind === 'url') {
112
+ return {
113
+ label: f.label,
114
+ value: (_jsxs("span", { className: "flex items-center justify-between w-full gap-2", children: [_jsx("a", { href: f.value, target: "_blank", rel: "noopener noreferrer", className: "underline decoration-slate-400/60 underline-offset-2 hover:decoration-slate-200 break-all", children: f.value }), _jsx(CopyBtn, { text: f.value })] })),
115
+ };
116
+ }
117
+ return { label: f.label, value: f.value };
118
+ });
119
+ return (_jsx("div", { id: "NETWORK_PANEL", children: vNetworkMetaData && (_jsx(ReadOnlyMetaDataTable, { rows: rows, logoURL: logoURL || defaultMissingImage, logoAlt: name, logoVisible: vNetworkLogo,
120
+ // Network logos are already complete, self-contained circular brand marks with real transparent padding, so no navy fill behind
121
+ // them and no card frame around them (unlike token and account logos).
122
+ logoBackgroundClassName: "", logoContainerClassName: "p-2" })) }));
123
+ }
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { type WalletSessionAdapter, type WalletSessionPhase } from './session/walletSession';
3
+ export interface ConnectedPasswordPanelProps {
4
+ /** Where the host's wallet is: no answer yet, no wallet, locked, or unlocked. */
5
+ phase: WalletSessionPhase;
6
+ /** The host's create / unlock calls. */
7
+ adapter: Pick<WalletSessionAdapter, 'create' | 'unlock'>;
8
+ /** An error the host already has (for example its password-status check failed). */
9
+ hostError?: string;
10
+ /** Artwork above the form. */
11
+ icon?: React.ReactNode;
12
+ }
13
+ export default function ConnectedPasswordPanel({ phase, adapter, hostError, icon }: ConnectedPasswordPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,30 @@
1
+ // File: node_source/meritWallet/packages/@sponsorcoin/merit-wallet/src/ConnectedPasswordPanel.tsx
2
+ //
3
+ // 2026-10-08 (docs/meritWalletNpmDesignToDo.txt, table row 21) -- the PASSWORD_PANEL overlay slot, moved from the web app's
4
+ // components/views/RadioOverlayPanels/PasswordPanel.tsx. The form is spcoin-panels' PasswordPanel; the rules (length, match, "Incorrect password.",
5
+ // busy state) are the shared unlock gate in ./session/walletSession (the same function the Merit Wallet component's own password screen uses). What a
6
+ // host supplies is the phase it knows and the two calls that create / unlock its wallet, so the web app passes walletState's and the
7
+ // extension passes the vault's.
8
+ 'use client';
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ import { useState } from 'react';
11
+ import { SP_COIN_DISPLAY } from '@sponsorcoin/spcoin-common/panels';
12
+ import { PanelGate, PasswordPanel as PortablePasswordPanel } from '@sponsorcoin/spcoin-panels';
13
+ import { passwordModeFor, submitWalletPassword } from './session/walletSession';
14
+ export default function ConnectedPasswordPanel({ phase, adapter, hostError, icon }) {
15
+ const [error, setError] = useState('');
16
+ const [submitting, setSubmitting] = useState(false);
17
+ const handleSubmit = async (password, confirmPassword) => {
18
+ setSubmitting(true);
19
+ setError('');
20
+ try {
21
+ const result = await submitWalletPassword(phase, adapter, password, confirmPassword);
22
+ if (!result.ok)
23
+ setError(result.error);
24
+ }
25
+ finally {
26
+ setSubmitting(false);
27
+ }
28
+ };
29
+ return (_jsx(PanelGate, { panel: SP_COIN_DISPLAY.PASSWORD_PANEL, lazyLoad: false, children: _jsx(PortablePasswordPanel, { mode: passwordModeFor(phase), icon: icon, errorText: hostError || error, onSubmit: (pw, confirm) => void handleSubmit(pw, confirm), submitting: submitting, clearOnSubmit: true }) }));
30
+ }
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ /**
3
+ * 2026-10-11 (docs/design/accountAuthDesign.txt 14.3, item V5): `warning` carries the host's wording for what is lost (the default says the wallet is removed from this device); `title` and `confirmLabel` keep a
4
+ * host's own words (the web's development keystore says "Remove Account"); `footnote` is optional small print under the buttons.
5
+ */
6
+ export default function DeleteWalletDialog({ confirmDelete, onClose, warning, title, confirmLabel, footnote }: {
7
+ confirmDelete(password: string): Promise<void>;
8
+ onClose(): void;
9
+ warning?: React.ReactNode;
10
+ title?: string;
11
+ confirmLabel?: string;
12
+ footnote?: string;
13
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,27 @@
1
+ // File: node_source/meritWallet/packages/@sponsorcoin/merit-wallet/src/DeleteWalletDialog.tsx
2
+ //
3
+ // 2026-10-08 -- the confirmation popup for deleting the wallet from this device: it asks for the wallet password and deletes only when the host says
4
+ // the password is right. Host-independent: the host supplies confirmDelete(password), which throws a readable message for a wrong password.
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { useState } from 'react';
8
+ /**
9
+ * 2026-10-11 (docs/design/accountAuthDesign.txt 14.3, item V5): `warning` carries the host's wording for what is lost (the default says the wallet is removed from this device); `title` and `confirmLabel` keep a
10
+ * host's own words (the web's development keystore says "Remove Account"); `footnote` is optional small print under the buttons.
11
+ */
12
+ export default function DeleteWalletDialog({ confirmDelete, onClose, warning, title = 'Delete wallet', confirmLabel = 'Delete wallet', footnote }) {
13
+ const [password, setPassword] = useState('');
14
+ const [error, setError] = useState('');
15
+ const [busy, setBusy] = useState(false);
16
+ return (_jsx("div", { id: "DELETE_WALLET_DIALOG", role: "dialog", "aria-modal": "true", style: { position: 'fixed', inset: 0, zIndex: 1000, background: 'rgba(0,0,0,0.6)', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 12 }, children: _jsxs("form", { style: { boxSizing: 'border-box', width: '100%', maxWidth: 340, background: '#0E111B', border: '1px solid #7f1d1d', borderRadius: 12, padding: 16, color: '#fff', display: 'flex', flexDirection: 'column', gap: 8 }, onSubmit: (e) => {
17
+ e.preventDefault();
18
+ setBusy(true);
19
+ setError('');
20
+ confirmDelete(password)
21
+ .catch((err) => {
22
+ setError(err instanceof Error ? err.message : 'The wallet could not be deleted.');
23
+ setPassword('');
24
+ })
25
+ .finally(() => setBusy(false));
26
+ }, children: [_jsx("p", { style: { margin: 0, fontWeight: 700 }, children: title }), _jsx("p", { style: { margin: 0, fontSize: 12, color: '#fbbf24' }, children: warning ?? 'This deletes the wallet and all its accounts from this device. You can only get them back with your Secret Recovery Phrase (imported accounts need their private keys).' }), _jsx("input", { type: "password", autoFocus: true, autoComplete: "current-password", placeholder: "Enter your password to confirm", value: password, onChange: (e) => setPassword(e.target.value), style: { boxSizing: 'border-box', width: '100%', borderRadius: 8, border: '1px solid #334155', background: '#0b0e17', padding: '8px 12px', color: '#fff', font: 'inherit', outline: 'none' } }), error && _jsx("p", { style: { margin: 0, fontSize: 12, color: '#f87171' }, children: error }), _jsx("button", { type: "submit", disabled: busy || !password, style: { borderRadius: 8, border: 0, background: '#b91c1c', color: '#fff', padding: '8px 16px', fontWeight: 600, cursor: 'pointer', font: 'inherit', opacity: busy || !password ? 0.6 : 1 }, children: busy ? 'Deleting…' : confirmLabel }), _jsx("button", { type: "button", onClick: onClose, style: { borderRadius: 8, border: '1px solid #334155', background: 'transparent', color: '#fff', padding: '8px 16px', cursor: 'pointer', font: 'inherit' }, children: "Cancel" }), footnote && _jsx("p", { style: { margin: 0, fontSize: 12, color: '#9ca3af' }, children: footnote })] }) }));
27
+ }