@seams/wallet 0.10.2 → 0.11.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 (173) hide show
  1. package/README.md +3 -3
  2. package/THIRD_PARTY_NOTICES.md +33 -1812
  3. package/dist/.build-inputs.sha256 +1 -1
  4. package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryCodeBackup.js +100 -0
  5. package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.js +127 -71
  6. package/dist/esm/core/signingEngine/uiConfirm/ui/preact/RecoveryCodeBackupSurface.js +558 -0
  7. package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.js +82 -0
  8. package/dist/esm/core/types/sdkSentEvents.js +9 -0
  9. package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonMock.js +189 -0
  10. package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonView.js +137 -0
  11. package/dist/esm/react/components/AccountMenuButton/AccountMenuDeviceDetails.js +39 -0
  12. package/dist/esm/react/components/AccountMenuButton/AccountMenuDialog.js +39 -13
  13. package/dist/esm/react/components/AccountMenuButton/AccountMenuMockScreens.js +247 -0
  14. package/dist/esm/react/components/AccountMenuButton/AccountMenuScreen.js +41 -0
  15. package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodRow.js +79 -0
  16. package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsModal.js +168 -174
  17. package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsView.js +19 -0
  18. package/dist/esm/react/components/AccountMenuButton/ExportKeysScreen.js +30 -0
  19. package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.css +148 -87
  20. package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.js +26 -5
  21. package/dist/esm/react/components/AccountMenuButton/MenuItem.js +28 -13
  22. package/dist/esm/react/components/AccountMenuButton/ProfileDropdown.css +73 -69
  23. package/dist/esm/react/components/AccountMenuButton/ProfileDropdown.js +56 -68
  24. package/dist/esm/react/components/AccountMenuButton/RecoveryCodeAcknowledgement.js +27 -0
  25. package/dist/esm/react/components/AccountMenuButton/RecoveryCodeActions.js +53 -0
  26. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.css +3 -1
  27. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js +2 -8
  28. package/dist/esm/react/components/AccountMenuButton/UserAccountButton.css +1 -1
  29. package/dist/esm/react/components/AccountMenuButton/UserAccountButton.js +6 -3
  30. package/dist/esm/react/components/AccountMenuButton/WalletRegionSection.js +4 -4
  31. package/dist/esm/react/components/AccountMenuButton/Web3AuthProfileButton.css +443 -12
  32. package/dist/esm/react/components/AccountMenuButton/hooks/useProfileState.js +1 -1
  33. package/dist/esm/react/components/AccountMenuButton/icons/LayersIcon.js +8 -0
  34. package/dist/esm/react/components/AccountMenuButton/icons/LockKeyholeIcon.js +22 -0
  35. package/dist/esm/react/components/AccountMenuButton/icons/PlusIcon.js +8 -0
  36. package/dist/esm/react/components/AccountMenuButton/icons/SunIcon.js +2 -2
  37. package/dist/esm/react/components/AccountMenuButton/icons/TouchIcon.css +0 -8
  38. package/dist/esm/react/components/AccountMenuButton/index.js +135 -115
  39. package/dist/esm/react/components/QRCodeScanner.js +64 -40
  40. package/dist/esm/react/components/QRCodeScannerCamera.js +16 -0
  41. package/dist/esm/react/components/ShowQRCode.js +2 -2
  42. package/dist/esm/react/externalEvm.js +2 -2
  43. package/dist/esm/react/index.js +2 -1
  44. package/dist/esm/react/styles/styles.css +520 -91
  45. package/dist/esm/react/transactionReview/TransactionReviewHost.js +3 -3
  46. package/dist/esm/sdk/{adapters-DYPu0nK9.js → adapters-CGvNLOfZ.js} +1 -1
  47. package/dist/{public/sdk/display-DjoWrSgE.js → esm/sdk/display-DTbGoX4e.js} +1 -1
  48. package/dist/{public/sdk/exportKeypairOperation-DYCzCbqL.js → esm/sdk/exportKeypairOperation-BHXMSA3v.js} +1 -1
  49. package/dist/{public/sdk/host-D5b19B_h.js → esm/sdk/host-Bqmmy8Ts.js} +1 -1
  50. package/dist/esm/sdk/{localOnly-KvZeKkH5.js → localOnly-CUVRoMy2.js} +1 -1
  51. package/dist/esm/sdk/{mountRecoveryCodeBackupSurface-BA2ttbTM.js → mountRecoveryCodeBackupSurface-D1G-iCPI.js} +2 -2
  52. package/dist/esm/sdk/{pendingWalletRecoveryCodeBackup-BkIrbd6Q.js → pendingWalletRecoveryCodeBackup-CMCOUuA-.js} +1 -1
  53. package/dist/esm/sdk/{recovery-entrypoint-DoXswV9I.js → recovery-entrypoint-QxTiyx-o.js} +1 -1
  54. package/dist/esm/sdk/{registration-BFHEYmgh.js → registration-Drtkzrlc.js} +1 -1
  55. package/dist/esm/sdk/registration-eyzHqLHi.js +1 -0
  56. package/dist/esm/sdk/{requireStepUpAuth-C67sluoC.js → requireStepUpAuth-FqZSU021.js} +1 -1
  57. package/dist/esm/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
  58. package/dist/esm/sdk/runtime-auth-CbveTM2_.js +1 -0
  59. package/dist/esm/sdk/{runtime-device-link-pf-a_-3u.js → runtime-device-link-CHsqrEQ9.js} +1 -1
  60. package/dist/esm/sdk/{runtime-ecdsa-tempo-Ddnuti6f.js → runtime-ecdsa-tempo-MgmnU9g-.js} +1 -1
  61. package/dist/esm/sdk/{runtime-email-otp-BAG8ZC1J.js → runtime-email-otp-Cj96n102.js} +1 -1
  62. package/dist/esm/sdk/{runtime-export-DxL99xfn.js → runtime-export-mcwZRxKk.js} +1 -1
  63. package/dist/esm/sdk/{runtime-near-BrWP4IxC.js → runtime-near-BMdTtu7D.js} +1 -1
  64. package/dist/esm/sdk/{runtime-preferences-BjVdHYL0.js → runtime-preferences-CBlhE8bX.js} +1 -1
  65. package/dist/esm/sdk/{runtime-recovery-codes-Dn-NccpU.js → runtime-recovery-codes-B1gixZsp.js} +1 -1
  66. package/dist/esm/sdk/{runtime-recovery-BNd_GX5q.js → runtime-recovery-mJp3MLeG.js} +1 -1
  67. package/dist/esm/sdk/sdkSentEvents-Dl8fOL50.js +1 -0
  68. package/dist/esm/sdk/shared-8Qe7Nxgg.js +6 -0
  69. package/dist/{public/sdk/signEvmFamily-DjD3tn8e.js → esm/sdk/signEvmFamily-M0trbeZe.js} +1 -1
  70. package/dist/esm/sdk/{signEvmFamilyWithUiConfirmForTempo-CwRFbaLM.js → signEvmFamilyWithUiConfirmForTempo-Bo25SwuV.js} +1 -1
  71. package/dist/esm/sdk/{signEvmWithUiConfirm-BHG0dwVG.js → signEvmWithUiConfirm-CFcqJRj3.js} +1 -1
  72. package/dist/{public/sdk/signNear-D0tlQXb9.js → esm/sdk/signNear-DGUQZ44s.js} +1 -1
  73. package/dist/esm/sdk/{signingFlow-Mym5j6aw.js → signingFlow-DZvV4AgG.js} +1 -1
  74. package/dist/esm/sdk/{transaction-activity-Cb2JyYKv.js → transaction-activity-xfeHKJoq.js} +1 -1
  75. package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
  76. package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
  77. package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
  78. package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
  79. package/dist/esm/sdk/wallet-ui.css +1 -1
  80. package/dist/{public/sdk/walletCustodyEcdsaContinuity-B8aO2NFb.js → esm/sdk/walletCustodyEcdsaContinuity-_IKoCUBO.js} +1 -1
  81. package/dist/{public/sdk/walletRecoveryCommit-C3EgMjo-.js → esm/sdk/walletRecoveryCommit-DDPa1rAJ.js} +1 -1
  82. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  83. package/dist/esm/wasm/router_ab_ecdsa_client/pkg/router_ab_ecdsa_client_bg.wasm +0 -0
  84. package/dist/esm/wasm/router_ab_ed25519_yao_client/pkg/router_ab_ed25519_yao_client_bg.wasm +0 -0
  85. package/dist/public/headers.manifest.json +1 -1
  86. package/dist/public/sdk/{adapters-DYPu0nK9.js → adapters-CGvNLOfZ.js} +1 -1
  87. package/dist/{esm/sdk/display-DjoWrSgE.js → public/sdk/display-DTbGoX4e.js} +1 -1
  88. package/dist/{esm/sdk/exportKeypairOperation-DYCzCbqL.js → public/sdk/exportKeypairOperation-BHXMSA3v.js} +1 -1
  89. package/dist/{esm/sdk/host-D5b19B_h.js → public/sdk/host-Bqmmy8Ts.js} +1 -1
  90. package/dist/public/sdk/{localOnly-KvZeKkH5.js → localOnly-CUVRoMy2.js} +1 -1
  91. package/dist/public/sdk/{mountRecoveryCodeBackupSurface-BA2ttbTM.js → mountRecoveryCodeBackupSurface-D1G-iCPI.js} +2 -2
  92. package/dist/public/sdk/{pendingWalletRecoveryCodeBackup-BkIrbd6Q.js → pendingWalletRecoveryCodeBackup-CMCOUuA-.js} +1 -1
  93. package/dist/public/sdk/{recovery-entrypoint-DoXswV9I.js → recovery-entrypoint-QxTiyx-o.js} +1 -1
  94. package/dist/public/sdk/{registration-BFHEYmgh.js → registration-Drtkzrlc.js} +1 -1
  95. package/dist/public/sdk/registration-eyzHqLHi.js +1 -0
  96. package/dist/public/sdk/{requireStepUpAuth-C67sluoC.js → requireStepUpAuth-FqZSU021.js} +1 -1
  97. package/dist/public/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
  98. package/dist/public/sdk/runtime-auth-CbveTM2_.js +1 -0
  99. package/dist/public/sdk/{runtime-device-link-pf-a_-3u.js → runtime-device-link-CHsqrEQ9.js} +1 -1
  100. package/dist/public/sdk/{runtime-ecdsa-tempo-Ddnuti6f.js → runtime-ecdsa-tempo-MgmnU9g-.js} +1 -1
  101. package/dist/public/sdk/{runtime-email-otp-BAG8ZC1J.js → runtime-email-otp-Cj96n102.js} +1 -1
  102. package/dist/public/sdk/{runtime-export-DxL99xfn.js → runtime-export-mcwZRxKk.js} +1 -1
  103. package/dist/public/sdk/{runtime-near-BrWP4IxC.js → runtime-near-BMdTtu7D.js} +1 -1
  104. package/dist/public/sdk/{runtime-preferences-BjVdHYL0.js → runtime-preferences-CBlhE8bX.js} +1 -1
  105. package/dist/public/sdk/{runtime-recovery-codes-Dn-NccpU.js → runtime-recovery-codes-B1gixZsp.js} +1 -1
  106. package/dist/public/sdk/{runtime-recovery-BNd_GX5q.js → runtime-recovery-mJp3MLeG.js} +1 -1
  107. package/dist/public/sdk/sdkSentEvents-Dl8fOL50.js +1 -0
  108. package/dist/public/sdk/shared-8Qe7Nxgg.js +6 -0
  109. package/dist/{esm/sdk/signEvmFamily-DjD3tn8e.js → public/sdk/signEvmFamily-M0trbeZe.js} +1 -1
  110. package/dist/public/sdk/{signEvmFamilyWithUiConfirmForTempo-CwRFbaLM.js → signEvmFamilyWithUiConfirmForTempo-Bo25SwuV.js} +1 -1
  111. package/dist/public/sdk/{signEvmWithUiConfirm-BHG0dwVG.js → signEvmWithUiConfirm-CFcqJRj3.js} +1 -1
  112. package/dist/{esm/sdk/signNear-D0tlQXb9.js → public/sdk/signNear-DGUQZ44s.js} +1 -1
  113. package/dist/public/sdk/{signingFlow-Mym5j6aw.js → signingFlow-DZvV4AgG.js} +1 -1
  114. package/dist/public/sdk/{transaction-activity-Cb2JyYKv.js → transaction-activity-xfeHKJoq.js} +1 -1
  115. package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
  116. package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
  117. package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
  118. package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
  119. package/dist/public/sdk/wallet-ui.css +1 -1
  120. package/dist/{esm/sdk/walletCustodyEcdsaContinuity-B8aO2NFb.js → public/sdk/walletCustodyEcdsaContinuity-_IKoCUBO.js} +1 -1
  121. package/dist/{esm/sdk/walletRecoveryCommit-C3EgMjo-.js → public/sdk/walletRecoveryCommit-DDPa1rAJ.js} +1 -1
  122. package/dist/public/sdk/workers/email_otp_runtime_bg.wasm +0 -0
  123. package/dist/public/sdk/workers/evm_crypto_bg.wasm +0 -0
  124. package/dist/public/sdk/workers/router_ab_ecdsa_client_bg.wasm +0 -0
  125. package/dist/public/sdk/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
  126. package/dist/public/sdk/workers/shamir3pass_runtime_bg.wasm +0 -0
  127. package/dist/public/sdk/workers/tempo_signer_bg.wasm +0 -0
  128. package/dist/public/sdk/workers/wallet_custody_ceremony_bg.wasm +0 -0
  129. package/dist/public/sdk/workers/wasm_signer_worker_bg.wasm +0 -0
  130. package/dist/public/wallet-assets.manifest.json +62 -62
  131. package/dist/public/wallet-service/index.html +4 -4
  132. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/domain.d.ts +4 -0
  133. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/session.d.ts +4 -2
  134. package/dist/types/wallet/src/core/types/sdkSentEvents.d.ts +4 -0
  135. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuButtonMock.d.ts +17 -0
  136. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuButtonView.d.ts +17 -0
  137. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuDeviceDetails.d.ts +13 -0
  138. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuDialog.d.ts +1 -1
  139. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuMockScreens.d.ts +43 -0
  140. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuScreen.d.ts +9 -0
  141. package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodRow.d.ts +14 -0
  142. package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodsModal.d.ts +1 -1
  143. package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodsView.d.ts +8 -0
  144. package/dist/types/wallet/src/react/components/AccountMenuButton/ExportKeysScreen.d.ts +7 -0
  145. package/dist/types/wallet/src/react/components/AccountMenuButton/LinkedDevicesModal.d.ts +1 -1
  146. package/dist/types/wallet/src/react/components/AccountMenuButton/ProfileDropdown.d.ts +2 -14
  147. package/dist/types/wallet/src/react/components/AccountMenuButton/RecoveryCodeAcknowledgement.d.ts +5 -0
  148. package/dist/types/wallet/src/react/components/AccountMenuButton/RecoveryCodeActions.d.ts +5 -0
  149. package/dist/types/wallet/src/react/components/AccountMenuButton/icons/LayersIcon.d.ts +2 -0
  150. package/dist/types/wallet/src/react/components/AccountMenuButton/icons/LockKeyholeIcon.d.ts +2 -0
  151. package/dist/types/wallet/src/react/components/AccountMenuButton/icons/PlusIcon.d.ts +2 -0
  152. package/dist/types/wallet/src/react/components/AccountMenuButton/index.d.ts +2 -0
  153. package/dist/types/wallet/src/react/components/AccountMenuButton/types.d.ts +1 -14
  154. package/dist/types/wallet/src/react/components/QRCodeScanner.d.ts +1 -0
  155. package/dist/types/wallet/src/react/components/QRCodeScannerCamera.d.ts +5 -0
  156. package/dist/types/wallet/src/react/index.d.ts +2 -1
  157. package/dist/workers/email_otp_runtime_bg.wasm +0 -0
  158. package/dist/workers/evm_crypto_bg.wasm +0 -0
  159. package/dist/workers/router_ab_ecdsa_client_bg.wasm +0 -0
  160. package/dist/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
  161. package/dist/workers/shamir3pass_runtime_bg.wasm +0 -0
  162. package/dist/workers/tempo_signer_bg.wasm +0 -0
  163. package/dist/workers/wallet_custody_ceremony_bg.wasm +0 -0
  164. package/dist/workers/wasm_signer_worker_bg.wasm +0 -0
  165. package/package.json +1 -1
  166. package/dist/esm/sdk/registration-Cx_f58rb.js +0 -1
  167. package/dist/esm/sdk/runtime-auth-CKUleRYA.js +0 -1
  168. package/dist/esm/sdk/sdkSentEvents-DiQ3YVlj.js +0 -1
  169. package/dist/esm/sdk/shared-CSfgTVcf.js +0 -6
  170. package/dist/public/sdk/registration-Cx_f58rb.js +0 -1
  171. package/dist/public/sdk/runtime-auth-CKUleRYA.js +0 -1
  172. package/dist/public/sdk/sdkSentEvents-DiQ3YVlj.js +0 -1
  173. package/dist/public/sdk/shared-CSfgTVcf.js +0 -6
@@ -1 +1 @@
1
- d81ed62ded3b255b97cd863f1d3164d0b6e3a092fba5f99021a38a72eb8c2988
1
+ 6d2e6b22efe3f00372c471ea3e8fa79ef5f85a847e71a1b1fffffb303b5d669f
@@ -0,0 +1,100 @@
1
+ import { createWalletIframeSurfaceMeasurementReporter } from "../../walletIframe/host/surface-measurement-reporter.js";
2
+ //#region src/SeamsWeb/operations/recovery/walletRecoveryCodeBackup.ts
3
+ const CANCELLED_MESSAGE = "Recovery-code backup was cancelled before acknowledgement";
4
+ /**
5
+ * Shows the recovery-code backup dialog and resolves with the user's
6
+ * acknowledgement. This wrapper owns the promise contract: an acknowledged
7
+ * close resolves as backed-up, an unacknowledged close defers during
8
+ * registration and cancels from the account menu, and Escape always cancels.
9
+ */
10
+ async function showRecoveryCodeExperience(experience, measurementBinding = { kind: "disabled" }, options = {}) {
11
+ if (typeof document === "undefined") throw new Error("Wallet recovery-code backup requires a browser or a backup handler");
12
+ const previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;
13
+ if (options.shouldCancel?.()) throw new Error(CANCELLED_MESSAGE);
14
+ const surfaceModule = await import("../../../core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.js");
15
+ if (options.shouldCancel?.()) throw new Error(CANCELLED_MESSAGE);
16
+ let measurementReporter = null;
17
+ let surface = null;
18
+ let settled = false;
19
+ return await new Promise((resolve, reject) => {
20
+ const cleanup = () => {
21
+ measurementReporter?.disconnect();
22
+ measurementReporter = null;
23
+ surface?.dispose();
24
+ surface = null;
25
+ previousFocus?.focus();
26
+ };
27
+ const settle = (result) => {
28
+ if (settled) return;
29
+ settled = true;
30
+ cleanup();
31
+ if (result instanceof Error) reject(result);
32
+ else resolve(result);
33
+ };
34
+ const handleClose = (detail) => {
35
+ switch (detail.kind) {
36
+ case "dismissed":
37
+ settle(new Error(CANCELLED_MESSAGE));
38
+ return;
39
+ case "recovery_codes":
40
+ if (detail.acknowledged) {
41
+ settle({ kind: "wallet_recovery_codes_backed_up_v1" });
42
+ return;
43
+ }
44
+ if (experience.kind === "direct_backup" && experience.request.continuation === "registration_may_defer") {
45
+ settle({ kind: "wallet_recovery_code_backup_deferred_v1" });
46
+ return;
47
+ }
48
+ settle(new Error(CANCELLED_MESSAGE));
49
+ return;
50
+ }
51
+ };
52
+ try {
53
+ surface = surfaceModule.mountRecoveryCodeBackupSurface({
54
+ parent: document.body,
55
+ appearance: options.appearance,
56
+ experience,
57
+ surface: measurementBinding.kind === "wallet_iframe" ? "wallet-iframe" : "standalone",
58
+ onClose: handleClose,
59
+ onCancel: () => settle(new Error(CANCELLED_MESSAGE)),
60
+ onShown: (dialog) => {
61
+ if (settled || measurementBinding.kind !== "wallet_iframe") return;
62
+ measurementReporter = createWalletIframeSurfaceMeasurementReporter({
63
+ kind: "request_scroll_surface",
64
+ requestId: measurementBinding.requestId,
65
+ element: dialog,
66
+ postMeasurement: postRecoveryMeasurement.bind(null, dialog, measurementBinding.postMeasurement)
67
+ });
68
+ }
69
+ });
70
+ } catch (error) {
71
+ settle(error instanceof Error ? error : new Error(String(error)));
72
+ }
73
+ });
74
+ }
75
+ async function showWalletRecoveryCodeBackupUi(request, measurementBinding = { kind: "disabled" }) {
76
+ return await showRecoveryCodeExperience({
77
+ kind: "direct_backup",
78
+ request
79
+ }, measurementBinding);
80
+ }
81
+ async function showWalletRecoveryCodesUi(request, measurementBinding = { kind: "disabled" }, options = {}) {
82
+ return await showRecoveryCodeExperience({
83
+ kind: "account_menu",
84
+ ...request
85
+ }, measurementBinding, options);
86
+ }
87
+ function postRecoveryMeasurement(dialog, postMeasurement, measurement) {
88
+ if (measurement.kind !== "measured_v1") throw new Error("Recovery codes require a request surface measurement");
89
+ postMeasurement({
90
+ kind: "measured_v1",
91
+ requestId: measurement.requestId,
92
+ sequence: measurement.sequence,
93
+ widthCssPx: dialog.dataset.seamsRecoveryStage === "recovery_codes" ? 688 : 480,
94
+ heightCssPx: measurement.heightCssPx
95
+ });
96
+ }
97
+ //#endregion
98
+ export { showWalletRecoveryCodeBackupUi, showWalletRecoveryCodesUi };
99
+
100
+ //# sourceMappingURL=walletRecoveryCodeBackup.js.map
@@ -1,4 +1,5 @@
1
1
  import { isLinkedDeviceTargetEmailAddressV1 } from "../../../../../core/types/linkDevice.js";
2
+ import "../../../../../shared-ts/src/wallet-recovery/recoveryCodes.js";
2
3
  import { demoEmailOtpCodeFromDelivery } from "../../../../../core/signingEngine/session/emailOtp/challengeDelivery.js";
3
4
  import { isAuthMenuActionReady, isAuthMenuGoogleActionReady, isAuthMenuLoadingStatus, isAuthMenuReady, resolveAuthMenuLoginAccount } from "../../auth-menu/domain.js";
4
5
  import { PadlockIcon } from "../../../../../core/signingEngine/uiConfirm/ui/preact/PadlockIcon.js";
@@ -19,8 +20,22 @@ function renderDemoEmailCode(delivery) {
19
20
  }
20
21
  const AUTH_MENU_TITLE_ID = "seams-auth-menu-title";
21
22
  const AUTH_MENU_ACCOUNT_LIST_ID = "seams-auth-menu-account-list";
22
- function otpCodeDigits(code) {
23
- return code.padEnd(6, " ").slice(0, 6).split("");
23
+ function otpCodeDigits(code, length = 6) {
24
+ return code.padEnd(length, " ").slice(0, length).split("");
25
+ }
26
+ function recoveryInputCharacters(code) {
27
+ return code.replace(/[\s\-\u2010-\u2015\u2212]/g, "").toUpperCase();
28
+ }
29
+ function recoveryCodeGroups(digits) {
30
+ const groups = [];
31
+ for (let index = 0; index < digits.length; index += 4) groups.push(digits.slice(index, index + 4));
32
+ return groups;
33
+ }
34
+ function renderRecoveryCodeGroup(digits, index) {
35
+ return /* @__PURE__ */ jsx("div", {
36
+ class: "seams-recovery-code-group",
37
+ children: digits.map(renderOtpCodeDigit)
38
+ }, index);
24
39
  }
25
40
  function renderOtpCodeDigit(digit) {
26
41
  return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("span", {
@@ -352,9 +367,20 @@ var AuthMenuSurface = class extends Component {
352
367
  };
353
368
  this.onRecoveryCodeInput = (event) => {
354
369
  if (!(event.currentTarget instanceof HTMLInputElement)) return;
370
+ const viewModel = this.viewModel;
371
+ if (viewModel.kind !== "recovery") return;
372
+ const input = event.currentTarget;
373
+ const length = viewModel.recoveryCodeSlotCount ?? 32;
374
+ const raw = input.value;
375
+ const caret = recoveryInputCharacters(raw.slice(0, input.selectionStart ?? raw.length)).length;
376
+ const code = recoveryInputCharacters(raw).slice(0, length);
377
+ if (input.value !== code) {
378
+ input.value = code;
379
+ input.setSelectionRange(Math.min(caret, code.length), Math.min(caret, code.length));
380
+ }
355
381
  this.emitIntent({
356
382
  kind: "recovery_code_changed",
357
- recoveryCode: event.currentTarget.value
383
+ recoveryCode: code
358
384
  });
359
385
  };
360
386
  this.onRecoverySubmit = (event) => {
@@ -554,40 +580,51 @@ var AuthMenuSurface = class extends Component {
554
580
  "aria-busy": loading ? "true" : "false",
555
581
  tabIndex: -1,
556
582
  onKeyDown: this.onKeydown,
557
- children: [/* @__PURE__ */ jsxs("div", {
558
- class: "seams-content-switcher",
559
- children: [
560
- /* @__PURE__ */ jsx("button", {
561
- class: `seams-back-button ${loading || linkDevice || otpPrompt || registrationPrompt || recovery ? "is-visible" : ""}`,
562
- type: "button",
563
- "aria-label": recovery ? "Back to unlock wallet" : "Back",
564
- "data-auth-menu-close": true,
565
- disabled: recoveryNavigationLocked(viewModel),
566
- onClick: this.onBackClick,
567
- children: backIcon()
568
- }),
569
- recovery ? /* @__PURE__ */ jsx("div", {
570
- class: "sr-only",
571
- role: "status",
572
- "aria-live": "polite",
573
- "aria-atomic": "true",
574
- children: recoveryAnnouncement(viewModel)
575
- }) : null,
576
- /* @__PURE__ */ jsx("div", {
577
- class: "seams-content-area",
578
- children: /* @__PURE__ */ jsx("div", {
579
- class: "seams-content-sizer",
580
- children: loading ? this.renderWaiting(viewModel) : /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("div", {
581
- class: "seams-signin-menu",
582
- children: /* @__PURE__ */ jsx(Fragment, { children: this.renderActiveView(viewModel) }, authViewKey(viewModel))
583
- }) })
583
+ children: [
584
+ /* @__PURE__ */ jsxs("div", {
585
+ class: "seams-menu-origin",
586
+ children: [
587
+ /* @__PURE__ */ jsx(PadlockIcon, {}),
588
+ " ",
589
+ /* @__PURE__ */ jsx("span", { children: viewModel.hostname })
590
+ ]
591
+ }),
592
+ /* @__PURE__ */ jsxs("div", {
593
+ class: "seams-content-switcher",
594
+ children: [
595
+ /* @__PURE__ */ jsx("button", {
596
+ class: `seams-back-button ${loading || linkDevice || otpPrompt || registrationPrompt || recovery ? "is-visible" : ""}`,
597
+ type: "button",
598
+ "aria-label": recovery ? "Back to unlock wallet" : "Back",
599
+ "data-auth-menu-close": true,
600
+ disabled: recoveryNavigationLocked(viewModel),
601
+ onClick: this.onBackClick,
602
+ children: backIcon()
603
+ }),
604
+ recovery ? /* @__PURE__ */ jsx("div", {
605
+ class: "sr-only",
606
+ role: "status",
607
+ "aria-live": "polite",
608
+ "aria-atomic": "true",
609
+ children: recoveryAnnouncement(viewModel)
610
+ }) : null,
611
+ /* @__PURE__ */ jsx("div", {
612
+ class: "seams-content-area",
613
+ children: /* @__PURE__ */ jsx("div", {
614
+ class: "seams-content-sizer",
615
+ children: loading ? this.renderWaiting(viewModel) : /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("div", {
616
+ class: "seams-signin-menu",
617
+ children: /* @__PURE__ */ jsx(Fragment, { children: this.renderActiveView(viewModel) }, authViewKey(viewModel))
618
+ }) })
619
+ })
584
620
  })
585
- })
586
- ]
587
- }), /* @__PURE__ */ jsx(AuthMenuFooter, {
588
- notice: menuNotice(viewModel),
589
- onRetry: this.onNoticeRetry
590
- })]
621
+ ]
622
+ }),
623
+ /* @__PURE__ */ jsx(AuthMenuFooter, {
624
+ notice: menuNotice(viewModel),
625
+ onRetry: this.onNoticeRetry
626
+ })
627
+ ]
591
628
  }) });
592
629
  }
593
630
  renderActiveView(viewModel) {
@@ -610,14 +647,6 @@ var AuthMenuSurface = class extends Component {
610
647
  return /* @__PURE__ */ jsxs("div", {
611
648
  class: "seams-menu-header",
612
649
  children: [
613
- /* @__PURE__ */ jsxs("div", {
614
- class: "seams-menu-origin",
615
- children: [
616
- /* @__PURE__ */ jsx(PadlockIcon, {}),
617
- " ",
618
- /* @__PURE__ */ jsx("span", { children: viewModel.hostname })
619
- ]
620
- }),
621
650
  eyebrow === viewModel.heading ? null : /* @__PURE__ */ jsx("div", {
622
651
  class: "seams-menu-eyebrow",
623
652
  children: eyebrow
@@ -827,6 +856,9 @@ var AuthMenuSurface = class extends Component {
827
856
  }
828
857
  renderRecovery(viewModel) {
829
858
  if (viewModel.stage === "enter_code") {
859
+ const codeLength = viewModel.recoveryCodeSlotCount ?? 32;
860
+ const code = recoveryInputCharacters(viewModel.recoveryCode).slice(0, codeLength);
861
+ const digits = otpCodeDigits(code, codeLength);
830
862
  const statusMessage = viewModel.status.kind === "recoverable" ? viewModel.status.message : "";
831
863
  const feedbackMessage = viewModel.recoveryCodeError ?? statusMessage;
832
864
  const feedbackIsError = feedbackMessage.length > 0;
@@ -849,20 +881,28 @@ var AuthMenuSurface = class extends Component {
849
881
  class: "seams-field-label",
850
882
  for: "seams-recovery-code",
851
883
  children: "Recovery code"
852
- }), /* @__PURE__ */ jsx("input", {
853
- id: "seams-recovery-code",
854
- class: "seams-recovery-input seams-recovery-code-input",
855
- "data-recovery-code": true,
856
- name: "recoveryCode",
857
- type: "text",
858
- autocomplete: "one-time-code",
859
- autocapitalize: "characters",
860
- autocorrect: "off",
861
- spellcheck: false,
862
- "aria-invalid": viewModel.recoveryCodeError ? "true" : "false",
863
- "aria-describedby": viewModel.recoveryCodeError ? "seams-recovery-code-feedback" : "",
864
- value: viewModel.recoveryCode,
865
- onInput: this.onRecoveryCodeInput
884
+ }), /* @__PURE__ */ jsxs("div", {
885
+ class: "seams-otp-code-field seams-recovery-code-field",
886
+ children: [/* @__PURE__ */ jsx("input", {
887
+ id: "seams-recovery-code",
888
+ class: "seams-otp-input",
889
+ "data-recovery-code": true,
890
+ name: "recoveryCode",
891
+ type: "text",
892
+ inputmode: codeLength === 16 ? "numeric" : "text",
893
+ autocomplete: "off",
894
+ autocapitalize: "characters",
895
+ autocorrect: "off",
896
+ spellcheck: false,
897
+ "aria-invalid": viewModel.recoveryCodeError ? "true" : "false",
898
+ "aria-describedby": viewModel.recoveryCodeError ? "seams-recovery-code-feedback" : void 0,
899
+ value: code,
900
+ onInput: this.onRecoveryCodeInput
901
+ }), /* @__PURE__ */ jsx("div", {
902
+ class: "seams-otp-slots seams-recovery-code-slots",
903
+ "aria-hidden": "true",
904
+ children: recoveryCodeGroups(digits).map(renderRecoveryCodeGroup)
905
+ })]
866
906
  })]
867
907
  }), /* @__PURE__ */ jsxs("div", {
868
908
  class: "seams-secondary-actions",
@@ -991,19 +1031,35 @@ var AuthMenuSurface = class extends Component {
991
1031
  class: "seams-waiting",
992
1032
  role: "status",
993
1033
  "aria-live": "polite",
994
- children: [/* @__PURE__ */ jsxs("div", {
995
- class: "seams-waiting-message",
996
- children: [/* @__PURE__ */ jsx("span", {
997
- class: "seams-waiting-text",
998
- children: waitingText
999
- }), viewModel.showProgress && status.detail && status.detail !== waitingText ? /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("span", {
1000
- class: "seams-waiting-sdk-events",
1001
- children: status.detail
1002
- }) }) : null]
1003
- }), /* @__PURE__ */ jsx("div", {
1004
- "aria-label": "Loading",
1005
- class: "seams-spinner"
1006
- })]
1034
+ children: [
1035
+ status.illustration === "passkey" ? /* @__PURE__ */ jsx("span", {
1036
+ class: "seams-passkey-prompt",
1037
+ role: "img",
1038
+ "aria-label": "Passkey authentication",
1039
+ children: fingerprintIcon()
1040
+ }) : null,
1041
+ /* @__PURE__ */ jsxs("div", {
1042
+ class: "seams-waiting-message",
1043
+ children: [
1044
+ /* @__PURE__ */ jsx("span", {
1045
+ class: "seams-waiting-text",
1046
+ children: waitingText
1047
+ }),
1048
+ status.illustration === "passkey" ? /* @__PURE__ */ jsx("span", {
1049
+ class: "seams-passkey-instruction",
1050
+ children: "Complete the prompt on your device."
1051
+ }) : null,
1052
+ viewModel.showProgress && status.detail && status.detail !== waitingText ? /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("span", {
1053
+ class: "seams-waiting-sdk-events",
1054
+ children: status.detail
1055
+ }) }) : null
1056
+ ]
1057
+ }),
1058
+ status.illustration !== "passkey" ? /* @__PURE__ */ jsx("div", {
1059
+ "aria-label": "Loading",
1060
+ class: "seams-spinner"
1061
+ }) : null
1062
+ ]
1007
1063
  }) });
1008
1064
  }
1009
1065
  renderLinkDevice(viewModel) {