@seams/wallet 0.29.0 → 0.30.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 (251) hide show
  1. package/README.md +6 -6
  2. package/dist/.build-inputs.sha256 +1 -1
  3. package/dist/esm/SeamsWeb/SeamsWeb.js +2 -0
  4. package/dist/esm/SeamsWeb/walletIframe/client/inboundMessages.js +9 -0
  5. package/dist/esm/SeamsWeb/walletIframe/client/router.js +30 -0
  6. package/dist/esm/SeamsWeb/walletIframe/coordinator.js +18 -0
  7. package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.js +88 -47
  8. package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/WalletAlternativesSection.js +67 -0
  9. package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/mountAuthMenuSurface.js +13 -0
  10. package/dist/esm/SeamsWeb/walletIframe/host/walletMutationGuard.js +1 -0
  11. package/dist/esm/SeamsWeb/walletIframe/shared/messages.js +20 -6
  12. package/dist/esm/SeamsWeb/walletIframe/shared/walletAlternatives.js +109 -0
  13. package/dist/esm/core/config/configBuilder.js +1 -1
  14. package/dist/esm/core/config/defaultConfigs.js +9 -2
  15. package/dist/esm/core/ui/messages.js +3 -1
  16. package/dist/esm/core/ui/walletIcon.js +10 -0
  17. package/dist/esm/externalEvm/boundary.js +4 -2
  18. package/dist/esm/react/components/HostedSeamsAuthMenu/shell.js +26 -6
  19. package/dist/esm/react/components/HostedSeamsAuthMenu/walletAlternatives.js +178 -0
  20. package/dist/esm/react/index.js +1 -2
  21. package/dist/esm/react/styles/styles.css +0 -183
  22. package/dist/esm/react/styles.css +0 -1
  23. package/dist/esm/sdk/{ConfirmationDrawer-BRnd5SEf.js → ConfirmationDrawer-fyl4IDRl.js} +1 -1
  24. package/dist/{public/sdk/NonceCoordinator-CNXYrOoy.js → esm/sdk/NonceCoordinator-C1lw03Ce.js} +1 -1
  25. package/dist/esm/sdk/{activeWalletSession-BJ4B-nJo.js → activeWalletSession-HAOgRKzn.js} +1 -1
  26. package/dist/esm/sdk/{adapters-B2k8y0MB.js → adapters-BY1wGpm5.js} +1 -1
  27. package/dist/esm/sdk/appearance-token-vars-CzlRDVQ7.js +1 -0
  28. package/dist/esm/sdk/{authorization-gVWwKwav.js → authorization-D_NueqAv.js} +1 -1
  29. package/dist/esm/sdk/{clientSessionPersistenceState-BxpITYM_.js → clientSessionPersistenceState-B3gU3515.js} +1 -1
  30. package/dist/esm/sdk/{commitQueue-C1wkey4q.js → commitQueue-CbyuhEW9.js} +1 -1
  31. package/dist/{public/sdk/confirm-ui-Dx6c4-Rk.js → esm/sdk/confirm-ui-DWFcGTsT.js} +1 -1
  32. package/dist/{public/sdk/device-linking-_o3_fgiG.js → esm/sdk/device-linking-BL2aDEUF.js} +1 -1
  33. package/dist/esm/sdk/{deviceLinkApproval-CObsEWBa.js → deviceLinkApproval-C4T8XAmi.js} +1 -1
  34. package/dist/esm/sdk/{digestEncoding-34kXJoJr.js → digestEncoding-Rx8Vjy4J.js} +1 -1
  35. package/dist/esm/sdk/{display-CUWg48tD.js → display-8NGPOhQT.js} +1 -1
  36. package/dist/{public/sdk/ecdsaCapabilityManifest--1Ztngfx.js → esm/sdk/ecdsaCapabilityManifest-BbPXL-qh.js} +1 -1
  37. package/dist/{public/sdk/ecdsaDerivationClientWasm-DJh2uN-q.js → esm/sdk/ecdsaDerivationClientWasm-GCt9yVsd.js} +1 -1
  38. package/dist/{public/sdk/ecdsaDerivationExport-BUUUGc6o.js → esm/sdk/ecdsaDerivationExport-jm2VBMz_.js} +1 -1
  39. package/dist/esm/sdk/{emailOtpEcdsaDerivationIdentity-Qd4pBwHv.js → emailOtpEcdsaDerivationIdentity-DJmMyqL-.js} +1 -1
  40. package/dist/esm/sdk/{export-viewer-host-O0OV1Oou.js → export-viewer-host-TzgdJQuZ.js} +1 -1
  41. package/dist/{public/sdk/exportKeypairOperation-DkqY9Bpf.js → esm/sdk/exportKeypairOperation-B9_ulzNz.js} +1 -1
  42. package/dist/esm/sdk/host-Csu5L7VF.js +1 -0
  43. package/dist/esm/sdk/{indexedDB-CA4tGqkr.js → indexedDB-BqsYXybq.js} +1 -1
  44. package/dist/esm/sdk/{lanes-vBKm6yBJ.js → lanes-0WT2w1Xz.js} +1 -1
  45. package/dist/esm/sdk/{localOnly-U_MucUAe.js → localOnly-DFrtrfdO.js} +1 -1
  46. package/dist/esm/sdk/{mountExportPrivateKeySurface-C2-fnvP6.js → mountExportPrivateKeySurface-D8juRQJM.js} +1 -1
  47. package/dist/{public/sdk/mountRecoveryCodeBackupSurface-C_tJNPJX.js → esm/sdk/mountRecoveryCodeBackupSurface-CMtByh-L.js} +1 -1
  48. package/dist/esm/sdk/{nearEd25519YaoSigningPreparation-CnbgQfZc.js → nearEd25519YaoSigningPreparation-Cz2Gb95g.js} +1 -1
  49. package/dist/esm/sdk/{operationFingerprint-Bas59T7L.js → operationFingerprint-GKEY-X5I.js} +1 -1
  50. package/dist/esm/sdk/ownerNearOperation-DCxxHcwX.js +1 -0
  51. package/dist/esm/sdk/{pendingWalletRecoveryCodeBackup-DXFrQmO5.js → pendingWalletRecoveryCodeBackup-8iMhQU-E.js} +1 -1
  52. package/dist/{public/sdk/presignaturePool-Dq4RhzXn.js → esm/sdk/presignaturePool-CaI45td2.js} +1 -1
  53. package/dist/esm/sdk/{presignatures-CkhuZ0YQ.js → presignatures-B9KnQyfE.js} +1 -1
  54. package/dist/esm/sdk/{recovery-entrypoint-s9OoKBcl.js → recovery-entrypoint-DA2FGLG6.js} +1 -1
  55. package/dist/esm/sdk/{registration-CTtTocyo.js → registration-C7w_51wE.js} +1 -1
  56. package/dist/esm/sdk/{registration-D3p7muCc.js → registration-XNyt1YRK.js} +1 -1
  57. package/dist/esm/sdk/{registrationIntent-C1-Kyx_-.js → registrationIntent-Cb3tggIM.js} +1 -1
  58. package/dist/{public/sdk/requireStepUpAuth-iVo6h_U-.js → esm/sdk/requireStepUpAuth-ByMTPBu4.js} +1 -1
  59. package/dist/esm/sdk/resealedEnvelopeResult-DKY5fVNY.js +1 -0
  60. package/dist/esm/sdk/routerAbNormalSigning-CPLDkttX.js +1 -0
  61. package/dist/esm/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
  62. package/dist/esm/sdk/runtime-auth-BMT_gIKI.js +1 -0
  63. package/dist/esm/sdk/{runtime-device-link-qmYvGep9.js → runtime-device-link-DQe0aqRi.js} +1 -1
  64. package/dist/{public/sdk/runtime-ecdsa-tempo-Zh95TuLV.js → esm/sdk/runtime-ecdsa-tempo-DKkeMMpm.js} +1 -1
  65. package/dist/esm/sdk/{runtime-email-otp-CnLuW4H1.js → runtime-email-otp-CzTe7r9I.js} +1 -1
  66. package/dist/esm/sdk/{runtime-export-m8lvrXtw.js → runtime-export-BiyLbdCe.js} +1 -1
  67. package/dist/esm/sdk/{runtime-near-BiXzXXhH.js → runtime-near-Kk0n1FSf.js} +1 -1
  68. package/dist/esm/sdk/runtime-preferences-B-A3hddU.js +1 -0
  69. package/dist/esm/sdk/runtime-recovery-C9p1TU1w.js +1 -0
  70. package/dist/esm/sdk/{runtime-recovery-codes-B033ake_.js → runtime-recovery-codes-CFOWDVd9.js} +1 -1
  71. package/dist/esm/sdk/{runtimeContext-RNS2E5wy.js → runtimeContext-ChuvOC0h.js} +3 -3
  72. package/dist/esm/sdk/{secp256k1-DPeaOjM0.js → secp256k1-sDDAa4Ga.js} +1 -1
  73. package/dist/{public/sdk/signEvmFamily-Cksw3RpU.js → esm/sdk/signEvmFamily-CMrXkVsZ.js} +1 -1
  74. package/dist/esm/sdk/{signEvmFamilyWithUiConfirmForTempo-B7p9UVix.js → signEvmFamilyWithUiConfirmForTempo-CnRoo0e8.js} +1 -1
  75. package/dist/esm/sdk/{signEvmWithUiConfirm-B14zYdwE.js → signEvmWithUiConfirm-yITc3ZvP.js} +1 -1
  76. package/dist/esm/sdk/{signNear-D0rFEYP1.js → signNear-DyFk--I3.js} +1 -1
  77. package/dist/{public/sdk/signingFlow-Bd1X0e-1.js → esm/sdk/signingFlow-DTP4D19E.js} +1 -1
  78. package/dist/{public/sdk/signingQueue-DoUBeaCv.js → esm/sdk/signingQueue-Dy5mYMus.js} +1 -1
  79. package/dist/esm/sdk/{thresholdEcdsa-BxfOZmiR.js → thresholdEcdsa-CRfx6RP1.js} +1 -1
  80. package/dist/esm/sdk/{trace-BnhLKxcu.js → trace-BA8jya7O.js} +1 -1
  81. package/dist/{public/sdk/transactionState-G_FPe-U8.js → esm/sdk/transactionState-BCbaT2hO.js} +1 -1
  82. package/dist/esm/sdk/tx-confirm-ui.js +3 -1
  83. package/dist/esm/sdk/{types-A-w1cYlJ.js → types-D2Zk1W7I.js} +1 -1
  84. package/dist/{public/sdk/unlockedEd25519ExportRootCapability-5F1egCSv.js → esm/sdk/unlockedEd25519ExportRootCapability-BbGMlikr.js} +1 -1
  85. package/dist/esm/sdk/voiceid-host.js +1 -1
  86. package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
  87. package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
  88. package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
  89. package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
  90. package/dist/esm/sdk/{wallet-recovery-DXdm68_Q.js → wallet-recovery-Bfm-oUoP.js} +1 -1
  91. package/dist/esm/sdk/wallet-ui.css +1 -1
  92. package/dist/{public/sdk/walletAuthMethodRecord-BW-XV4fv.js → esm/sdk/walletAuthMethodRecord--fvGr8r1.js} +1 -1
  93. package/dist/{public/sdk/walletAuthority-DbGaSw7D.js → esm/sdk/walletAuthority-CU9nO0Ze.js} +1 -1
  94. package/dist/esm/sdk/{walletCustodyEcdsaContinuity-BnyL1Ryu.js → walletCustodyEcdsaContinuity-BUdDyRl_.js} +1 -1
  95. package/dist/esm/sdk/{walletDbName-Ca0rCq5r.js → walletDbName-B6-CV_Rq.js} +1 -1
  96. package/dist/esm/sdk/{walletOwnerOperation-CScYv2K6.js → walletOwnerOperation-BJPxzo-k.js} +1 -1
  97. package/dist/esm/sdk/{walletOwnershipGeneration-BZc6UKqX.js → walletOwnershipGeneration-B3uE9GRG.js} +1 -1
  98. package/dist/{public/sdk/walletRecoveryAdminProof-DdwikrW3.js → esm/sdk/walletRecoveryAdminProof-BmZaP0Q8.js} +1 -1
  99. package/dist/{public/sdk/walletRecoveryCommit-DbAoiJp5.js → esm/sdk/walletRecoveryCommit-CSYNbYNd.js} +1 -1
  100. package/dist/esm/sdk/{walletSessionAuthorizationStatus-GhcGvDCX.js → walletSessionAuthorizationStatus-CQ3qA9tI.js} +1 -1
  101. package/dist/{public/sdk/walletSessionAuthorizationStore-BivTUoKY.js → esm/sdk/walletSessionAuthorizationStore-CGt-s5fX.js} +1 -1
  102. package/dist/esm/shared-ts/src/utils/index.js +1 -1
  103. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  104. package/dist/esm/wasm/router_ab_ecdsa_client/pkg/router_ab_ecdsa_client_bg.wasm +0 -0
  105. package/dist/esm/wasm/router_ab_ed25519_yao_client/pkg/router_ab_ed25519_yao_client_bg.wasm +0 -0
  106. package/dist/public/headers.manifest.json +1 -1
  107. package/dist/public/sdk/{ConfirmationDrawer-BRnd5SEf.js → ConfirmationDrawer-fyl4IDRl.js} +1 -1
  108. package/dist/{esm/sdk/NonceCoordinator-CNXYrOoy.js → public/sdk/NonceCoordinator-C1lw03Ce.js} +1 -1
  109. package/dist/public/sdk/{activeWalletSession-BJ4B-nJo.js → activeWalletSession-HAOgRKzn.js} +1 -1
  110. package/dist/public/sdk/{adapters-B2k8y0MB.js → adapters-BY1wGpm5.js} +1 -1
  111. package/dist/public/sdk/appearance-token-vars-CzlRDVQ7.js +1 -0
  112. package/dist/public/sdk/{authorization-gVWwKwav.js → authorization-D_NueqAv.js} +1 -1
  113. package/dist/public/sdk/{clientSessionPersistenceState-BxpITYM_.js → clientSessionPersistenceState-B3gU3515.js} +1 -1
  114. package/dist/public/sdk/{commitQueue-C1wkey4q.js → commitQueue-CbyuhEW9.js} +1 -1
  115. package/dist/{esm/sdk/confirm-ui-Dx6c4-Rk.js → public/sdk/confirm-ui-DWFcGTsT.js} +1 -1
  116. package/dist/{esm/sdk/device-linking-_o3_fgiG.js → public/sdk/device-linking-BL2aDEUF.js} +1 -1
  117. package/dist/public/sdk/{deviceLinkApproval-CObsEWBa.js → deviceLinkApproval-C4T8XAmi.js} +1 -1
  118. package/dist/public/sdk/{digestEncoding-34kXJoJr.js → digestEncoding-Rx8Vjy4J.js} +1 -1
  119. package/dist/public/sdk/{display-CUWg48tD.js → display-8NGPOhQT.js} +1 -1
  120. package/dist/{esm/sdk/ecdsaCapabilityManifest--1Ztngfx.js → public/sdk/ecdsaCapabilityManifest-BbPXL-qh.js} +1 -1
  121. package/dist/{esm/sdk/ecdsaDerivationClientWasm-DJh2uN-q.js → public/sdk/ecdsaDerivationClientWasm-GCt9yVsd.js} +1 -1
  122. package/dist/{esm/sdk/ecdsaDerivationExport-BUUUGc6o.js → public/sdk/ecdsaDerivationExport-jm2VBMz_.js} +1 -1
  123. package/dist/public/sdk/{emailOtpEcdsaDerivationIdentity-Qd4pBwHv.js → emailOtpEcdsaDerivationIdentity-DJmMyqL-.js} +1 -1
  124. package/dist/public/sdk/{export-viewer-host-O0OV1Oou.js → export-viewer-host-TzgdJQuZ.js} +1 -1
  125. package/dist/{esm/sdk/exportKeypairOperation-DkqY9Bpf.js → public/sdk/exportKeypairOperation-B9_ulzNz.js} +1 -1
  126. package/dist/public/sdk/host-Csu5L7VF.js +1 -0
  127. package/dist/public/sdk/{indexedDB-CA4tGqkr.js → indexedDB-BqsYXybq.js} +1 -1
  128. package/dist/public/sdk/{lanes-vBKm6yBJ.js → lanes-0WT2w1Xz.js} +1 -1
  129. package/dist/public/sdk/{localOnly-U_MucUAe.js → localOnly-DFrtrfdO.js} +1 -1
  130. package/dist/public/sdk/{mountExportPrivateKeySurface-C2-fnvP6.js → mountExportPrivateKeySurface-D8juRQJM.js} +1 -1
  131. package/dist/{esm/sdk/mountRecoveryCodeBackupSurface-C_tJNPJX.js → public/sdk/mountRecoveryCodeBackupSurface-CMtByh-L.js} +1 -1
  132. package/dist/public/sdk/{nearEd25519YaoSigningPreparation-CnbgQfZc.js → nearEd25519YaoSigningPreparation-Cz2Gb95g.js} +1 -1
  133. package/dist/public/sdk/{operationFingerprint-Bas59T7L.js → operationFingerprint-GKEY-X5I.js} +1 -1
  134. package/dist/public/sdk/ownerNearOperation-DCxxHcwX.js +1 -0
  135. package/dist/public/sdk/{pendingWalletRecoveryCodeBackup-DXFrQmO5.js → pendingWalletRecoveryCodeBackup-8iMhQU-E.js} +1 -1
  136. package/dist/{esm/sdk/presignaturePool-Dq4RhzXn.js → public/sdk/presignaturePool-CaI45td2.js} +1 -1
  137. package/dist/public/sdk/{presignatures-CkhuZ0YQ.js → presignatures-B9KnQyfE.js} +1 -1
  138. package/dist/public/sdk/{recovery-entrypoint-s9OoKBcl.js → recovery-entrypoint-DA2FGLG6.js} +1 -1
  139. package/dist/public/sdk/{registration-CTtTocyo.js → registration-C7w_51wE.js} +1 -1
  140. package/dist/public/sdk/{registration-D3p7muCc.js → registration-XNyt1YRK.js} +1 -1
  141. package/dist/public/sdk/{registrationIntent-C1-Kyx_-.js → registrationIntent-Cb3tggIM.js} +1 -1
  142. package/dist/{esm/sdk/requireStepUpAuth-iVo6h_U-.js → public/sdk/requireStepUpAuth-ByMTPBu4.js} +1 -1
  143. package/dist/public/sdk/resealedEnvelopeResult-DKY5fVNY.js +1 -0
  144. package/dist/public/sdk/routerAbNormalSigning-CPLDkttX.js +1 -0
  145. package/dist/public/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
  146. package/dist/public/sdk/runtime-auth-BMT_gIKI.js +1 -0
  147. package/dist/public/sdk/{runtime-device-link-qmYvGep9.js → runtime-device-link-DQe0aqRi.js} +1 -1
  148. package/dist/{esm/sdk/runtime-ecdsa-tempo-Zh95TuLV.js → public/sdk/runtime-ecdsa-tempo-DKkeMMpm.js} +1 -1
  149. package/dist/public/sdk/{runtime-email-otp-CnLuW4H1.js → runtime-email-otp-CzTe7r9I.js} +1 -1
  150. package/dist/public/sdk/{runtime-export-m8lvrXtw.js → runtime-export-BiyLbdCe.js} +1 -1
  151. package/dist/public/sdk/{runtime-near-BiXzXXhH.js → runtime-near-Kk0n1FSf.js} +1 -1
  152. package/dist/public/sdk/runtime-preferences-B-A3hddU.js +1 -0
  153. package/dist/public/sdk/runtime-recovery-C9p1TU1w.js +1 -0
  154. package/dist/public/sdk/{runtime-recovery-codes-B033ake_.js → runtime-recovery-codes-CFOWDVd9.js} +1 -1
  155. package/dist/public/sdk/{runtimeContext-RNS2E5wy.js → runtimeContext-ChuvOC0h.js} +3 -3
  156. package/dist/public/sdk/{secp256k1-DPeaOjM0.js → secp256k1-sDDAa4Ga.js} +1 -1
  157. package/dist/{esm/sdk/signEvmFamily-Cksw3RpU.js → public/sdk/signEvmFamily-CMrXkVsZ.js} +1 -1
  158. package/dist/public/sdk/{signEvmFamilyWithUiConfirmForTempo-B7p9UVix.js → signEvmFamilyWithUiConfirmForTempo-CnRoo0e8.js} +1 -1
  159. package/dist/public/sdk/{signEvmWithUiConfirm-B14zYdwE.js → signEvmWithUiConfirm-yITc3ZvP.js} +1 -1
  160. package/dist/public/sdk/{signNear-D0rFEYP1.js → signNear-DyFk--I3.js} +1 -1
  161. package/dist/{esm/sdk/signingFlow-Bd1X0e-1.js → public/sdk/signingFlow-DTP4D19E.js} +1 -1
  162. package/dist/{esm/sdk/signingQueue-DoUBeaCv.js → public/sdk/signingQueue-Dy5mYMus.js} +1 -1
  163. package/dist/public/sdk/{thresholdEcdsa-BxfOZmiR.js → thresholdEcdsa-CRfx6RP1.js} +1 -1
  164. package/dist/public/sdk/{trace-BnhLKxcu.js → trace-BA8jya7O.js} +1 -1
  165. package/dist/{esm/sdk/transactionState-G_FPe-U8.js → public/sdk/transactionState-BCbaT2hO.js} +1 -1
  166. package/dist/public/sdk/tx-confirm-ui.js +3 -1
  167. package/dist/public/sdk/{types-A-w1cYlJ.js → types-D2Zk1W7I.js} +1 -1
  168. package/dist/{esm/sdk/unlockedEd25519ExportRootCapability-5F1egCSv.js → public/sdk/unlockedEd25519ExportRootCapability-BbGMlikr.js} +1 -1
  169. package/dist/public/sdk/voiceid-host.js +1 -1
  170. package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
  171. package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
  172. package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
  173. package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
  174. package/dist/public/sdk/{wallet-recovery-DXdm68_Q.js → wallet-recovery-Bfm-oUoP.js} +1 -1
  175. package/dist/public/sdk/wallet-ui.css +1 -1
  176. package/dist/{esm/sdk/walletAuthMethodRecord-BW-XV4fv.js → public/sdk/walletAuthMethodRecord--fvGr8r1.js} +1 -1
  177. package/dist/{esm/sdk/walletAuthority-DbGaSw7D.js → public/sdk/walletAuthority-CU9nO0Ze.js} +1 -1
  178. package/dist/public/sdk/{walletCustodyEcdsaContinuity-BnyL1Ryu.js → walletCustodyEcdsaContinuity-BUdDyRl_.js} +1 -1
  179. package/dist/public/sdk/{walletDbName-Ca0rCq5r.js → walletDbName-B6-CV_Rq.js} +1 -1
  180. package/dist/public/sdk/{walletOwnerOperation-CScYv2K6.js → walletOwnerOperation-BJPxzo-k.js} +1 -1
  181. package/dist/public/sdk/{walletOwnershipGeneration-BZc6UKqX.js → walletOwnershipGeneration-B3uE9GRG.js} +1 -1
  182. package/dist/{esm/sdk/walletRecoveryAdminProof-DdwikrW3.js → public/sdk/walletRecoveryAdminProof-BmZaP0Q8.js} +1 -1
  183. package/dist/{esm/sdk/walletRecoveryCommit-DbAoiJp5.js → public/sdk/walletRecoveryCommit-CSYNbYNd.js} +1 -1
  184. package/dist/public/sdk/{walletSessionAuthorizationStatus-GhcGvDCX.js → walletSessionAuthorizationStatus-CQ3qA9tI.js} +1 -1
  185. package/dist/{esm/sdk/walletSessionAuthorizationStore-BivTUoKY.js → public/sdk/walletSessionAuthorizationStore-CGt-s5fX.js} +1 -1
  186. package/dist/public/sdk/workers/email_otp_runtime_bg.wasm +0 -0
  187. package/dist/public/sdk/workers/evm_crypto_bg.wasm +0 -0
  188. package/dist/public/sdk/workers/router_ab_ecdsa_client_bg.wasm +0 -0
  189. package/dist/public/sdk/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
  190. package/dist/public/sdk/workers/shamir3pass_runtime_bg.wasm +0 -0
  191. package/dist/public/sdk/workers/tempo_signer_bg.wasm +0 -0
  192. package/dist/public/sdk/workers/wallet_custody_ceremony_bg.wasm +0 -0
  193. package/dist/public/sdk/workers/wasm_signer_worker_bg.wasm +0 -0
  194. package/dist/public/wallet-assets.manifest.json +153 -153
  195. package/dist/public/wallet-service/index.html +4 -4
  196. package/dist/types/wallet/src/SeamsWeb/index.d.ts +1 -0
  197. package/dist/types/wallet/src/SeamsWeb/publicApi/types.d.ts +3 -0
  198. package/dist/types/wallet/src/SeamsWeb/walletIframe/client/inboundMessages.d.ts +5 -0
  199. package/dist/types/wallet/src/SeamsWeb/walletIframe/client/router.d.ts +3 -0
  200. package/dist/types/wallet/src/SeamsWeb/walletIframe/coordinator.d.ts +6 -0
  201. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/controller.d.ts +2 -0
  202. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/domain.d.ts +3 -0
  203. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/session.d.ts +4 -0
  204. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/requestRouter.d.ts +1 -1
  205. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.d.ts +5 -0
  206. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/ui/auth-menu/WalletAlternativesSection.d.ts +13 -0
  207. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/ui/auth-menu/mountAuthMenuSurface.d.ts +3 -0
  208. package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/messages.d.ts +11 -4
  209. package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/walletAlternatives.d.ts +52 -0
  210. package/dist/types/wallet/src/core/types/seams.d.ts +2 -2
  211. package/dist/types/wallet/src/core/ui/messages.d.ts +1 -1
  212. package/dist/types/wallet/src/core/ui/walletIcon.d.ts +3 -0
  213. package/dist/types/wallet/src/index.d.ts +1 -0
  214. package/dist/types/wallet/src/react/components/HostedSeamsAuthMenu/public.d.ts +1 -0
  215. package/dist/types/wallet/src/react/components/HostedSeamsAuthMenu/types.d.ts +4 -0
  216. package/dist/types/wallet/src/react/components/HostedSeamsAuthMenu/walletAlternatives.d.ts +48 -0
  217. package/dist/types/wallet/src/react/index.d.ts +1 -2
  218. package/dist/workers/email_otp_runtime_bg.wasm +0 -0
  219. package/dist/workers/evm_crypto_bg.wasm +0 -0
  220. package/dist/workers/router_ab_ecdsa_client_bg.wasm +0 -0
  221. package/dist/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
  222. package/dist/workers/shamir3pass_runtime_bg.wasm +0 -0
  223. package/dist/workers/tempo_signer_bg.wasm +0 -0
  224. package/dist/workers/wallet_custody_ceremony_bg.wasm +0 -0
  225. package/dist/workers/wasm_signer_worker_bg.wasm +0 -0
  226. package/package.json +1 -1
  227. package/dist/esm/react/components/HostedSeamsAuthMenu/WalletConnectorMenu.css +0 -182
  228. package/dist/esm/react/components/HostedSeamsAuthMenu/WalletConnectorMenu.js +0 -315
  229. package/dist/esm/sdk/appearance-token-vars-DkF3EBbF.js +0 -1
  230. package/dist/esm/sdk/host-BeE2dIU4.js +0 -1
  231. package/dist/esm/sdk/ownerNearOperation-DjNDxW3_.js +0 -1
  232. package/dist/esm/sdk/resealedEnvelopeResult-DXDo-72P.js +0 -1
  233. package/dist/esm/sdk/routerAbNormalSigning-DVFFkNhJ.js +0 -1
  234. package/dist/esm/sdk/runtime-auth-Dsmw_dUA.js +0 -1
  235. package/dist/esm/sdk/runtime-preferences-DlKHDIjb.js +0 -1
  236. package/dist/esm/sdk/runtime-recovery-C6lS71Jp.js +0 -1
  237. package/dist/public/sdk/appearance-token-vars-DkF3EBbF.js +0 -1
  238. package/dist/public/sdk/host-BeE2dIU4.js +0 -1
  239. package/dist/public/sdk/ownerNearOperation-DjNDxW3_.js +0 -1
  240. package/dist/public/sdk/resealedEnvelopeResult-DXDo-72P.js +0 -1
  241. package/dist/public/sdk/routerAbNormalSigning-DVFFkNhJ.js +0 -1
  242. package/dist/public/sdk/runtime-auth-Dsmw_dUA.js +0 -1
  243. package/dist/public/sdk/runtime-preferences-DlKHDIjb.js +0 -1
  244. package/dist/public/sdk/runtime-recovery-C6lS71Jp.js +0 -1
  245. package/dist/types/wallet/src/react/components/HostedSeamsAuthMenu/WalletConnectorMenu.d.ts +0 -31
  246. /package/dist/esm/sdk/{canonicalPrimitives-Jd3i_Ngz.js → canonicalPrimitives-DKeS3M40.js} +0 -0
  247. /package/dist/esm/sdk/{capabilityKinds-DVlGMspk.js → capabilityKinds-Cafn86Y1.js} +0 -0
  248. /package/dist/esm/sdk/{walletIframeIdentity-CpgyEnKg.js → walletIframeIdentity-Cz82I_Uh.js} +0 -0
  249. /package/dist/public/sdk/{canonicalPrimitives-Jd3i_Ngz.js → canonicalPrimitives-DKeS3M40.js} +0 -0
  250. /package/dist/public/sdk/{capabilityKinds-DVlGMspk.js → capabilityKinds-Cafn86Y1.js} +0 -0
  251. /package/dist/public/sdk/{walletIframeIdentity-CpgyEnKg.js → walletIframeIdentity-Cz82I_Uh.js} +0 -0
package/README.md CHANGED
@@ -1,19 +1,19 @@
1
1
  # Seams Wallet SDK
2
2
 
3
- `@seams/wallet` **0.29.0** provides browser wallet lifecycle, NEAR and EVM-family
3
+ `@seams/wallet` **0.30.0** provides browser wallet lifecycle, NEAR and EVM-family
4
4
  threshold signing, React components, and hosted wallet runtime assets.
5
5
 
6
6
  ## Install
7
7
 
8
8
  ```sh
9
- pnpm add @seams/wallet@0.29.0
9
+ pnpm add @seams/wallet@0.30.0
10
10
  ```
11
11
 
12
12
  React integrations support React 18 and 19. Import the provider and UI from
13
13
  `@seams/wallet/react` and its stylesheet from `@seams/wallet/react/styles`.
14
14
  Keep the application package, wallet-origin assets, and
15
- `@seams/wallet-server@0.29.0` on the matching release. The wallet iframe protocol
16
- is `19.0.0`. The application and wallet host must use the same protocol version.
15
+ `@seams/wallet-server@0.30.0` on the matching release. The wallet iframe protocol
16
+ is `20.0.0`. The application and wallet host must use the same protocol version.
17
17
 
18
18
  ## Current API
19
19
 
@@ -48,7 +48,7 @@ the challenge and its expiry. The application receives the typed challenge handl
48
48
 
49
49
  ## Application sessions and fresh owner approval
50
50
 
51
- SDK 0.29.0 accepts a handoff from an explicitly trusted application backend.
51
+ SDK 0.30.0 accepts a handoff from an explicitly trusted application backend.
52
52
  Google and app-passkey login can use the same stable application user ID.
53
53
  Use `registration.registerOwnerWallet` for NEAR-only passkey onboarding and `near.prepareOwnerTransaction` for fresh approval of each transaction.
54
54
  These operations create no reusable signing authority.
@@ -57,7 +57,7 @@ See the [application-session guide](https://wallet.seams.sh/docs/guides/applicat
57
57
 
58
58
  ## Bring your own Google authentication
59
59
 
60
- SDK 0.29.0 can reuse an application's Google ID token to open associated wallet settings.
60
+ SDK 0.30.0 can reuse an application's Google ID token to open associated wallet settings.
61
61
  Configure the environment's Google client ID and let the owner associate their wallet once.
62
62
  Then pass the token after the application's existing Google login:
63
63
 
@@ -1 +1 @@
1
- 810cdbbc2f95b4a48d4b1ce36a3ab524ffd0f3efff7c5a8eeb00d48a8c98c70c
1
+ fc980903c573c287e8206786d90025fc12bbd72eab183d74520e08097b5b3360
@@ -71,6 +71,8 @@ var SeamsWeb = class {
71
71
  prepare: this.walletIframe.prepareHostedAuthMenu.bind(this.walletIframe),
72
72
  open: this.walletIframe.openHostedAuthMenu.bind(this.walletIframe),
73
73
  cancel: this.walletIframe.cancelHostedAuthMenu.bind(this.walletIframe),
74
+ onWalletConnectionRequest: this.walletIframe.onWalletConnectionRequest.bind(this.walletIframe),
75
+ resolveWalletConnection: this.walletIframe.resolveWalletConnection.bind(this.walletIframe),
74
76
  onExternalAuthRequest: this.walletIframe.onHostedAuthMenuExternalAuthRequest.bind(this.walletIframe),
75
77
  resolveExternalAuth: this.walletIframe.resolveHostedAuthMenuExternalAuth.bind(this.walletIframe)
76
78
  };
@@ -1,5 +1,6 @@
1
1
  import { isObject } from "../../../shared-ts/src/utils/validation.js";
2
2
  import { isWalletFlowEvent, parseSdkLifecycleEvent } from "../../../core/types/sdkSentEvents.js";
3
+ import { parseWalletConnectionRequest } from "../shared/walletAlternatives.js";
3
4
  import { isDeviceLinkEmailOtpBaseFactorSelectionProgressV1, isDeviceLinkTargetFactorActivationProgressV1, isRegistrationTimingSpanV1, parseHostedAuthMenuErrorEvent, parseHostedAuthMenuExternalAuthRequest, parseWalletIframeSurfaceMeasurement } from "../shared/messages.js";
4
5
  import { parseWalletIframeExactSessionSnapshot, parseWalletIframeSessionRevision } from "../shared/exactSessionState.js";
5
6
  import { parseTransactionReviewState } from "../shared/transactionReview.js";
@@ -134,6 +135,14 @@ function parseClientChildToParentEnvelope(value) {
134
135
  payload
135
136
  } : null;
136
137
  }
138
+ case "WALLET_CONNECTION_REQUEST": {
139
+ const payload = parseWalletConnectionRequest(Reflect.get(record, "payload"));
140
+ return payload ? {
141
+ ...requestIdFields,
142
+ type,
143
+ payload
144
+ } : null;
145
+ }
137
146
  case "AUTH_MENU_EXTERNAL_AUTH_REQUEST": {
138
147
  const payload = parseHostedAuthMenuExternalAuthRequest(Reflect.get(record, "payload"));
139
148
  return payload ? {
@@ -14,6 +14,7 @@ import { AccountSyncEventPhase, KeyExportEventPhase, LinkDeviceEventPhase, Regis
14
14
  import { requireTempoFeeTokenPreferenceSigningRequest } from "../../../core/signingEngine/chains/tempo/feeToken.js";
15
15
  import { buildPMUnlockPayload } from "../shared/unlockOptions.js";
16
16
  import { walletIframeSurfaceIdFromBoundary } from "../../../core/types/walletIframeIdentity.js";
17
+ import { parseWalletConnectionResolution } from "../shared/walletAlternatives.js";
17
18
  import { HOSTED_AUTH_MENU_ERROR_EVENT, buildHostedAuthMenuCancelPayload, buildPMRedeemHostedWalletSeamsSessionPayload, hostedAuthMenuSessionIdFromBoundary, isDeviceLinkEmailOtpBaseFactorSelectionProgressV1, isDeviceLinkTargetFactorActivationProgressV1, isRegistrationTimingSpanV1, parseHostedAuthMenuErrorEvent, parseHostedAuthMenuExternalAuthRequest, parseHostedAuthMenuExternalAuthResolution, parseHostedAuthMenuOpenRequest, parseHostedAuthMenuOutcome, parseWalletIframeSurfaceMeasurement } from "../shared/messages.js";
18
19
  import { replaceWalletHostAppearance } from "../shared/configuration.js";
19
20
  import { anchorWalletIframeModalGeometry, isWalletIframeModalGeometry, resolveWalletIframeSurfaceGeometry } from "./surface/geometry.js";
@@ -550,6 +551,7 @@ var WalletIframeRouter = class {
550
551
  connectionClosed: /* @__PURE__ */ new Set(),
551
552
  sessionChanged: /* @__PURE__ */ new Set(),
552
553
  preferencesChanged: /* @__PURE__ */ new Set(),
554
+ walletConnectionRequest: /* @__PURE__ */ new Set(),
553
555
  hostedAuthMenuExternalAuthRequest: /* @__PURE__ */ new Set(),
554
556
  sdkLifecycleEvent: /* @__PURE__ */ new Set()
555
557
  };
@@ -1381,6 +1383,25 @@ var WalletIframeRouter = class {
1381
1383
  this.listeners.connectionClosed.add(listener);
1382
1384
  return this.listeners.connectionClosed.delete.bind(this.listeners.connectionClosed, listener);
1383
1385
  }
1386
+ onWalletConnectionRequest(listener) {
1387
+ this.listeners.walletConnectionRequest.add(listener);
1388
+ return this.listeners.walletConnectionRequest.delete.bind(this.listeners.walletConnectionRequest, listener);
1389
+ }
1390
+ async resolveWalletConnection(resolution) {
1391
+ const requestId = this.hostedAuthMenuRequestIds.get(resolution.authMenuSessionId);
1392
+ if (!requestId) return;
1393
+ const payload = parseWalletConnectionResolution({
1394
+ authMenuSessionId: resolution.authMenuSessionId,
1395
+ connectionRequestId: resolution.connectionRequestId,
1396
+ requestId,
1397
+ result: resolution.result
1398
+ });
1399
+ if (!payload) throw new Error("Invalid wallet connection resolution");
1400
+ await this.post({
1401
+ type: "PM_RESOLVE_WALLET_CONNECTION",
1402
+ payload
1403
+ });
1404
+ }
1384
1405
  onHostedAuthMenuExternalAuthRequest(listener) {
1385
1406
  this.listeners.hostedAuthMenuExternalAuthRequest.add(listener);
1386
1407
  return () => this.listeners.hostedAuthMenuExternalAuthRequest.delete(listener);
@@ -2739,6 +2760,15 @@ var WalletIframeRouter = class {
2739
2760
  this.handlePreferencesChanged(payload);
2740
2761
  return;
2741
2762
  }
2763
+ if (msg.type === "WALLET_CONNECTION_REQUEST") {
2764
+ const payload = msg.payload;
2765
+ const activeRequestId = this.hostedAuthMenuRequestIds.get(payload.authMenuSessionId);
2766
+ if (!activeRequestId || msg.requestId !== activeRequestId) return;
2767
+ for (const listener of this.listeners.walletConnectionRequest) try {
2768
+ listener(payload);
2769
+ } catch {}
2770
+ return;
2771
+ }
2742
2772
  if (msg.type === "AUTH_MENU_EXTERNAL_AUTH_REQUEST") {
2743
2773
  const payload = parseHostedAuthMenuExternalAuthRequest(msg.payload);
2744
2774
  if (!payload) return;
@@ -32,6 +32,8 @@ var WalletIframeCoordinator = class {
32
32
  walletIframeSessionUnsubscribe = null;
33
33
  sessionListeners = /* @__PURE__ */ new Set();
34
34
  walletIframeLifecycleUnsubscribe = null;
35
+ walletConnectionUnsubscribe = null;
36
+ walletConnectionListeners = /* @__PURE__ */ new Set();
35
37
  walletIframeAuthMenuUnsubscribe = null;
36
38
  sdkLifecycleEventListeners = /* @__PURE__ */ new Set();
37
39
  hostedAuthMenuExternalAuthRequestListeners = /* @__PURE__ */ new Set();
@@ -83,6 +85,7 @@ var WalletIframeCoordinator = class {
83
85
  this.sdkLifecycleEventListeners.clear();
84
86
  this.sessionListeners.clear();
85
87
  this.hostedAuthMenuExternalAuthRequestListeners.clear();
88
+ this.walletConnectionListeners.clear();
86
89
  }
87
90
  releaseRouter() {
88
91
  this.sessionDeliveryRevision += 1;
@@ -91,6 +94,8 @@ var WalletIframeCoordinator = class {
91
94
  this.walletIframeLifecycleUnsubscribe?.();
92
95
  this.walletIframeSessionUnsubscribe?.();
93
96
  this.walletIframeAuthMenuUnsubscribe?.();
97
+ this.walletConnectionUnsubscribe?.();
98
+ this.walletConnectionUnsubscribe = null;
94
99
  this.walletIframeCloseUnsubscribe = null;
95
100
  this.walletIframePrefsUnsubscribe = null;
96
101
  this.walletIframeLifecycleUnsubscribe = null;
@@ -255,6 +260,18 @@ var WalletIframeCoordinator = class {
255
260
  }
256
261
  await (await this.requireRouter()).cancelHostedAuthMenu(args);
257
262
  }
263
+ onWalletConnectionRequest(listener) {
264
+ if (this.connection.kind === "disposed") return noSubscription;
265
+ this.walletConnectionListeners.add(listener);
266
+ if (this.iframeRouter) this.ensureWalletIframeAuthMenuMirror(this.iframeRouter);
267
+ return this.walletConnectionListeners.delete.bind(this.walletConnectionListeners, listener);
268
+ }
269
+ async resolveWalletConnection(resolution) {
270
+ await (await this.requireRouter()).resolveWalletConnection(resolution);
271
+ }
272
+ forwardWalletConnection = (request) => {
273
+ for (const listener of this.walletConnectionListeners) listener(request);
274
+ };
258
275
  onHostedAuthMenuExternalAuthRequest(listener) {
259
276
  if (this.connection.kind === "disposed") return noSubscription;
260
277
  this.hostedAuthMenuExternalAuthRequestListeners.add(listener);
@@ -288,6 +305,7 @@ var WalletIframeCoordinator = class {
288
305
  this.walletIframeLifecycleUnsubscribe = router.onSdkLifecycleEvent(this.forwardSdkLifecycleEventListener);
289
306
  }
290
307
  ensureWalletIframeAuthMenuMirror(router) {
308
+ if (!this.walletConnectionUnsubscribe) this.walletConnectionUnsubscribe = router.onWalletConnectionRequest(this.forwardWalletConnection);
291
309
  if (!this.walletIframeAuthMenuUnsubscribe) this.walletIframeAuthMenuUnsubscribe = router.onHostedAuthMenuExternalAuthRequest(this.forwardHostedAuthMenuExternalAuthRequestListener);
292
310
  }
293
311
  forwardSdkLifecycleEvent(event) {
@@ -2,6 +2,7 @@ import { isLinkedDeviceTargetEmailAddressV1 } from "../../../../../core/types/li
2
2
  import "../../../../../shared-ts/src/wallet-recovery/recoveryCodes.js";
3
3
  import { walletDisplayText, walletText } from "../../../../../core/ui/messages.js";
4
4
  import { WalletLocaleContext, WalletText } from "../../../../../core/signingEngine/uiConfirm/ui/preact/WalletLocale.js";
5
+ import { WalletAlternativesSection } from "./WalletAlternativesSection.js";
5
6
  import { recoveryInputCharacters, rejectedRecoveryCharacters, renderRecoveryCodeGroups } from "./recovery-code-input.js";
6
7
  import { AUTH_MENU_WAITING_PROMPTS, isAuthMenuActionReady, isAuthMenuGoogleActionReady, isAuthMenuLoadingStatus, isAuthMenuReady } from "../../auth-menu/domain.js";
7
8
  import { AUTH_MENU_ACCOUNT_LIST_ID, AUTH_MENU_TITLE_ID, accountGroups, accountSecondaryText, authViewKey, menuNotice, modeLabel, modeSwitchCopy, otpCodeDigits, passkeyButtonLabel, recoveryAnnouncement, recoveryBackLabel, recoveryCaretAtPoint, recoveryNavigationLocked, renderDemoEmailCode, renderOtpCodeDigit, savedAccountsTriggerLabel, selectedAccountPrimaryText, selectedLoginAccount } from "./presentation.js";
@@ -13,7 +14,6 @@ import { linkDeviceDotRing, linkDeviceEmailOtpPresentation } from "./linkDeviceB
13
14
  import { Component, Fragment } from "preact";
14
15
  import { Fragment as Fragment$1, jsx, jsxs } from "preact/jsx-runtime";
15
16
  //#region src/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.tsx
16
- /** @jsxImportSource preact */
17
17
  const ACCOUNT_MENU_EXIT_MS = 160;
18
18
  var AuthMenuSurface = class extends Component {
19
19
  static contextType = WalletLocaleContext;
@@ -94,7 +94,10 @@ var AuthMenuSurface = class extends Component {
94
94
  const current = this.viewModel;
95
95
  if (previous?.kind === "recovery" && current.kind !== "recovery") {
96
96
  this.previousRecoveryStage = null;
97
- this.props.element.querySelector("[data-recovery-action]")?.focus();
97
+ const action = this.props.element.querySelector("[data-recovery-action]");
98
+ const expander = action?.closest("details");
99
+ if (expander) expander.open = true;
100
+ action?.focus();
98
101
  return;
99
102
  }
100
103
  if (current.kind !== "recovery") return;
@@ -183,8 +186,15 @@ var AuthMenuSurface = class extends Component {
183
186
  }
184
187
  };
185
188
  focusableElements() {
186
- return Array.from(this.props.element.querySelectorAll("button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])"));
189
+ return Array.from(this.props.element.querySelectorAll("button, input, select, textarea, summary, a[href], [tabindex]:not([tabindex=\"-1\"])")).filter(isAvailableMenuControl);
187
190
  }
191
+ onDismiss = () => {
192
+ if (recoveryNavigationLocked(this.viewModel)) return;
193
+ this.emitIntent({
194
+ kind: "close",
195
+ reason: "close_button"
196
+ });
197
+ };
188
198
  onBackClick = () => {
189
199
  this.emitIntent({ kind: "back" });
190
200
  };
@@ -501,7 +511,19 @@ var AuthMenuSurface = class extends Component {
501
511
  children: [
502
512
  /* @__PURE__ */ jsx(PadlockIcon, {}),
503
513
  " ",
504
- /* @__PURE__ */ jsx("span", { children: viewModel.hostname })
514
+ /* @__PURE__ */ jsx("span", { children: viewModel.hostname }),
515
+ /* @__PURE__ */ jsx("button", {
516
+ type: "button",
517
+ class: "seams-menu-dismiss",
518
+ "aria-label": viewModel.closeLabel,
519
+ disabled: recoveryNavigationLocked(viewModel),
520
+ onClick: this.onDismiss,
521
+ "data-auth-menu-dismiss": true,
522
+ children: /* @__PURE__ */ jsx("span", {
523
+ "aria-hidden": "true",
524
+ children: "×"
525
+ })
526
+ })
505
527
  ]
506
528
  }),
507
529
  /* @__PURE__ */ jsxs("div", {
@@ -549,12 +571,28 @@ var AuthMenuSurface = class extends Component {
549
571
  if (viewModel.kind === "google_registration") return this.renderGoogleRegistration(viewModel);
550
572
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [
551
573
  this.renderMenuHeader(viewModel),
552
- " ",
553
- this.renderPasskeyInput(viewModel),
554
- this.renderAuthMethods(viewModel),
555
- " ",
556
- this.renderOtherOptions(),
557
- this.renderIntentSwitch(viewModel)
574
+ /* @__PURE__ */ jsxs("fieldset", {
575
+ class: "seams-connection-controls",
576
+ disabled: this.props.walletConnection.kind === "pending",
577
+ children: [
578
+ this.renderPasskeyInput(viewModel),
579
+ this.renderAuthMethods(viewModel),
580
+ /* @__PURE__ */ jsx(WalletAlternativesSection, {
581
+ alternatives: this.props.walletAlternatives,
582
+ onIntent: this.props.onIntent
583
+ }),
584
+ this.renderOtherOptions(),
585
+ this.renderIntentSwitch(viewModel)
586
+ ]
587
+ }),
588
+ this.props.walletConnection.kind === "pending" && /* @__PURE__ */ jsx("p", {
589
+ role: "status",
590
+ children: /* @__PURE__ */ jsx(WalletText, { copy: "Complete the request in your wallet." })
591
+ }),
592
+ this.props.walletConnection.kind === "failed" && /* @__PURE__ */ jsx("p", {
593
+ role: "alert",
594
+ children: this.props.walletConnection.message
595
+ })
558
596
  ] });
559
597
  }
560
598
  renderMenuHeader(viewModel) {
@@ -766,44 +804,44 @@ var AuthMenuSurface = class extends Component {
766
804
  }) });
767
805
  }
768
806
  renderOtherOptions() {
769
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
770
- class: "seams-menu-options-label",
771
- children: /* @__PURE__ */ jsx(WalletText, { message: "Other options" })
772
- }), /* @__PURE__ */ jsxs("div", {
773
- class: "seams-menu-options",
774
- children: [/* @__PURE__ */ jsxs("button", {
775
- class: "seams-menu-option",
776
- type: "button",
777
- onClick: this.onLinkDeviceOpen,
778
- children: [
779
- /* @__PURE__ */ jsx("span", {
780
- class: "seams-menu-option-icon",
781
- children: linkDeviceIcon()
782
- }),
783
- /* @__PURE__ */ jsxs("span", {
784
- class: "seams-menu-option-text",
785
- children: [/* @__PURE__ */ jsx(WalletText, { message: "Link this device" }), /* @__PURE__ */ jsx("small", { children: /* @__PURE__ */ jsx(WalletText, { message: "Scan a code with your other device" }) })]
786
- }),
787
- chevronIcon()
788
- ]
789
- }), /* @__PURE__ */ jsxs("button", {
790
- class: "seams-menu-option",
791
- type: "button",
792
- "data-recovery-action": true,
793
- onClick: this.onRecoveryOpen,
794
- children: [
795
- /* @__PURE__ */ jsx("span", {
796
- class: "seams-menu-option-icon",
797
- children: recoveryIcon()
798
- }),
799
- /* @__PURE__ */ jsxs("span", {
800
- class: "seams-menu-option-text",
801
- children: [/* @__PURE__ */ jsx(WalletText, { message: "Recover wallet" }), /* @__PURE__ */ jsx("small", { children: /* @__PURE__ */ jsx(WalletText, { message: "Use your recovery code" }) })]
802
- }),
803
- chevronIcon()
804
- ]
807
+ return /* @__PURE__ */ jsxs("details", {
808
+ class: "seams-menu-expander",
809
+ children: [/* @__PURE__ */ jsxs("summary", { children: [/* @__PURE__ */ jsx(WalletText, { copy: "Recover or link wallet" }), chevronIcon()] }), /* @__PURE__ */ jsxs("div", {
810
+ class: "seams-menu-options",
811
+ children: [/* @__PURE__ */ jsxs("button", {
812
+ class: "seams-menu-option",
813
+ type: "button",
814
+ onClick: this.onLinkDeviceOpen,
815
+ children: [
816
+ /* @__PURE__ */ jsx("span", {
817
+ class: "seams-menu-option-icon",
818
+ children: linkDeviceIcon()
819
+ }),
820
+ /* @__PURE__ */ jsxs("span", {
821
+ class: "seams-menu-option-text",
822
+ children: [/* @__PURE__ */ jsx(WalletText, { message: "Link this device" }), /* @__PURE__ */ jsx("small", { children: /* @__PURE__ */ jsx(WalletText, { message: "Scan a code with your other device" }) })]
823
+ }),
824
+ chevronIcon()
825
+ ]
826
+ }), /* @__PURE__ */ jsxs("button", {
827
+ class: "seams-menu-option",
828
+ type: "button",
829
+ "data-recovery-action": true,
830
+ onClick: this.onRecoveryOpen,
831
+ children: [
832
+ /* @__PURE__ */ jsx("span", {
833
+ class: "seams-menu-option-icon",
834
+ children: recoveryIcon()
835
+ }),
836
+ /* @__PURE__ */ jsxs("span", {
837
+ class: "seams-menu-option-text",
838
+ children: [/* @__PURE__ */ jsx(WalletText, { message: "Recover wallet" }), /* @__PURE__ */ jsx("small", { children: /* @__PURE__ */ jsx(WalletText, { message: "Use your recovery code" }) })]
839
+ }),
840
+ chevronIcon()
841
+ ]
842
+ })]
805
843
  })]
806
- })] });
844
+ });
807
845
  }
808
846
  renderRecovery(viewModel) {
809
847
  if (viewModel.stage === "enter_code") {
@@ -1577,6 +1615,9 @@ function voiceMethodIcon() {
1577
1615
  children: /* @__PURE__ */ jsx("path", { d: "M4 10v4m4-7v10m4-14v18m4-14v10m4-7v4" })
1578
1616
  });
1579
1617
  }
1618
+ function isAvailableMenuControl(element) {
1619
+ return !element.matches(":disabled") && element.getClientRects().length > 0;
1620
+ }
1580
1621
  //#endregion
1581
1622
  export { AuthMenuSurface };
1582
1623
 
@@ -0,0 +1,67 @@
1
+ import { WalletText } from "../../../../../core/signingEngine/uiConfirm/ui/preact/WalletLocale.js";
2
+ import { Component } from "preact";
3
+ import { Fragment as Fragment$1, jsx, jsxs } from "preact/jsx-runtime";
4
+ //#region src/SeamsWeb/walletIframe/host/ui/auth-menu/WalletAlternativesSection.tsx
5
+ /** @jsxImportSource preact */
6
+ var WalletAlternativesSection = class extends Component {
7
+ connect = (alternativeId) => {
8
+ this.props.onIntent({
9
+ kind: "wallet_connection",
10
+ alternativeId
11
+ });
12
+ };
13
+ renderWalletRows(wallets) {
14
+ const rows = [];
15
+ for (const wallet of wallets) rows.push(/* @__PURE__ */ jsxs("button", {
16
+ type: "button",
17
+ class: "seams-menu-option seams-wallet-alternative",
18
+ onClick: this.connect.bind(this, wallet.id),
19
+ children: [
20
+ /* @__PURE__ */ jsx("span", {
21
+ class: "seams-alternative-icon",
22
+ "aria-hidden": "true",
23
+ children: wallet.icon ? /* @__PURE__ */ jsx("img", {
24
+ src: wallet.icon,
25
+ alt: "",
26
+ width: "32",
27
+ height: "32"
28
+ }) : "↗"
29
+ }),
30
+ /* @__PURE__ */ jsxs("span", {
31
+ class: "seams-menu-option-text",
32
+ children: [wallet.label, wallet.description && /* @__PURE__ */ jsx("small", { children: wallet.description })]
33
+ }),
34
+ /* @__PURE__ */ jsx("span", {
35
+ class: "seams-alternative-arrow",
36
+ "aria-hidden": "true",
37
+ children: "↗"
38
+ })
39
+ ]
40
+ }, wallet.id));
41
+ return /* @__PURE__ */ jsx("div", {
42
+ class: "seams-menu-options",
43
+ children: rows
44
+ });
45
+ }
46
+ render() {
47
+ const { primary, secondary } = this.props.alternatives;
48
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [primary.length > 0 && /* @__PURE__ */ jsxs("section", {
49
+ "aria-label": "Or connect another wallet",
50
+ children: [/* @__PURE__ */ jsx("div", {
51
+ class: "seams-menu-options-label seams-alternatives-heading",
52
+ children: /* @__PURE__ */ jsx(WalletText, { copy: "Or connect another wallet" })
53
+ }), this.renderWalletRows(primary)]
54
+ }), secondary.length > 0 && /* @__PURE__ */ jsxs("details", {
55
+ class: "seams-menu-expander",
56
+ "data-wallet-alternatives-secondary": true,
57
+ children: [/* @__PURE__ */ jsxs("summary", { children: [/* @__PURE__ */ jsx(WalletText, { copy: "More wallets" }), /* @__PURE__ */ jsx("span", {
58
+ "aria-hidden": "true",
59
+ children: "⌄"
60
+ })] }), this.renderWalletRows(secondary)]
61
+ })] });
62
+ }
63
+ };
64
+ //#endregion
65
+ export { WalletAlternativesSection };
66
+
67
+ //# sourceMappingURL=WalletAlternativesSection.js.map
@@ -1,3 +1,4 @@
1
+ import { emptyWalletAlternatives } from "../../../shared/walletAlternatives.js";
1
2
  import { appearanceTokenCssRule } from "../../../../../core/signingEngine/uiConfirm/ui/appearance-token-vars.js";
2
3
  import { createCspStylesheetManager, getDefaultCspNonce } from "../../../../../core/browser/walletIframe/csp-stylesheet.js";
3
4
  import { withWalletLocale } from "../../../../../core/signingEngine/uiConfirm/ui/preact/WalletLocale.js";
@@ -23,10 +24,15 @@ function authMenuStyles(document) {
23
24
  }
24
25
  var MountedAuthMenuSurface = class {
25
26
  element;
27
+ walletAlternatives;
28
+ walletConnection = { kind: "idle" };
29
+ viewModel;
26
30
  styles;
27
31
  entrance = [];
28
32
  state;
29
33
  constructor(input) {
34
+ this.walletAlternatives = input.walletAlternatives ?? emptyWalletAlternatives();
35
+ this.viewModel = input.viewModel;
30
36
  const document = input.parent.ownerDocument;
31
37
  this.styles = authMenuStyles(document);
32
38
  this.element = document.createElement("div");
@@ -70,7 +76,12 @@ var MountedAuthMenuSurface = class {
70
76
  easing: "cubic-bezier(0.25, 1, 0.5, 1)"
71
77
  }));
72
78
  }
79
+ updateWalletConnection(state) {
80
+ this.walletConnection = state;
81
+ this.update(this.viewModel);
82
+ }
73
83
  update(viewModel) {
84
+ this.viewModel = viewModel;
74
85
  if (this.state.kind === "disposed") return;
75
86
  this.element.lang = viewModel.appearance.locale ?? "en";
76
87
  this.element.dataset.theme = viewModel.appearance.theme.mode;
@@ -78,6 +89,8 @@ var MountedAuthMenuSurface = class {
78
89
  render(withWalletLocale(viewModel.appearance.locale ?? "en", /* @__PURE__ */ jsx(AuthMenuSurface, {
79
90
  element: this.element,
80
91
  viewModel,
92
+ walletAlternatives: this.walletAlternatives,
93
+ walletConnection: this.walletConnection,
81
94
  onIntent: this.state.onIntent,
82
95
  styles: this.styles
83
96
  })), this.element);
@@ -45,6 +45,7 @@ function walletForHostRequest(request, currentWalletId) {
45
45
  case "PM_OPEN_AUTH_MENU":
46
46
  case "PM_CANCEL_AUTH_MENU":
47
47
  case "PM_RESOLVE_AUTH_MENU_EXTERNAL_AUTH":
48
+ case "PM_RESOLVE_WALLET_CONNECTION":
48
49
  case "PM_REDEEM_HOSTED_WALLET_SEAMS_SESSION":
49
50
  case "PM_REGISTER_WALLET":
50
51
  case "PM_UNLOCK":
@@ -2,6 +2,7 @@ import { isPlainObject } from "../../../shared-ts/src/utils/validation.js";
2
2
  import { parseWalletAuthMethodId, parseWalletId } from "../../../shared-ts/src/utils/domainIds.js";
3
3
  import { parseWalletSessionHome } from "../../../shared-ts/src/device-linking/activeWalletSession.js";
4
4
  import { walletIframeRequestIdFromBoundary } from "../../../core/types/walletIframeIdentity.js";
5
+ import { emptyWalletAlternatives, parseWalletAlternatives } from "./walletAlternatives.js";
5
6
  //#region src/SeamsWeb/walletIframe/shared/messages.ts
6
7
  const WALLET_IFRAME_SURFACE_MEASUREMENT_MAX_CSS_PX = 4096;
7
8
  const HOSTED_AUTH_MENU_ERROR_EVENT = "seams:hosted-auth-menu-error";
@@ -209,7 +210,8 @@ function parseHostedAuthMenuOpenRequest(value) {
209
210
  "showRegistrationInput",
210
211
  "showProgress",
211
212
  "copy",
212
- "enabledExternalProviders"
213
+ "enabledExternalProviders",
214
+ "walletAlternatives"
213
215
  ]) || !hasOnlyHostedAuthMenuCopyKeys(record.copy)) return null;
214
216
  const authMenuSessionId = hostedAuthMenuSessionIdFromBoundary(record.authMenuSessionId);
215
217
  const initialMode = parseAuthMenuMode(record.initialMode);
@@ -226,7 +228,8 @@ function parseHostedAuthMenuOpenRequest(value) {
226
228
  } : null;
227
229
  const registrationAccountInput = parseRegistrationAccountInput(record.registrationAccountInput);
228
230
  const providers = parseExternalProviders(record.enabledExternalProviders);
229
- if (!authMenuSessionId || !initialMode || !loginTarget || !registrationAccountInput || typeof record.showRegistrationInput !== "boolean" || typeof record.showProgress !== "boolean" || !providers || !isWireSerializable(record.copy, /* @__PURE__ */ new Set(), true)) return null;
231
+ const walletAlternatives = record.walletAlternatives === void 0 ? emptyWalletAlternatives() : parseWalletAlternatives(record.walletAlternatives);
232
+ if (!authMenuSessionId || !initialMode || !loginTarget || !registrationAccountInput || typeof record.showRegistrationInput !== "boolean" || typeof record.showProgress !== "boolean" || !providers || !walletAlternatives || !isWireSerializable(record.copy, /* @__PURE__ */ new Set(), true)) return null;
230
233
  return {
231
234
  kind: "hosted_auth_menu_open_v1",
232
235
  authMenuSessionId,
@@ -237,7 +240,8 @@ function parseHostedAuthMenuOpenRequest(value) {
237
240
  showRegistrationInput: record.showRegistrationInput,
238
241
  showProgress: record.showProgress,
239
242
  copy: normalizeHostedAuthMenuCopy(record.copy),
240
- enabledExternalProviders: providers
243
+ enabledExternalProviders: providers,
244
+ walletAlternatives
241
245
  };
242
246
  }
243
247
  function buildHostedAuthMenuOpenRequest(args) {
@@ -252,7 +256,8 @@ function buildHostedAuthMenuOpenRequest(args) {
252
256
  "showRegistrationInput",
253
257
  "showProgress",
254
258
  "copy",
255
- "enabledExternalProviders"
259
+ "enabledExternalProviders",
260
+ "walletAlternatives"
256
261
  ]) || args.copy !== void 0 && !hasOnlyHostedAuthMenuCopyKeys(args.copy)) throw new Error("Hosted auth-menu open configuration contains unsupported fields");
257
262
  const parsedSessionId = hostedAuthMenuSessionIdFromBoundary(args.authMenuSessionId);
258
263
  if (!parsedSessionId) throw new Error("authMenuSessionId must be a non-empty string");
@@ -266,7 +271,8 @@ function buildHostedAuthMenuOpenRequest(args) {
266
271
  showRegistrationInput: args.showRegistrationInput ?? false,
267
272
  showProgress: args.showProgress ?? false,
268
273
  copy: normalizeHostedAuthMenuCopy(args.copy),
269
- enabledExternalProviders: [...args.enabledExternalProviders ?? []]
274
+ enabledExternalProviders: [...args.enabledExternalProviders ?? []],
275
+ walletAlternatives: args.walletAlternatives ?? emptyWalletAlternatives()
270
276
  };
271
277
  if (!parseHostedAuthMenuOpenRequest(request)) throw new Error("Hosted auth-menu open request is invalid");
272
278
  return Object.freeze(request);
@@ -425,6 +431,14 @@ function parseHostedAuthMenuOutcome(value) {
425
431
  method
426
432
  } : null;
427
433
  }
434
+ case "wallet_connected": {
435
+ const alternativeId = boundaryString(record.alternativeId, "alternativeId");
436
+ return alternativeId ? {
437
+ kind: "wallet_connected",
438
+ authMenuSessionId,
439
+ alternativeId
440
+ } : null;
441
+ }
428
442
  case "account_synced": {
429
443
  if (!hasOnlyKeys(record, [
430
444
  "kind",
@@ -470,7 +484,7 @@ function parseHostedAuthMenuOutcome(value) {
470
484
  default: return null;
471
485
  }
472
486
  }
473
- const WALLET_PROTOCOL_VERSION = "19.0.0";
487
+ const WALLET_PROTOCOL_VERSION = "20.0.0";
474
488
  const WALLET_IFRAME_PROTOCOL_VERSION_MISMATCH = "WALLET_IFRAME_PROTOCOL_VERSION_MISMATCH";
475
489
  const HOSTED_WALLET_REDEMPTION_PAYLOAD_FIELDS = [
476
490
  "home",