@tatchi-xyz/sdk 0.31.0 → 0.32.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 (197) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js +2 -2
  3. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  4. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  5. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  6. package/dist/cjs/core/TatchiPasskey/login.js +1 -1
  7. package/dist/cjs/core/TatchiPasskey/login.js.map +1 -1
  8. package/dist/cjs/core/TatchiPasskey/registration.js +107 -63
  9. package/dist/cjs/core/TatchiPasskey/registration.js.map +1 -1
  10. package/dist/cjs/core/WalletIframe/client/on-events-progress-bus.js +1 -1
  11. package/dist/cjs/core/WalletIframe/client/on-events-progress-bus.js.map +1 -1
  12. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  13. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  14. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  15. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  16. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  17. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  18. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  19. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  20. package/dist/cjs/core/WebAuthnManager/index.js +3 -3
  21. package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
  22. package/dist/cjs/core/defaultConfigs.js +3 -1
  23. package/dist/cjs/core/defaultConfigs.js.map +1 -1
  24. package/dist/cjs/core/types/sdkSentEvents.js +3 -2
  25. package/dist/cjs/core/types/sdkSentEvents.js.map +1 -1
  26. package/dist/cjs/react/components/AccountMenuButton/TransactionSettingsSection.js +3 -3
  27. package/dist/cjs/react/components/AccountMenuButton/TransactionSettingsSection.js.map +1 -1
  28. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-CRlobBrN.css → PasskeyAuthMenu-D2eRb2-S.css} +3 -1
  29. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2eRb2-S.css.map +1 -0
  30. package/dist/cjs/react/components/PasskeyAuthMenu/preload.js +1 -1
  31. package/dist/cjs/react/components/PasskeyAuthMenu/preload.js.map +1 -1
  32. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js +52 -13
  33. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  34. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js +4 -2
  35. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  36. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +5 -1
  37. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  38. package/dist/cjs/react/context/useTatchiWithSdkFlow.js +1 -1
  39. package/dist/cjs/react/context/useTatchiWithSdkFlow.js.map +1 -1
  40. package/dist/cjs/react/index.js +1 -1
  41. package/dist/cjs/react/src/core/IndexedDBManager/passkeyClientDB.js +2 -2
  42. package/dist/cjs/react/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  43. package/dist/cjs/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  44. package/dist/cjs/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  45. package/dist/cjs/react/src/core/TatchiPasskey/login.js +1 -1
  46. package/dist/cjs/react/src/core/TatchiPasskey/login.js.map +1 -1
  47. package/dist/cjs/react/src/core/TatchiPasskey/registration.js +107 -63
  48. package/dist/cjs/react/src/core/TatchiPasskey/registration.js.map +1 -1
  49. package/dist/cjs/react/src/core/WalletIframe/client/on-events-progress-bus.js +1 -1
  50. package/dist/cjs/react/src/core/WalletIframe/client/on-events-progress-bus.js.map +1 -1
  51. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  52. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  53. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  54. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  55. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  56. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  57. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  58. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  59. package/dist/cjs/react/src/core/WebAuthnManager/index.js +3 -3
  60. package/dist/cjs/react/src/core/WebAuthnManager/index.js.map +1 -1
  61. package/dist/cjs/react/src/core/defaultConfigs.js +3 -1
  62. package/dist/cjs/react/src/core/defaultConfigs.js.map +1 -1
  63. package/dist/cjs/react/src/core/types/sdkSentEvents.js +3 -2
  64. package/dist/cjs/react/src/core/types/sdkSentEvents.js.map +1 -1
  65. package/dist/cjs/server/core/AuthService.js +49 -6
  66. package/dist/cjs/server/core/AuthService.js.map +1 -1
  67. package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
  68. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js +2 -2
  69. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  70. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  71. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  72. package/dist/esm/core/TatchiPasskey/login.js +1 -1
  73. package/dist/esm/core/TatchiPasskey/login.js.map +1 -1
  74. package/dist/esm/core/TatchiPasskey/registration.js +107 -63
  75. package/dist/esm/core/TatchiPasskey/registration.js.map +1 -1
  76. package/dist/esm/core/WalletIframe/client/on-events-progress-bus.js +1 -1
  77. package/dist/esm/core/WalletIframe/client/on-events-progress-bus.js.map +1 -1
  78. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  79. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  80. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  81. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  82. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  83. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  84. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  85. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  86. package/dist/esm/core/WebAuthnManager/index.js +3 -3
  87. package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
  88. package/dist/esm/core/defaultConfigs.js +3 -1
  89. package/dist/esm/core/defaultConfigs.js.map +1 -1
  90. package/dist/esm/core/types/sdkSentEvents.js +3 -2
  91. package/dist/esm/core/types/sdkSentEvents.js.map +1 -1
  92. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js +3 -3
  93. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js.map +1 -1
  94. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-D2VHZ04W.css → PasskeyAuthMenu-qTHAv58Z.css} +3 -1
  95. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-qTHAv58Z.css.map +1 -0
  96. package/dist/esm/react/components/PasskeyAuthMenu/preload.js +1 -1
  97. package/dist/esm/react/components/PasskeyAuthMenu/preload.js.map +1 -1
  98. package/dist/esm/react/components/PasskeyAuthMenu/shell.js +52 -13
  99. package/dist/esm/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  100. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js +4 -2
  101. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  102. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +5 -1
  103. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  104. package/dist/esm/react/context/useTatchiWithSdkFlow.js +1 -1
  105. package/dist/esm/react/context/useTatchiWithSdkFlow.js.map +1 -1
  106. package/dist/esm/react/index.js +1 -1
  107. package/dist/esm/react/src/core/IndexedDBManager/passkeyClientDB.js +2 -2
  108. package/dist/esm/react/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  109. package/dist/esm/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  110. package/dist/esm/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  111. package/dist/esm/react/src/core/TatchiPasskey/login.js +1 -1
  112. package/dist/esm/react/src/core/TatchiPasskey/login.js.map +1 -1
  113. package/dist/esm/react/src/core/TatchiPasskey/registration.js +107 -63
  114. package/dist/esm/react/src/core/TatchiPasskey/registration.js.map +1 -1
  115. package/dist/esm/react/src/core/WalletIframe/client/on-events-progress-bus.js +1 -1
  116. package/dist/esm/react/src/core/WalletIframe/client/on-events-progress-bus.js.map +1 -1
  117. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  118. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  119. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  120. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  121. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  122. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  123. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  124. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  125. package/dist/esm/react/src/core/WebAuthnManager/index.js +3 -3
  126. package/dist/esm/react/src/core/WebAuthnManager/index.js.map +1 -1
  127. package/dist/esm/react/src/core/defaultConfigs.js +3 -1
  128. package/dist/esm/react/src/core/defaultConfigs.js.map +1 -1
  129. package/dist/esm/react/src/core/types/sdkSentEvents.js +3 -2
  130. package/dist/esm/react/src/core/types/sdkSentEvents.js.map +1 -1
  131. package/dist/esm/react/styles/styles.css +2 -0
  132. package/dist/esm/sdk/{EmailRecovery-Dl8b4ONg.js → EmailRecovery-Y7rurd4B.js} +3 -3
  133. package/dist/esm/sdk/{EmailRecovery-v9oNO2Tc.js → EmailRecovery-lsjLWApQ.js} +1 -1
  134. package/dist/esm/sdk/{IndexedDBManager-B1cUvdyY.js → IndexedDBManager-CmdN7smS.js} +3 -3
  135. package/dist/esm/sdk/{createAdapters-Dv7ZJPf1.js → createAdapters-4c8mBiD5.js} +2 -11
  136. package/dist/esm/sdk/{createAdapters-Dv7ZJPf1.js.map → createAdapters-4c8mBiD5.js.map} +1 -1
  137. package/dist/esm/sdk/{createAdapters-1Hmc1vVC.js → createAdapters-DF32SIZa.js} +1 -10
  138. package/dist/esm/sdk/{defaultConfigs-BmCU1_qI.js → defaultConfigs-BQqiXif-.js} +3 -1
  139. package/dist/esm/sdk/{delegateAction-DdkvFFKA.js → delegateAction-Bq5zkOvn.js} +1 -1
  140. package/dist/esm/sdk/{emailRecovery-4J-g9tlY.js → emailRecovery-B1hbE_sM.js} +6 -6
  141. package/dist/esm/sdk/{getDeviceNumber-f8bfPB9U.js → getDeviceNumber-WiNzKx1x.js} +4 -2
  142. package/dist/esm/sdk/{getDeviceNumber-f8bfPB9U.js.map → getDeviceNumber-WiNzKx1x.js.map} +1 -1
  143. package/dist/esm/sdk/{linkDevice-C98klpcE.js → linkDevice-CRPf5aW2.js} +5 -5
  144. package/dist/esm/sdk/{localOnly-40zxrBMm.js → localOnly-COpDBMkm.js} +2 -2
  145. package/dist/esm/sdk/{localOnly-40zxrBMm.js.map → localOnly-COpDBMkm.js.map} +1 -1
  146. package/dist/esm/sdk/{localOnly-BZPBj14l.js → localOnly-DQQuqgjJ.js} +1 -1
  147. package/dist/esm/sdk/{login-DnROv3eA.js → login-DUIWZHp_.js} +4 -4
  148. package/dist/esm/sdk/offline-export-app.js +32 -21
  149. package/dist/esm/sdk/offline-export-app.js.map +1 -1
  150. package/dist/esm/sdk/{registration-BP9M3tE1.js → registration-BR2G9tz_.js} +59 -68
  151. package/dist/esm/sdk/{registration-MrAOC8Ub.js → registration-R70lvG_o.js} +60 -69
  152. package/dist/esm/sdk/registration-R70lvG_o.js.map +1 -0
  153. package/dist/esm/sdk/{relay-Dq9D7fhG.js → relay-BCEyWFew.js} +1 -1
  154. package/dist/esm/sdk/{router-BEGGuWaB.js → router-Cj2WexK-.js} +3 -3
  155. package/dist/esm/sdk/{rpcCalls-CMzj_Va_.js → rpcCalls-C1sp-Epo.js} +3 -3
  156. package/dist/esm/sdk/{rpcCalls-B44MZora.js → rpcCalls-VL4loDKP.js} +2 -2
  157. package/dist/esm/sdk/{scanDevice-Cp-r-Z2T.js → scanDevice-C0HcnZym.js} +5 -5
  158. package/dist/esm/sdk/{sdkSentEvents-CzAZBFjP.js → sdkSentEvents-BfkcI7EN.js} +3 -2
  159. package/dist/esm/sdk/{signNEP413-DsyWH_Jo.js → signNEP413-lj0swHsD.js} +1 -1
  160. package/dist/esm/sdk/{syncAccount-CqWCmBVb.js → syncAccount-DnQ9AstS.js} +5 -5
  161. package/dist/esm/sdk/{syncAccount-Dt5jJbEB.js → syncAccount-xh81Vppo.js} +3 -3
  162. package/dist/esm/sdk/{transactions-DAZrPW-6.js → transactions-Cg1TIUyK.js} +76 -77
  163. package/dist/esm/sdk/{transactions-CrjP8yPD.js → transactions-CxsklyCK.js} +77 -78
  164. package/dist/esm/sdk/transactions-CxsklyCK.js.map +1 -0
  165. package/dist/esm/sdk/wallet-iframe-host.js +160 -105
  166. package/dist/esm/server/core/AuthService.js +49 -6
  167. package/dist/esm/server/core/AuthService.js.map +1 -1
  168. package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
  169. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  170. package/dist/types/src/__tests__/setup/bootstrap.d.ts.map +1 -1
  171. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts +1 -1
  172. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts.map +1 -1
  173. package/dist/types/src/core/TatchiPasskey/faucets/createAccountRelayServer.d.ts +6 -6
  174. package/dist/types/src/core/TatchiPasskey/faucets/createAccountRelayServer.d.ts.map +1 -1
  175. package/dist/types/src/core/TatchiPasskey/registration.d.ts.map +1 -1
  176. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.d.ts +0 -5
  177. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.d.ts.map +1 -1
  178. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.d.ts.map +1 -1
  179. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.d.ts.map +1 -1
  180. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.d.ts.map +1 -1
  181. package/dist/types/src/core/WebAuthnManager/index.d.ts +1 -1
  182. package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
  183. package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
  184. package/dist/types/src/core/types/sdkSentEvents.d.ts +18 -7
  185. package/dist/types/src/core/types/sdkSentEvents.d.ts.map +1 -1
  186. package/dist/types/src/react/components/PasskeyAuthMenu/preload.d.ts.map +1 -1
  187. package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts.map +1 -1
  188. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts +1 -1
  189. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts.map +1 -1
  190. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  191. package/dist/types/src/server/core/AuthService.d.ts.map +1 -1
  192. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  193. package/package.json +4 -4
  194. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-CRlobBrN.css.map +0 -1
  195. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2VHZ04W.css.map +0 -1
  196. package/dist/esm/sdk/registration-MrAOC8Ub.js.map +0 -1
  197. package/dist/esm/sdk/transactions-CrjP8yPD.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sdkSentEvents.js","names":[],"sources":["../../../../src/core/types/sdkSentEvents.ts"],"sourcesContent":["import type { TxExecutionStatus } from '@near-js/types';\nimport type { ConfirmationConfig, SignerMode, ThresholdBehavior } from './signer-worker';\nimport type {\n ActionResult,\n DelegateRelayResult,\n LoginAndCreateSessionResult,\n LoginResult,\n RegistrationResult,\n SignAndSendDelegateActionResult,\n SignDelegateActionResult,\n SignTransactionResult,\n} from './tatchi';\nimport type { SyncAccountResult, SignNEP413MessageResult } from '../TatchiPasskey';\n\n//////////////////////////\n// Progress Events Enums\n//////////////////////////\n\n// Registration Enums\nexport enum RegistrationPhase {\n STEP_1_WEBAUTHN_VERIFICATION = 'webauthn-verification',\n STEP_2_KEY_GENERATION = 'key-generation',\n STEP_3_CONTRACT_PRE_CHECK = 'contract-pre-check',\n STEP_4_ACCESS_KEY_ADDITION = 'access-key-addition',\n STEP_5_CONTRACT_REGISTRATION = 'contract-registration',\n STEP_6_ACCOUNT_VERIFICATION = 'account-verification',\n STEP_7_DATABASE_STORAGE = 'database-storage',\n STEP_8_REGISTRATION_COMPLETE = 'registration-complete',\n REGISTRATION_ERROR = 'error',\n}\nexport enum RegistrationStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Login Enums\nexport enum LoginPhase {\n STEP_1_PREPARATION = 'preparation',\n STEP_2_WEBAUTHN_ASSERTION = 'webauthn-assertion',\n STEP_3_VRF_UNLOCK = 'vrf-unlock',\n STEP_4_LOGIN_COMPLETE = 'login-complete',\n LOGIN_ERROR = 'login-error',\n}\nexport enum LoginStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Action Enums\nexport enum ActionPhase {\n STEP_1_PREPARATION = 'preparation', // Rust WASM worker phase: Preparation = 100\n STEP_2_USER_CONFIRMATION = 'user-confirmation', // Rust WASM worker phase: UserConfirmation = 101\n STEP_3_WEBAUTHN_AUTHENTICATION = 'webauthn-authentication', // Rust WASM worker phase: WebauthnAuthentication = 102\n STEP_4_AUTHENTICATION_COMPLETE = 'authentication-complete', // Rust WASM worker phase: AuthenticationComplete = 103\n STEP_5_TRANSACTION_SIGNING_PROGRESS = 'transaction-signing-progress', // Rust WASM worker phase: TransactionSigningProgress = 104\n STEP_6_TRANSACTION_SIGNING_COMPLETE = 'transaction-signing-complete', // Rust WASM worker phase: TransactionSigningComplete = 105\n WASM_ERROR = 'wasm-error', // Rust WASM worker phase: Error = 106\n STEP_7_BROADCASTING = 'broadcasting',\n STEP_8_ACTION_COMPLETE = 'action-complete',\n ACTION_ERROR = 'action-error',\n}\nexport enum ActionStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Delegate-specific phase alias for filtering\nexport { ActionPhase as DelegateActionPhase };\n\n// Account Sync Enums\nexport enum SyncAccountPhase {\n STEP_1_PREPARATION = 'preparation',\n STEP_2_WEBAUTHN_AUTHENTICATION = 'webauthn-authentication',\n STEP_3_SYNC_AUTHENTICATORS_ONCHAIN = 'sync-authenticators-onchain',\n STEP_4_AUTHENTICATOR_SAVED = 'authenticator-saved',\n STEP_5_SYNC_ACCOUNT_COMPLETE = 'sync-account-complete',\n ERROR = 'error',\n}\nexport enum SyncAccountStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Device Linking Enums\nexport enum DeviceLinkingPhase {\n STEP_1_QR_CODE_GENERATED = 'qr-code-generated', // Device2: QR code created and displayed\n STEP_2_SCANNING = 'scanning', // Device1: Scanning QR code\n STEP_3_AUTHORIZATION = 'authorization', // Device1: TouchID authorization\n STEP_4_POLLING = 'polling', // Device2: Polling contract for mapping\n STEP_5_ADDKEY_DETECTED = 'addkey-detected', // Device2: AddKey transaction detected\n STEP_6_REGISTRATION = 'registration', // Device2: Registration and credential storage\n STEP_7_LINKING_COMPLETE = 'linking-complete', // Final completion\n STEP_8_AUTO_LOGIN = 'auto-login', // Auto-login after registration\n IDLE = 'idle', // Idle state\n REGISTRATION_ERROR = 'registration-error', // Error during registration\n LOGIN_ERROR = 'login-error', // Error during login\n DEVICE_LINKING_ERROR = 'error', // General error state\n}\nexport enum DeviceLinkingStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Email Recovery Enums\nexport enum EmailRecoveryPhase {\n STEP_1_PREPARATION = 'email-recovery-preparation',\n STEP_2_TOUCH_ID_REGISTRATION = 'email-recovery-touch-id-registration',\n STEP_3_AWAIT_EMAIL = 'email-recovery-await-email',\n STEP_4_POLLING_ADD_KEY = 'email-recovery-polling-add-key',\n STEP_4_POLLING_VERIFICATION_RESULT = 'email-recovery-polling-add-key',\n STEP_5_FINALIZING_REGISTRATION = 'email-recovery-finalizing-registration',\n STEP_6_COMPLETE = 'email-recovery-complete',\n ERROR = 'email-recovery-error',\n RESUMED_FROM_PENDING = 'email-recovery-resumed-from-pending',\n}\nexport enum EmailRecoveryStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Base event callback type\nexport type EventCallback<T> = (event: T) => void;\n\n// Users can still supply a single implementation: (success: boolean, result?: T) => ...\nexport interface AfterCall<T> {\n (success: true, result: T): void | Promise<void>;\n (success: false): void | Promise<void>;\n}\n\n// Base SSE Event Types (unified for Registration and Actions)\nexport interface BaseSSEEvent {\n step: number;\n phase: RegistrationPhase | LoginPhase | ActionPhase | DeviceLinkingPhase | SyncAccountPhase | EmailRecoveryPhase;\n status: RegistrationStatus | LoginStatus | ActionStatus | DeviceLinkingStatus | SyncAccountStatus | EmailRecoveryStatus;\n message: string;\n}\n\n// Registration-specific events\nexport interface BaseRegistrationSSEEvent extends BaseSSEEvent {\n phase: RegistrationPhase;\n status: RegistrationStatus;\n}\n\n// Action-specific events\nexport interface BaseActionSSEEvent extends BaseSSEEvent {\n phase: ActionPhase;\n status: ActionStatus;\n}\n\n// Login-specific events\nexport interface BaseLoginSSEEvent extends BaseSSEEvent {\n phase: LoginPhase;\n status: LoginStatus;\n}\n\nexport interface BaseDeviceLinkingSSEEvent extends BaseSSEEvent {\n phase: DeviceLinkingPhase;\n status: DeviceLinkingStatus;\n}\n\n// Action-specific events\nexport interface BaseSyncAccountEvent extends BaseSSEEvent {\n phase: SyncAccountPhase;\n status: SyncAccountStatus;\n}\n\nexport interface BaseEmailRecoveryEvent extends BaseSSEEvent {\n phase: EmailRecoveryPhase;\n status: EmailRecoveryStatus;\n}\n\n// Progress Events\nexport interface onProgressEvents extends BaseActionSSEEvent {\n step: number;\n status: ActionStatus;\n message: string;\n // Generic metadata bag for progress payloads\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\n// Optional, phase-specific data shapes used where we can commit to fields\n// Intentionally keep progress payloads generic to avoid duplicating\n// worker-side data shapes. Concrete fields can be added in future PRs\n// by normalizing worker payloads in one place.\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Registration Event Types\n/////////////////////////////////////////////\n\nexport interface RegistrationEventStep1 extends BaseRegistrationSSEEvent {\n step: 1;\n phase: RegistrationPhase.STEP_1_WEBAUTHN_VERIFICATION;\n}\n\nexport interface RegistrationEventStep2 extends BaseRegistrationSSEEvent {\n step: 2;\n phase: RegistrationPhase.STEP_2_KEY_GENERATION;\n status: RegistrationStatus.SUCCESS;\n verified: boolean;\n nearAccountId: string;\n nearPublicKey: string | null | undefined;\n vrfPublicKey: string | null | undefined;\n}\n\n// Optional progress emission during step 2 (e.g., concurrent contract pre-checks)\nexport interface RegistrationEventStep2Progress extends BaseRegistrationSSEEvent {\n step: 2;\n phase: RegistrationPhase.STEP_2_KEY_GENERATION;\n status: RegistrationStatus.PROGRESS;\n}\n\nexport interface RegistrationEventStep3 extends BaseRegistrationSSEEvent {\n step: 3;\n phase: RegistrationPhase.STEP_3_CONTRACT_PRE_CHECK;\n error?: string;\n}\n\nexport interface RegistrationEventStep4 extends BaseRegistrationSSEEvent {\n step: 4;\n phase: RegistrationPhase.STEP_4_ACCESS_KEY_ADDITION;\n error?: string;\n}\n\nexport interface RegistrationEventStep5 extends BaseRegistrationSSEEvent {\n step: 5;\n phase: RegistrationPhase.STEP_5_CONTRACT_REGISTRATION;\n error?: string;\n}\n\nexport interface RegistrationEventStep6 extends BaseRegistrationSSEEvent {\n step: 6;\n phase: RegistrationPhase.STEP_6_ACCOUNT_VERIFICATION;\n error?: string;\n}\n\nexport interface RegistrationEventStep7 extends BaseRegistrationSSEEvent {\n step: 7;\n phase: RegistrationPhase.STEP_7_DATABASE_STORAGE;\n error?: string;\n}\n\nexport interface RegistrationEventStep8 extends BaseRegistrationSSEEvent {\n step: 8;\n phase: RegistrationPhase.STEP_8_REGISTRATION_COMPLETE;\n status: RegistrationStatus.SUCCESS;\n}\n\nexport interface RegistrationEventStep0 extends BaseRegistrationSSEEvent {\n step: 0;\n phase: RegistrationPhase.REGISTRATION_ERROR;\n status: RegistrationStatus.ERROR;\n error: string;\n}\n\nexport type RegistrationSSEEvent =\n | RegistrationEventStep1\n | RegistrationEventStep2Progress\n | RegistrationEventStep2\n | RegistrationEventStep3\n | RegistrationEventStep4\n | RegistrationEventStep5\n | RegistrationEventStep6\n | RegistrationEventStep7\n | RegistrationEventStep8\n | RegistrationEventStep0;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Login Event Types\n/////////////////////////////////////////////\n\nexport interface LoginSSEventStep1 extends BaseLoginSSEEvent {\n step: 1;\n phase: LoginPhase.STEP_1_PREPARATION;\n}\n\nexport interface LoginSSEventStep2 extends BaseLoginSSEEvent {\n step: 2;\n phase: LoginPhase.STEP_2_WEBAUTHN_ASSERTION;\n}\n\nexport interface LoginSSEventStep3 extends BaseLoginSSEEvent {\n step: 3;\n phase: LoginPhase.STEP_3_VRF_UNLOCK;\n}\n\nexport interface LoginSSEventStep4 extends BaseLoginSSEEvent {\n step: 4;\n phase: LoginPhase.STEP_4_LOGIN_COMPLETE;\n status: LoginStatus.SUCCESS;\n nearAccountId: string;\n clientNearPublicKey: string;\n}\n\nexport interface LoginSSEventStep0 extends BaseLoginSSEEvent {\n step: 0;\n phase: LoginPhase.LOGIN_ERROR;\n status: LoginStatus.ERROR;\n error: string;\n}\n\nexport type LoginSSEvent =\n | LoginSSEventStep1\n | LoginSSEventStep2\n | LoginSSEventStep3\n | LoginSSEventStep4\n | LoginSSEventStep0;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Action Event Types\n/////////////////////////////////////////////\n\nexport interface ActionEventStep1 extends BaseActionSSEEvent {\n step: 1;\n phase: ActionPhase.STEP_1_PREPARATION;\n}\n\nexport interface ActionEventStep2 extends BaseActionSSEEvent {\n step: 2;\n phase: ActionPhase.STEP_2_USER_CONFIRMATION;\n}\n\nexport interface ActionEventStep3 extends BaseActionSSEEvent {\n step: 3;\n phase: ActionPhase.STEP_3_WEBAUTHN_AUTHENTICATION;\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\nexport interface ActionEventStep4 extends BaseActionSSEEvent {\n step: 4;\n phase: ActionPhase.STEP_4_AUTHENTICATION_COMPLETE;\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\nexport interface ActionEventStep5 extends BaseActionSSEEvent {\n step: 5;\n phase: ActionPhase.STEP_5_TRANSACTION_SIGNING_PROGRESS;\n data?: Record<string, unknown>;\n}\n\nexport interface ActionEventStep6 extends BaseActionSSEEvent {\n step: 6;\n phase: ActionPhase.STEP_6_TRANSACTION_SIGNING_COMPLETE;\n status: ActionStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface ActionEventStep7 extends BaseActionSSEEvent {\n step: 7;\n phase: ActionPhase.STEP_7_BROADCASTING;\n}\n\nexport interface ActionEventStep8 extends BaseActionSSEEvent {\n step: 8;\n phase: ActionPhase.STEP_8_ACTION_COMPLETE;\n status: ActionStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface ActionEventError extends BaseActionSSEEvent {\n step: 0;\n phase: ActionPhase.ACTION_ERROR;\n status: ActionStatus.ERROR;\n error: string;\n}\n\nexport interface ActionEventWasmError extends BaseActionSSEEvent {\n step: 0;\n phase: ActionPhase.WASM_ERROR;\n status: ActionStatus.ERROR;\n error: string;\n}\n\nexport type ActionSSEEvent =\n | ActionEventStep1\n | ActionEventStep2\n | ActionEventStep3\n | ActionEventStep4\n | ActionEventStep5\n | ActionEventStep6\n | ActionEventStep7\n | ActionEventStep8\n | ActionEventError\n | ActionEventWasmError;\n\nexport type DelegateActionSSEEvent = ActionSSEEvent;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Device Linking Event Types\n/////////////////////////////////////////////\n\nexport interface DeviceLinkingEventStep1 extends BaseDeviceLinkingSSEEvent {\n step: 1;\n phase: DeviceLinkingPhase.STEP_1_QR_CODE_GENERATED;\n}\n\nexport interface DeviceLinkingEventStep2 extends BaseDeviceLinkingSSEEvent {\n step: 2;\n phase: DeviceLinkingPhase.STEP_2_SCANNING;\n}\n\nexport interface DeviceLinkingEventStep3 extends BaseDeviceLinkingSSEEvent {\n step: 3;\n phase: DeviceLinkingPhase.STEP_3_AUTHORIZATION;\n}\n\nexport interface DeviceLinkingEventStep4 extends BaseDeviceLinkingSSEEvent {\n step: 4;\n phase: DeviceLinkingPhase.STEP_4_POLLING;\n}\n\nexport interface DeviceLinkingEventStep5 extends BaseDeviceLinkingSSEEvent {\n step: 5;\n phase: DeviceLinkingPhase.STEP_5_ADDKEY_DETECTED;\n}\n\nexport interface DeviceLinkingEventStep6 extends BaseDeviceLinkingSSEEvent {\n step: 6;\n phase: DeviceLinkingPhase.STEP_6_REGISTRATION;\n}\n\nexport interface DeviceLinkingEventStep7 extends BaseDeviceLinkingSSEEvent {\n step: 7;\n phase: DeviceLinkingPhase.STEP_7_LINKING_COMPLETE;\n}\n\nexport interface DeviceLinkingEventStep8 extends BaseDeviceLinkingSSEEvent {\n step: 8;\n phase: DeviceLinkingPhase.STEP_8_AUTO_LOGIN;\n}\n\nexport interface DeviceLinkingErrorEvent extends BaseDeviceLinkingSSEEvent {\n step: 0;\n phase: DeviceLinkingPhase.DEVICE_LINKING_ERROR\n | DeviceLinkingPhase.LOGIN_ERROR\n | DeviceLinkingPhase.REGISTRATION_ERROR;\n status: DeviceLinkingStatus.ERROR;\n error: string;\n}\n\nexport type DeviceLinkingSSEEvent =\n | DeviceLinkingEventStep1\n | DeviceLinkingEventStep2\n | DeviceLinkingEventStep3\n | DeviceLinkingEventStep4\n | DeviceLinkingEventStep5\n | DeviceLinkingEventStep6\n | DeviceLinkingEventStep7\n | DeviceLinkingEventStep8\n | DeviceLinkingErrorEvent;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Account Sync Event Types\n/////////////////////////////////////////////\n\nexport interface SyncAccountEventStep1 extends BaseSyncAccountEvent {\n step: 1;\n phase: SyncAccountPhase.STEP_1_PREPARATION;\n}\n\nexport interface SyncAccountEventStep2 extends BaseSyncAccountEvent {\n step: 2;\n phase: SyncAccountPhase.STEP_2_WEBAUTHN_AUTHENTICATION;\n}\n\nexport interface SyncAccountEventStep3 extends BaseSyncAccountEvent {\n step: 3;\n phase: SyncAccountPhase.STEP_3_SYNC_AUTHENTICATORS_ONCHAIN;\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\nexport interface SyncAccountEventStep4 extends BaseSyncAccountEvent {\n step: 4;\n phase: SyncAccountPhase.STEP_4_AUTHENTICATOR_SAVED;\n status: SyncAccountStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface SyncAccountEventStep5 extends BaseSyncAccountEvent {\n step: 5;\n phase: SyncAccountPhase.STEP_5_SYNC_ACCOUNT_COMPLETE;\n status: SyncAccountStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface SyncAccountError extends BaseSyncAccountEvent {\n step: 0;\n phase: SyncAccountPhase.ERROR;\n status: SyncAccountStatus.ERROR;\n error: string;\n}\n\nexport type SyncAccountSSEEvent =\n | SyncAccountEventStep1\n | SyncAccountEventStep2\n | SyncAccountEventStep3\n | SyncAccountEventStep4\n | SyncAccountEventStep5\n | SyncAccountError;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Email Recovery Event Types\n/////////////////////////////////////////////\n\nexport interface EmailRecoveryEventStep1 extends BaseEmailRecoveryEvent {\n step: 1;\n phase: EmailRecoveryPhase.STEP_1_PREPARATION;\n}\n\nexport interface EmailRecoveryEventStep2 extends BaseEmailRecoveryEvent {\n step: 2;\n phase: EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;\n}\n\nexport interface EmailRecoveryEventStep3 extends BaseEmailRecoveryEvent {\n step: 3;\n phase: EmailRecoveryPhase.STEP_3_AWAIT_EMAIL;\n}\n\nexport interface EmailRecoveryEventStep4 extends BaseEmailRecoveryEvent {\n step: 4;\n phase: EmailRecoveryPhase.STEP_4_POLLING_ADD_KEY | EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;\n data?: {\n accountId?: string;\n requestId?: string;\n nearPublicKey?: string;\n elapsedMs?: number;\n pollCount?: number;\n [key: string]: unknown;\n };\n logs?: string[];\n}\n\nexport interface EmailRecoveryEventStep5 extends BaseEmailRecoveryEvent {\n step: 5;\n phase: EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailRecoveryEventStep6 extends BaseEmailRecoveryEvent {\n step: 6;\n phase: EmailRecoveryPhase.STEP_6_COMPLETE;\n status: EmailRecoveryStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailRecoveryEventResumedFromPending extends BaseEmailRecoveryEvent {\n step: 0;\n phase: EmailRecoveryPhase.RESUMED_FROM_PENDING;\n status: EmailRecoveryStatus.PROGRESS;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailRecoveryErrorEvent extends BaseEmailRecoveryEvent {\n step: 0;\n phase: EmailRecoveryPhase.ERROR;\n status: EmailRecoveryStatus.ERROR;\n error: string;\n}\n\nexport type EmailRecoverySSEEvent =\n | EmailRecoveryEventStep1\n | EmailRecoveryEventStep2\n | EmailRecoveryEventStep3\n | EmailRecoveryEventStep4\n | EmailRecoveryEventStep5\n | EmailRecoveryEventStep6\n | EmailRecoveryEventResumedFromPending\n | EmailRecoveryErrorEvent;\n\n//////////////////////////////////\n/// Hooks Options\n//////////////////////////////////\n\n// Function Options\nexport interface RegistrationHooksOptions {\n onEvent?: EventCallback<RegistrationSSEEvent>;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<RegistrationResult>;\n /**\n * Optional: registration signing policy.\n * - `{ mode: 'local-signer' }`: derive and store an encrypted local NEAR secret key (v3 vault).\n * - `{ mode: 'threshold-signer' }`: derive the local key AND enroll a threshold Ed25519 (2-of-2) access key\n * during registration (relay adds the threshold public key on-chain and returns relayerKeyId).\n *\n * Defaults to `{ mode: 'local-signer' }` for backwards compatibility in public APIs.\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration. When provided, overrides user preferences\n // for this request only (not persisted).\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface LoginHooksOptions {\n onEvent?: EventCallback<LoginSSEvent>;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<LoginAndCreateSessionResult>;\n /**\n * Optional: passkey deviceNumber hint.\n *\n * When multiple passkeys exist for the same `nearAccountId`, providing this hint lets\n * the login flow prioritize the matching `credentialId` when presenting the TouchID\n * (WebAuthn) prompt.\n */\n deviceNumber?: number;\n // Optional: request a server session (JWT in body or HttpOnly cookie)\n session?: {\n // 'jwt' returns the token in the JSON body; 'cookie' sets HttpOnly cookie\n kind: 'jwt' | 'cookie';\n // Optional: override relay URL; defaults to TatchiConfigs.relayer.url\n relayUrl?: string;\n // Optional: override route path; defaults to '/verify-authentication-response'\n route?: string;\n };\n /**\n * Optional: override the warm signing session policy minted during login.\n * Defaults come from `TatchiConfigs.signingSessionDefaults`.\n */\n signingSession?: {\n ttlMs?: number;\n remainingUses?: number;\n };\n}\n\nexport interface ActionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n afterCall?: AfterCall<ActionResult>;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration. When provided, overrides user preferences\n // for this request only (not persisted).\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport type ExecutionWaitOption =\n | { mode: 'sequential'; waitUntil?: TxExecutionStatus }\n | { mode: 'parallelStaggered'; staggerMs: number };\n\nexport interface SignAndSendTransactionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Execution control for multi-transaction broadcasts:\n * - { mode: 'sequential', waitUntil?: TxExecutionStatus }\n * - { mode: 'parallelStaggered', staggerMs: number }\n */\n executionWait?: ExecutionWaitOption;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n\n afterCall?: AfterCall<ActionResult[]>;\n // Per-call confirmation configuration. When provided, overrides user preferences\n // for this request only (not persisted).\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface SignTransactionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n\n afterCall?: AfterCall<SignTransactionResult[]>;\n waitUntil?: TxExecutionStatus;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration (non-persistent)\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface SendTransactionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n\n afterCall?: AfterCall<ActionResult>;\n waitUntil?: TxExecutionStatus;\n}\n\nexport interface DelegateActionHooksOptions {\n onEvent?: EventCallback<DelegateActionSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n afterCall?: AfterCall<SignDelegateActionResult>;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface DelegateRelayHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<DelegateRelayResult>;\n}\n\nexport type SignAndSendDelegateActionHooksOptions =\n Omit<DelegateActionHooksOptions, 'afterCall'> & {\n afterCall?: AfterCall<SignAndSendDelegateActionResult>;\n };\n\nexport interface SyncAccountHooksOptions {\n onEvent?: EventCallback<SyncAccountSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n\n afterCall?: AfterCall<SyncAccountResult>;\n}\n\nexport interface SignNEP413HooksOptions {\n onEvent?: EventCallback<RegistrationSSEEvent | LoginSSEvent | ActionSSEEvent | DeviceLinkingSSEEvent | SyncAccountSSEEvent | EmailRecoverySSEEvent>;\n onError?: (error: Error) => void;\n\n afterCall?: AfterCall<SignNEP413MessageResult>;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration (non-persistent)\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n"],"mappings":";;AAmBA,IAAY,kEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,oEAAL;AACL;AACA;AACA;;;AAIF,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;;;AAEF,IAAY,sDAAL;AACL;AACA;AACA;;;AAIF,IAAY,sDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,wDAAL;AACL;AACA;AACA;;;AAOF,IAAY,gEAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,kEAAL;AACL;AACA;AACA;;;AAIF,IAAY,oEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,sEAAL;AACL;AACA;AACA;;;AAIF,IAAY,oEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,sEAAL;AACL;AACA;AACA"}
1
+ {"version":3,"file":"sdkSentEvents.js","names":[],"sources":["../../../../src/core/types/sdkSentEvents.ts"],"sourcesContent":["import type { TxExecutionStatus } from '@near-js/types';\nimport type { ConfirmationConfig, SignerMode, ThresholdBehavior } from './signer-worker';\nimport type {\n ActionResult,\n DelegateRelayResult,\n LoginAndCreateSessionResult,\n LoginResult,\n RegistrationResult,\n SignAndSendDelegateActionResult,\n SignDelegateActionResult,\n SignTransactionResult,\n} from './tatchi';\nimport type { SyncAccountResult, SignNEP413MessageResult } from '../TatchiPasskey';\n\n//////////////////////////\n// Progress Events Enums\n//////////////////////////\n\n// Registration Enums\nexport enum RegistrationPhase {\n STEP_1_WEBAUTHN_VERIFICATION = 'webauthn-verification',\n STEP_2_KEY_GENERATION = 'key-generation',\n STEP_3_CONTRACT_PRE_CHECK = 'contract-pre-check',\n STEP_4_ACCESS_KEY_ADDITION = 'access-key-addition',\n STEP_5_CONTRACT_REGISTRATION = 'contract-registration',\n STEP_6_ACCOUNT_VERIFICATION = 'account-verification',\n STEP_7_THRESHOLD_KEY_ENROLLMENT = 'threshold-key-enrollment',\n STEP_8_DATABASE_STORAGE = 'database-storage',\n STEP_9_REGISTRATION_COMPLETE = 'registration-complete',\n REGISTRATION_ERROR = 'error',\n}\nexport enum RegistrationStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Login Enums\nexport enum LoginPhase {\n STEP_1_PREPARATION = 'preparation',\n STEP_2_WEBAUTHN_ASSERTION = 'webauthn-assertion',\n STEP_3_VRF_UNLOCK = 'vrf-unlock',\n STEP_4_LOGIN_COMPLETE = 'login-complete',\n LOGIN_ERROR = 'login-error',\n}\nexport enum LoginStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Action Enums\nexport enum ActionPhase {\n STEP_1_PREPARATION = 'preparation', // Rust WASM worker phase: Preparation = 100\n STEP_2_USER_CONFIRMATION = 'user-confirmation', // Rust WASM worker phase: UserConfirmation = 101\n STEP_3_WEBAUTHN_AUTHENTICATION = 'webauthn-authentication', // Rust WASM worker phase: WebauthnAuthentication = 102\n STEP_4_AUTHENTICATION_COMPLETE = 'authentication-complete', // Rust WASM worker phase: AuthenticationComplete = 103\n STEP_5_TRANSACTION_SIGNING_PROGRESS = 'transaction-signing-progress', // Rust WASM worker phase: TransactionSigningProgress = 104\n STEP_6_TRANSACTION_SIGNING_COMPLETE = 'transaction-signing-complete', // Rust WASM worker phase: TransactionSigningComplete = 105\n WASM_ERROR = 'wasm-error', // Rust WASM worker phase: Error = 106\n STEP_7_BROADCASTING = 'broadcasting',\n STEP_8_ACTION_COMPLETE = 'action-complete',\n ACTION_ERROR = 'action-error',\n}\nexport enum ActionStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Delegate-specific phase alias for filtering\nexport { ActionPhase as DelegateActionPhase };\n\n// Account Sync Enums\nexport enum SyncAccountPhase {\n STEP_1_PREPARATION = 'preparation',\n STEP_2_WEBAUTHN_AUTHENTICATION = 'webauthn-authentication',\n STEP_3_SYNC_AUTHENTICATORS_ONCHAIN = 'sync-authenticators-onchain',\n STEP_4_AUTHENTICATOR_SAVED = 'authenticator-saved',\n STEP_5_SYNC_ACCOUNT_COMPLETE = 'sync-account-complete',\n ERROR = 'error',\n}\nexport enum SyncAccountStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Device Linking Enums\nexport enum DeviceLinkingPhase {\n STEP_1_QR_CODE_GENERATED = 'qr-code-generated', // Device2: QR code created and displayed\n STEP_2_SCANNING = 'scanning', // Device1: Scanning QR code\n STEP_3_AUTHORIZATION = 'authorization', // Device1: TouchID authorization\n STEP_4_POLLING = 'polling', // Device2: Polling contract for mapping\n STEP_5_ADDKEY_DETECTED = 'addkey-detected', // Device2: AddKey transaction detected\n STEP_6_REGISTRATION = 'registration', // Device2: Registration and credential storage\n STEP_7_LINKING_COMPLETE = 'linking-complete', // Final completion\n STEP_8_AUTO_LOGIN = 'auto-login', // Auto-login after registration\n IDLE = 'idle', // Idle state\n REGISTRATION_ERROR = 'registration-error', // Error during registration\n LOGIN_ERROR = 'login-error', // Error during login\n DEVICE_LINKING_ERROR = 'error', // General error state\n}\nexport enum DeviceLinkingStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Email Recovery Enums\nexport enum EmailRecoveryPhase {\n STEP_1_PREPARATION = 'email-recovery-preparation',\n STEP_2_TOUCH_ID_REGISTRATION = 'email-recovery-touch-id-registration',\n STEP_3_AWAIT_EMAIL = 'email-recovery-await-email',\n STEP_4_POLLING_ADD_KEY = 'email-recovery-polling-add-key',\n STEP_4_POLLING_VERIFICATION_RESULT = 'email-recovery-polling-add-key',\n STEP_5_FINALIZING_REGISTRATION = 'email-recovery-finalizing-registration',\n STEP_6_COMPLETE = 'email-recovery-complete',\n ERROR = 'email-recovery-error',\n RESUMED_FROM_PENDING = 'email-recovery-resumed-from-pending',\n}\nexport enum EmailRecoveryStatus {\n PROGRESS = 'progress',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n// Base event callback type\nexport type EventCallback<T> = (event: T) => void;\n\n// Users can still supply a single implementation: (success: boolean, result?: T) => ...\nexport interface AfterCall<T> {\n (success: true, result: T): void | Promise<void>;\n (success: false): void | Promise<void>;\n}\n\n// Base SSE Event Types (unified for Registration and Actions)\nexport interface BaseSSEEvent {\n step: number;\n phase: RegistrationPhase | LoginPhase | ActionPhase | DeviceLinkingPhase | SyncAccountPhase | EmailRecoveryPhase;\n status: RegistrationStatus | LoginStatus | ActionStatus | DeviceLinkingStatus | SyncAccountStatus | EmailRecoveryStatus;\n message: string;\n}\n\n// Registration-specific events\nexport interface BaseRegistrationSSEEvent extends BaseSSEEvent {\n phase: RegistrationPhase;\n status: RegistrationStatus;\n}\n\n// Action-specific events\nexport interface BaseActionSSEEvent extends BaseSSEEvent {\n phase: ActionPhase;\n status: ActionStatus;\n}\n\n// Login-specific events\nexport interface BaseLoginSSEEvent extends BaseSSEEvent {\n phase: LoginPhase;\n status: LoginStatus;\n}\n\nexport interface BaseDeviceLinkingSSEEvent extends BaseSSEEvent {\n phase: DeviceLinkingPhase;\n status: DeviceLinkingStatus;\n}\n\n// Action-specific events\nexport interface BaseSyncAccountEvent extends BaseSSEEvent {\n phase: SyncAccountPhase;\n status: SyncAccountStatus;\n}\n\nexport interface BaseEmailRecoveryEvent extends BaseSSEEvent {\n phase: EmailRecoveryPhase;\n status: EmailRecoveryStatus;\n}\n\n// Progress Events\nexport interface onProgressEvents extends BaseActionSSEEvent {\n step: number;\n status: ActionStatus;\n message: string;\n // Generic metadata bag for progress payloads\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\n// Optional, phase-specific data shapes used where we can commit to fields\n// Intentionally keep progress payloads generic to avoid duplicating\n// worker-side data shapes. Concrete fields can be added in future PRs\n// by normalizing worker payloads in one place.\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Registration Event Types\n/////////////////////////////////////////////\n\nexport interface RegistrationEventStep1 extends BaseRegistrationSSEEvent {\n step: 1;\n phase: RegistrationPhase.STEP_1_WEBAUTHN_VERIFICATION;\n}\n\nexport interface RegistrationEventStep2 extends BaseRegistrationSSEEvent {\n step: 2;\n phase: RegistrationPhase.STEP_2_KEY_GENERATION;\n status: RegistrationStatus.SUCCESS;\n verified: boolean;\n nearAccountId: string;\n nearPublicKey: string | null | undefined;\n vrfPublicKey: string | null | undefined;\n}\n\n// Optional progress emission during step 2 (e.g., concurrent contract pre-checks)\nexport interface RegistrationEventStep2Progress extends BaseRegistrationSSEEvent {\n step: 2;\n phase: RegistrationPhase.STEP_2_KEY_GENERATION;\n status: RegistrationStatus.PROGRESS;\n}\n\nexport interface RegistrationEventStep3 extends BaseRegistrationSSEEvent {\n step: 3;\n phase: RegistrationPhase.STEP_3_CONTRACT_PRE_CHECK;\n error?: string;\n}\n\nexport interface RegistrationEventStep4 extends BaseRegistrationSSEEvent {\n step: 4;\n phase: RegistrationPhase.STEP_4_ACCESS_KEY_ADDITION;\n error?: string;\n}\n\nexport interface RegistrationEventStep5 extends BaseRegistrationSSEEvent {\n step: 5;\n phase: RegistrationPhase.STEP_5_CONTRACT_REGISTRATION;\n error?: string;\n}\n\nexport interface RegistrationEventStep6 extends BaseRegistrationSSEEvent {\n step: 6;\n phase: RegistrationPhase.STEP_6_ACCOUNT_VERIFICATION;\n error?: string;\n}\n\nexport interface RegistrationEventStep7ThresholdKeyEnrollment extends BaseRegistrationSSEEvent {\n step: 7;\n phase: RegistrationPhase.STEP_7_THRESHOLD_KEY_ENROLLMENT;\n status: RegistrationStatus.SUCCESS;\n thresholdKeyReady: boolean;\n thresholdPublicKey?: string;\n relayerKeyId?: string;\n deviceNumber?: number;\n warning?: string;\n}\n\nexport interface RegistrationEventStep8 extends BaseRegistrationSSEEvent {\n step: 8;\n phase: RegistrationPhase.STEP_8_DATABASE_STORAGE;\n error?: string;\n}\n\nexport interface RegistrationEventStep9 extends BaseRegistrationSSEEvent {\n step: 9;\n phase: RegistrationPhase.STEP_9_REGISTRATION_COMPLETE;\n status: RegistrationStatus.SUCCESS;\n}\n\nexport interface RegistrationEventStep0 extends BaseRegistrationSSEEvent {\n step: 0;\n phase: RegistrationPhase.REGISTRATION_ERROR;\n status: RegistrationStatus.ERROR;\n error: string;\n}\n\nexport type RegistrationSSEEvent =\n | RegistrationEventStep1\n | RegistrationEventStep2Progress\n | RegistrationEventStep2\n | RegistrationEventStep3\n | RegistrationEventStep4\n | RegistrationEventStep5\n | RegistrationEventStep6\n | RegistrationEventStep7ThresholdKeyEnrollment\n | RegistrationEventStep8\n | RegistrationEventStep9\n | RegistrationEventStep0;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Login Event Types\n/////////////////////////////////////////////\n\nexport interface LoginSSEventStep1 extends BaseLoginSSEEvent {\n step: 1;\n phase: LoginPhase.STEP_1_PREPARATION;\n}\n\nexport interface LoginSSEventStep2 extends BaseLoginSSEEvent {\n step: 2;\n phase: LoginPhase.STEP_2_WEBAUTHN_ASSERTION;\n}\n\nexport interface LoginSSEventStep3 extends BaseLoginSSEEvent {\n step: 3;\n phase: LoginPhase.STEP_3_VRF_UNLOCK;\n}\n\nexport interface LoginSSEventStep4 extends BaseLoginSSEEvent {\n step: 4;\n phase: LoginPhase.STEP_4_LOGIN_COMPLETE;\n status: LoginStatus.SUCCESS;\n nearAccountId: string;\n clientNearPublicKey: string;\n}\n\nexport interface LoginSSEventStep0 extends BaseLoginSSEEvent {\n step: 0;\n phase: LoginPhase.LOGIN_ERROR;\n status: LoginStatus.ERROR;\n error: string;\n}\n\nexport type LoginSSEvent =\n | LoginSSEventStep1\n | LoginSSEventStep2\n | LoginSSEventStep3\n | LoginSSEventStep4\n | LoginSSEventStep0;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Action Event Types\n/////////////////////////////////////////////\n\nexport interface ActionEventStep1 extends BaseActionSSEEvent {\n step: 1;\n phase: ActionPhase.STEP_1_PREPARATION;\n}\n\nexport interface ActionEventStep2 extends BaseActionSSEEvent {\n step: 2;\n phase: ActionPhase.STEP_2_USER_CONFIRMATION;\n}\n\nexport interface ActionEventStep3 extends BaseActionSSEEvent {\n step: 3;\n phase: ActionPhase.STEP_3_WEBAUTHN_AUTHENTICATION;\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\nexport interface ActionEventStep4 extends BaseActionSSEEvent {\n step: 4;\n phase: ActionPhase.STEP_4_AUTHENTICATION_COMPLETE;\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\nexport interface ActionEventStep5 extends BaseActionSSEEvent {\n step: 5;\n phase: ActionPhase.STEP_5_TRANSACTION_SIGNING_PROGRESS;\n data?: Record<string, unknown>;\n}\n\nexport interface ActionEventStep6 extends BaseActionSSEEvent {\n step: 6;\n phase: ActionPhase.STEP_6_TRANSACTION_SIGNING_COMPLETE;\n status: ActionStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface ActionEventStep7 extends BaseActionSSEEvent {\n step: 7;\n phase: ActionPhase.STEP_7_BROADCASTING;\n}\n\nexport interface ActionEventStep8 extends BaseActionSSEEvent {\n step: 8;\n phase: ActionPhase.STEP_8_ACTION_COMPLETE;\n status: ActionStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface ActionEventError extends BaseActionSSEEvent {\n step: 0;\n phase: ActionPhase.ACTION_ERROR;\n status: ActionStatus.ERROR;\n error: string;\n}\n\nexport interface ActionEventWasmError extends BaseActionSSEEvent {\n step: 0;\n phase: ActionPhase.WASM_ERROR;\n status: ActionStatus.ERROR;\n error: string;\n}\n\nexport type ActionSSEEvent =\n | ActionEventStep1\n | ActionEventStep2\n | ActionEventStep3\n | ActionEventStep4\n | ActionEventStep5\n | ActionEventStep6\n | ActionEventStep7\n | ActionEventStep8\n | ActionEventError\n | ActionEventWasmError;\n\nexport type DelegateActionSSEEvent = ActionSSEEvent;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Device Linking Event Types\n/////////////////////////////////////////////\n\nexport interface DeviceLinkingEventStep1 extends BaseDeviceLinkingSSEEvent {\n step: 1;\n phase: DeviceLinkingPhase.STEP_1_QR_CODE_GENERATED;\n}\n\nexport interface DeviceLinkingEventStep2 extends BaseDeviceLinkingSSEEvent {\n step: 2;\n phase: DeviceLinkingPhase.STEP_2_SCANNING;\n}\n\nexport interface DeviceLinkingEventStep3 extends BaseDeviceLinkingSSEEvent {\n step: 3;\n phase: DeviceLinkingPhase.STEP_3_AUTHORIZATION;\n}\n\nexport interface DeviceLinkingEventStep4 extends BaseDeviceLinkingSSEEvent {\n step: 4;\n phase: DeviceLinkingPhase.STEP_4_POLLING;\n}\n\nexport interface DeviceLinkingEventStep5 extends BaseDeviceLinkingSSEEvent {\n step: 5;\n phase: DeviceLinkingPhase.STEP_5_ADDKEY_DETECTED;\n}\n\nexport interface DeviceLinkingEventStep6 extends BaseDeviceLinkingSSEEvent {\n step: 6;\n phase: DeviceLinkingPhase.STEP_6_REGISTRATION;\n}\n\nexport interface DeviceLinkingEventStep7 extends BaseDeviceLinkingSSEEvent {\n step: 7;\n phase: DeviceLinkingPhase.STEP_7_LINKING_COMPLETE;\n}\n\nexport interface DeviceLinkingEventStep8 extends BaseDeviceLinkingSSEEvent {\n step: 8;\n phase: DeviceLinkingPhase.STEP_8_AUTO_LOGIN;\n}\n\nexport interface DeviceLinkingErrorEvent extends BaseDeviceLinkingSSEEvent {\n step: 0;\n phase: DeviceLinkingPhase.DEVICE_LINKING_ERROR\n | DeviceLinkingPhase.LOGIN_ERROR\n | DeviceLinkingPhase.REGISTRATION_ERROR;\n status: DeviceLinkingStatus.ERROR;\n error: string;\n}\n\nexport type DeviceLinkingSSEEvent =\n | DeviceLinkingEventStep1\n | DeviceLinkingEventStep2\n | DeviceLinkingEventStep3\n | DeviceLinkingEventStep4\n | DeviceLinkingEventStep5\n | DeviceLinkingEventStep6\n | DeviceLinkingEventStep7\n | DeviceLinkingEventStep8\n | DeviceLinkingErrorEvent;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Account Sync Event Types\n/////////////////////////////////////////////\n\nexport interface SyncAccountEventStep1 extends BaseSyncAccountEvent {\n step: 1;\n phase: SyncAccountPhase.STEP_1_PREPARATION;\n}\n\nexport interface SyncAccountEventStep2 extends BaseSyncAccountEvent {\n step: 2;\n phase: SyncAccountPhase.STEP_2_WEBAUTHN_AUTHENTICATION;\n}\n\nexport interface SyncAccountEventStep3 extends BaseSyncAccountEvent {\n step: 3;\n phase: SyncAccountPhase.STEP_3_SYNC_AUTHENTICATORS_ONCHAIN;\n data?: Record<string, unknown>;\n logs?: string[];\n}\n\nexport interface SyncAccountEventStep4 extends BaseSyncAccountEvent {\n step: 4;\n phase: SyncAccountPhase.STEP_4_AUTHENTICATOR_SAVED;\n status: SyncAccountStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface SyncAccountEventStep5 extends BaseSyncAccountEvent {\n step: 5;\n phase: SyncAccountPhase.STEP_5_SYNC_ACCOUNT_COMPLETE;\n status: SyncAccountStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface SyncAccountError extends BaseSyncAccountEvent {\n step: 0;\n phase: SyncAccountPhase.ERROR;\n status: SyncAccountStatus.ERROR;\n error: string;\n}\n\nexport type SyncAccountSSEEvent =\n | SyncAccountEventStep1\n | SyncAccountEventStep2\n | SyncAccountEventStep3\n | SyncAccountEventStep4\n | SyncAccountEventStep5\n | SyncAccountError;\n\n/////////////////////////////////////////////\n// SDK-Sent-Events: Email Recovery Event Types\n/////////////////////////////////////////////\n\nexport interface EmailRecoveryEventStep1 extends BaseEmailRecoveryEvent {\n step: 1;\n phase: EmailRecoveryPhase.STEP_1_PREPARATION;\n}\n\nexport interface EmailRecoveryEventStep2 extends BaseEmailRecoveryEvent {\n step: 2;\n phase: EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;\n}\n\nexport interface EmailRecoveryEventStep3 extends BaseEmailRecoveryEvent {\n step: 3;\n phase: EmailRecoveryPhase.STEP_3_AWAIT_EMAIL;\n}\n\nexport interface EmailRecoveryEventStep4 extends BaseEmailRecoveryEvent {\n step: 4;\n phase: EmailRecoveryPhase.STEP_4_POLLING_ADD_KEY | EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;\n data?: {\n accountId?: string;\n requestId?: string;\n nearPublicKey?: string;\n elapsedMs?: number;\n pollCount?: number;\n [key: string]: unknown;\n };\n logs?: string[];\n}\n\nexport interface EmailRecoveryEventStep5 extends BaseEmailRecoveryEvent {\n step: 5;\n phase: EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailRecoveryEventStep6 extends BaseEmailRecoveryEvent {\n step: 6;\n phase: EmailRecoveryPhase.STEP_6_COMPLETE;\n status: EmailRecoveryStatus.SUCCESS;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailRecoveryEventResumedFromPending extends BaseEmailRecoveryEvent {\n step: 0;\n phase: EmailRecoveryPhase.RESUMED_FROM_PENDING;\n status: EmailRecoveryStatus.PROGRESS;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailRecoveryErrorEvent extends BaseEmailRecoveryEvent {\n step: 0;\n phase: EmailRecoveryPhase.ERROR;\n status: EmailRecoveryStatus.ERROR;\n error: string;\n}\n\nexport type EmailRecoverySSEEvent =\n | EmailRecoveryEventStep1\n | EmailRecoveryEventStep2\n | EmailRecoveryEventStep3\n | EmailRecoveryEventStep4\n | EmailRecoveryEventStep5\n | EmailRecoveryEventStep6\n | EmailRecoveryEventResumedFromPending\n | EmailRecoveryErrorEvent;\n\n//////////////////////////////////\n/// Hooks Options\n//////////////////////////////////\n\n// Function Options\nexport interface RegistrationHooksOptions {\n onEvent?: EventCallback<RegistrationSSEEvent>;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<RegistrationResult>;\n /**\n * Optional: registration signing policy.\n * - `{ mode: 'local-signer' }`: derive and store an encrypted local NEAR secret key (v3 vault).\n * - `{ mode: 'threshold-signer' }`: derive the local key AND enroll a threshold Ed25519 (2-of-2) access key\n * during registration (relay adds the threshold public key on-chain and returns relayerKeyId).\n *\n * Defaults to `{ mode: 'local-signer' }` for backwards compatibility in public APIs.\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration. When provided, overrides user preferences\n // for this request only (not persisted).\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface LoginHooksOptions {\n onEvent?: EventCallback<LoginSSEvent>;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<LoginAndCreateSessionResult>;\n /**\n * Optional: passkey deviceNumber hint.\n *\n * When multiple passkeys exist for the same `nearAccountId`, providing this hint lets\n * the login flow prioritize the matching `credentialId` when presenting the TouchID\n * (WebAuthn) prompt.\n */\n deviceNumber?: number;\n // Optional: request a server session (JWT in body or HttpOnly cookie)\n session?: {\n // 'jwt' returns the token in the JSON body; 'cookie' sets HttpOnly cookie\n kind: 'jwt' | 'cookie';\n // Optional: override relay URL; defaults to TatchiConfigs.relayer.url\n relayUrl?: string;\n // Optional: override route path; defaults to '/verify-authentication-response'\n route?: string;\n };\n /**\n * Optional: override the warm signing session policy minted during login.\n * Defaults come from `TatchiConfigs.signingSessionDefaults`.\n */\n signingSession?: {\n ttlMs?: number;\n remainingUses?: number;\n };\n}\n\nexport interface ActionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n afterCall?: AfterCall<ActionResult>;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration. When provided, overrides user preferences\n // for this request only (not persisted).\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport type ExecutionWaitOption =\n | { mode: 'sequential'; waitUntil?: TxExecutionStatus }\n | { mode: 'parallelStaggered'; staggerMs: number };\n\nexport interface SignAndSendTransactionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Execution control for multi-transaction broadcasts:\n * - { mode: 'sequential', waitUntil?: TxExecutionStatus }\n * - { mode: 'parallelStaggered', staggerMs: number }\n */\n executionWait?: ExecutionWaitOption;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n\n afterCall?: AfterCall<ActionResult[]>;\n // Per-call confirmation configuration. When provided, overrides user preferences\n // for this request only (not persisted).\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface SignTransactionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n\n afterCall?: AfterCall<SignTransactionResult[]>;\n waitUntil?: TxExecutionStatus;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration (non-persistent)\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface SendTransactionHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n\n afterCall?: AfterCall<ActionResult>;\n waitUntil?: TxExecutionStatus;\n}\n\nexport interface DelegateActionHooksOptions {\n onEvent?: EventCallback<DelegateActionSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n afterCall?: AfterCall<SignDelegateActionResult>;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n\nexport interface DelegateRelayHooksOptions {\n onEvent?: EventCallback<ActionSSEEvent>;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<DelegateRelayResult>;\n}\n\nexport type SignAndSendDelegateActionHooksOptions =\n Omit<DelegateActionHooksOptions, 'afterCall'> & {\n afterCall?: AfterCall<SignAndSendDelegateActionResult>;\n };\n\nexport interface SyncAccountHooksOptions {\n onEvent?: EventCallback<SyncAccountSSEEvent>;\n onError?: (error: Error) => void;\n waitUntil?: TxExecutionStatus;\n\n afterCall?: AfterCall<SyncAccountResult>;\n}\n\nexport interface SignNEP413HooksOptions {\n onEvent?: EventCallback<RegistrationSSEEvent | LoginSSEvent | ActionSSEEvent | DeviceLinkingSSEEvent | SyncAccountSSEEvent | EmailRecoverySSEEvent>;\n onError?: (error: Error) => void;\n\n afterCall?: AfterCall<SignNEP413MessageResult>;\n /**\n * Signing policy:\n * { mode: 'local-signer' }\n * { mode: 'threshold-signer'; behavior?: ThresholdBehavior };\n */\n signerMode?: SignerMode;\n /**\n * Preferred grouping for per-call confirmer copy.\n */\n confirmerText?: { title?: string; body?: string };\n // Per-call confirmation configuration (non-persistent)\n // Accept partial config so callers can pass minimal overrides like { uiMode: 'drawer' }\n confirmationConfig?: Partial<ConfirmationConfig>;\n}\n"],"mappings":";;AAmBA,IAAY,kEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,oEAAL;AACL;AACA;AACA;;;AAIF,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;;;AAEF,IAAY,sDAAL;AACL;AACA;AACA;;;AAIF,IAAY,sDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,wDAAL;AACL;AACA;AACA;;;AAOF,IAAY,gEAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,kEAAL;AACL;AACA;AACA;;;AAIF,IAAY,oEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,sEAAL;AACL;AACA;AACA;;;AAIF,IAAY,oEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEF,IAAY,sEAAL;AACL;AACA;AACA"}
@@ -63,7 +63,7 @@ const TransactionSettingsSection = ({ currentConfirmConfig, signerMode, onToggle
63
63
  lineHeight: 1,
64
64
  padding: "0 10px"
65
65
  },
66
- activeButtonStyle: { color: "var(--w3a-colors-buttonPrimary)" }
66
+ activeButtonStyle: { color: "var(--w3a-colors-textButton)" }
67
67
  })
68
68
  })] }),
69
69
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -104,7 +104,7 @@ const TransactionSettingsSection = ({ currentConfirmConfig, signerMode, onToggle
104
104
  lineHeight: 1,
105
105
  padding: "0 10px"
106
106
  },
107
- activeButtonStyle: { color: "var(--w3a-colors-buttonPrimary)" }
107
+ activeButtonStyle: { color: "var(--w3a-colors-textButton)" }
108
108
  })
109
109
  })] }),
110
110
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -143,7 +143,7 @@ const TransactionSettingsSection = ({ currentConfirmConfig, signerMode, onToggle
143
143
  lineHeight: 1,
144
144
  padding: "0 10px"
145
145
  },
146
- activeButtonStyle: { color: "var(--w3a-colors-buttonPrimary)" }
146
+ activeButtonStyle: { color: "var(--w3a-colors-textButton)" }
147
147
  })
148
148
  })
149
149
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionSettingsSection.js","names":["TransactionSettingsSection: React.FC<TransactionSettingsSectionProps>","SegmentedControl","Slider"],"sources":["../../../../../src/react/components/AccountMenuButton/TransactionSettingsSection.tsx"],"sourcesContent":["import React from 'react';\nimport { Slider } from './Slider';\nimport type { TransactionSettingsSectionProps } from './types';\nimport { SegmentedControl } from '../PasskeyAuthMenu/ui/SegmentedControl';\n\nexport const TransactionSettingsSection: React.FC<TransactionSettingsSectionProps> = ({\n currentConfirmConfig,\n signerMode,\n onToggleThresholdSigning,\n onSetUiMode,\n onToggleShowDetails,\n onToggleSkipClick,\n onSetDelay,\n className,\n style,\n isOpen = true,\n theme = 'dark'\n}) => {\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const disableRequireClick = currentConfirmConfig?.uiMode === 'skip';\n const disableDelaySlider = disableRequireClick || currentConfirmConfig?.behavior !== 'autoProceed';\n const disableAll = !isOpen;\n const selectedSignerMode = signerMode?.mode ?? 'local-signer';\n\n return (\n <div\n className={`w3a-dropdown-tx-settings-root ${isOpen ? 'is-expanded' : ''} ${className || ''}`}\n style={style}\n onClick={handleClick}\n >\n <div className=\"w3a-dropdown-toggle-tx-settings\">\n <div\n className=\"w3a-dropdown-toggle-tx-settings-content\"\n aria-hidden={!isOpen}\n style={{ pointerEvents: isOpen ? 'auto' : 'none' }}\n >\n <div style={{\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8\n }}>\n {signerMode && onToggleThresholdSigning && (\n <div>\n <div className=\"w3a-confirmation-options\">\n Signing Mode\n </div>\n <div style={{ width: '100%' }}>\n <SegmentedControl\n items={[\n { value: 'local-signer', label: 'Local Signer', disabled: disableAll },\n { value: 'threshold-signer', label: 'MPC Signer', disabled: disableAll },\n ]}\n value={selectedSignerMode}\n onValueChange={(v) => onToggleThresholdSigning(v === 'threshold-signer')}\n activeBg={'var(--w3a-colors-primary)'}\n height={40}\n buttonFontSize={12}\n containerStyle={{ background: 'var(--w3a-colors-surface2)', width: '100%' }}\n buttonStyle={{ display: 'grid', placeItems: 'center', lineHeight: 1, padding: '0 10px' }}\n activeButtonStyle={{ color: 'var(--w3a-colors-buttonPrimary)' }}\n />\n </div>\n </div>\n )}\n <div>\n <div className=\"w3a-confirmation-options\">\n Confirmation Options\n </div>\n <div style={{ width: '100%' }}>\n <SegmentedControl\n items={[\n { value: 'skip', label: 'skip', disabled: disableAll },\n { value: 'modal', label: 'modal', disabled: disableAll },\n { value: 'drawer', label: 'drawer', disabled: disableAll },\n ]}\n value={(currentConfirmConfig?.uiMode ?? 'modal')}\n onValueChange={(v) => onSetUiMode?.(v as 'skip' | 'modal' | 'drawer')}\n activeBg={'var(--w3a-colors-primary)'}\n height={40}\n buttonFontSize={12}\n containerStyle={{ background: 'var(--w3a-colors-surface2)', width: '100%' }}\n buttonStyle={{ display: 'grid', placeItems: 'center', lineHeight: 1, padding: '0 10px' }}\n activeButtonStyle={{ color: 'var(--w3a-colors-buttonPrimary)' }}\n />\n </div>\n </div>\n <div\n style={{\n opacity: disableRequireClick ? 0.6 : 1,\n pointerEvents: disableRequireClick ? 'none' : 'auto'\n }}\n >\n <div style={{ width: '100%' }}>\n <SegmentedControl\n items={[\n { value: 'auto', label: 'auto proceed', disabled: disableAll || disableRequireClick },\n { value: 'require', label: 'require click', disabled: disableAll || disableRequireClick },\n ]}\n value={(currentConfirmConfig?.behavior === 'autoProceed') ? 'auto' : 'require'}\n onValueChange={(v) => {\n const wantsAuto = v === 'auto';\n const isAuto = currentConfirmConfig?.behavior === 'autoProceed';\n if (wantsAuto !== isAuto) onToggleSkipClick?.();\n }}\n activeBg={'var(--w3a-colors-primary)'}\n height={40}\n buttonFontSize={12}\n containerStyle={{ background: 'var(--w3a-colors-surface2)', width: '100%' }}\n buttonStyle={{ display: 'grid', placeItems: 'center', lineHeight: 1, padding: '0 10px' }}\n activeButtonStyle={{ color: 'var(--w3a-colors-buttonPrimary)' }}\n />\n </div>\n </div>\n <Slider\n disabled={disableAll || disableDelaySlider}\n min={0}\n max={6}\n step={1}\n value={Math.round((currentConfirmConfig?.autoProceedDelay ?? 0) / 500)}\n onChange={(v) => onSetDelay(v * 500)}\n theme={theme}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAKA,MAAaA,8BAAyE,EACpF,sBACA,YACA,0BACA,aACA,qBACA,mBACA,YACA,WACA,OACA,SAAS,MACT,QAAQ,aACJ;CAEJ,MAAM,eAAe,MAAwB;AAC3C,IAAE;;CAGJ,MAAM,sBAAsB,sBAAsB,WAAW;CAC7D,MAAM,qBAAqB,uBAAuB,sBAAsB,aAAa;CACrF,MAAM,aAAa,CAAC;CACpB,MAAM,qBAAqB,YAAY,QAAQ;AAE/C,QACE,2CAAC;EACC,WAAW,iCAAiC,SAAS,gBAAgB,GAAG,GAAG,aAAa;EACjF;EACP,SAAS;YAET,2CAAC;GAAI,WAAU;aACb,2CAAC;IACC,WAAU;IACV,eAAa,CAAC;IACd,OAAO,EAAE,eAAe,SAAS,SAAS;cAE1C,4CAAC;KAAI,OAAO;MACV,OAAO;MACP,SAAS;MACT,eAAe;MACf,KAAK;;;MAEJ,cAAc,4BACb,4CAAC,oBACC,2CAAC;OAAI,WAAU;iBAA2B;UAG1C,2CAAC;OAAI,OAAO,EAAE,OAAO;iBACnB,2CAACC;QACC,OAAO,CACL;SAAE,OAAO;SAAgB,OAAO;SAAgB,UAAU;WAC1D;SAAE,OAAO;SAAoB,OAAO;SAAc,UAAU;;QAE9D,OAAO;QACP,gBAAgB,MAAM,yBAAyB,MAAM;QACrD,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,gBAAgB;SAAE,YAAY;SAA8B,OAAO;;QACnE,aAAa;SAAE,SAAS;SAAQ,YAAY;SAAU,YAAY;SAAG,SAAS;;QAC9E,mBAAmB,EAAE,OAAO;;;MAKpC,4CAAC,oBACC,2CAAC;OAAI,WAAU;iBAA2B;UAG1C,2CAAC;OAAI,OAAO,EAAE,OAAO;iBACnB,2CAACA;QACC,OAAO;SACL;UAAE,OAAO;UAAQ,OAAO;UAAQ,UAAU;;SAC1C;UAAE,OAAO;UAAS,OAAO;UAAS,UAAU;;SAC5C;UAAE,OAAO;UAAU,OAAO;UAAU,UAAU;;;QAEhD,OAAQ,sBAAsB,UAAU;QACxC,gBAAgB,MAAM,cAAc;QACpC,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,gBAAgB;SAAE,YAAY;SAA8B,OAAO;;QACnE,aAAa;SAAE,SAAS;SAAQ,YAAY;SAAU,YAAY;SAAG,SAAS;;QAC9E,mBAAmB,EAAE,OAAO;;;MAIlC,2CAAC;OACC,OAAO;QACL,SAAS,sBAAsB,KAAM;QACrC,eAAe,sBAAsB,SAAS;;iBAGhD,2CAAC;QAAI,OAAO,EAAE,OAAO;kBACnB,2CAACA;SACC,OAAO,CACL;UAAE,OAAO;UAAQ,OAAO;UAAgB,UAAU,cAAc;YAChE;UAAE,OAAO;UAAW,OAAO;UAAiB,UAAU,cAAc;;SAEtE,OAAQ,sBAAsB,aAAa,gBAAiB,SAAS;SACrE,gBAAgB,MAAM;UACpB,MAAM,YAAY,MAAM;UACxB,MAAM,SAAS,sBAAsB,aAAa;AAClD,cAAI,cAAc,OAAQ;;SAE5B,UAAU;SACV,QAAQ;SACR,gBAAgB;SAChB,gBAAgB;UAAE,YAAY;UAA8B,OAAO;;SACnE,aAAa;UAAE,SAAS;UAAQ,YAAY;UAAU,YAAY;UAAG,SAAS;;SAC9E,mBAAmB,EAAE,OAAO;;;;MAIlC,2CAACC;OACC,UAAU,cAAc;OACxB,KAAK;OACL,KAAK;OACL,MAAM;OACN,OAAO,KAAK,OAAO,sBAAsB,oBAAoB,KAAK;OAClE,WAAW,MAAM,WAAW,IAAI;OACzB"}
1
+ {"version":3,"file":"TransactionSettingsSection.js","names":["TransactionSettingsSection: React.FC<TransactionSettingsSectionProps>","SegmentedControl","Slider"],"sources":["../../../../../src/react/components/AccountMenuButton/TransactionSettingsSection.tsx"],"sourcesContent":["import React from 'react';\nimport { Slider } from './Slider';\nimport type { TransactionSettingsSectionProps } from './types';\nimport { SegmentedControl } from '../PasskeyAuthMenu/ui/SegmentedControl';\n\nexport const TransactionSettingsSection: React.FC<TransactionSettingsSectionProps> = ({\n currentConfirmConfig,\n signerMode,\n onToggleThresholdSigning,\n onSetUiMode,\n onToggleShowDetails,\n onToggleSkipClick,\n onSetDelay,\n className,\n style,\n isOpen = true,\n theme = 'dark'\n}) => {\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const disableRequireClick = currentConfirmConfig?.uiMode === 'skip';\n const disableDelaySlider = disableRequireClick || currentConfirmConfig?.behavior !== 'autoProceed';\n const disableAll = !isOpen;\n const selectedSignerMode = signerMode?.mode ?? 'local-signer';\n\n return (\n <div\n className={`w3a-dropdown-tx-settings-root ${isOpen ? 'is-expanded' : ''} ${className || ''}`}\n style={style}\n onClick={handleClick}\n >\n <div className=\"w3a-dropdown-toggle-tx-settings\">\n <div\n className=\"w3a-dropdown-toggle-tx-settings-content\"\n aria-hidden={!isOpen}\n style={{ pointerEvents: isOpen ? 'auto' : 'none' }}\n >\n <div style={{\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8\n }}>\n {signerMode && onToggleThresholdSigning && (\n <div>\n <div className=\"w3a-confirmation-options\">\n Signing Mode\n </div>\n <div style={{ width: '100%' }}>\n <SegmentedControl\n items={[\n { value: 'local-signer', label: 'Local Signer', disabled: disableAll },\n { value: 'threshold-signer', label: 'MPC Signer', disabled: disableAll },\n ]}\n value={selectedSignerMode}\n onValueChange={(v) => onToggleThresholdSigning(v === 'threshold-signer')}\n activeBg={'var(--w3a-colors-primary)'}\n height={40}\n buttonFontSize={12}\n containerStyle={{ background: 'var(--w3a-colors-surface2)', width: '100%' }}\n buttonStyle={{ display: 'grid', placeItems: 'center', lineHeight: 1, padding: '0 10px' }}\n activeButtonStyle={{ color: 'var(--w3a-colors-textButton)' }}\n />\n </div>\n </div>\n )}\n <div>\n <div className=\"w3a-confirmation-options\">\n Confirmation Options\n </div>\n <div style={{ width: '100%' }}>\n <SegmentedControl\n items={[\n { value: 'skip', label: 'skip', disabled: disableAll },\n { value: 'modal', label: 'modal', disabled: disableAll },\n { value: 'drawer', label: 'drawer', disabled: disableAll },\n ]}\n value={(currentConfirmConfig?.uiMode ?? 'modal')}\n onValueChange={(v) => onSetUiMode?.(v as 'skip' | 'modal' | 'drawer')}\n activeBg={'var(--w3a-colors-primary)'}\n height={40}\n buttonFontSize={12}\n containerStyle={{ background: 'var(--w3a-colors-surface2)', width: '100%' }}\n buttonStyle={{ display: 'grid', placeItems: 'center', lineHeight: 1, padding: '0 10px' }}\n activeButtonStyle={{ color: 'var(--w3a-colors-textButton)' }}\n />\n </div>\n </div>\n <div\n style={{\n opacity: disableRequireClick ? 0.6 : 1,\n pointerEvents: disableRequireClick ? 'none' : 'auto'\n }}\n >\n <div style={{ width: '100%' }}>\n <SegmentedControl\n items={[\n { value: 'auto', label: 'auto proceed', disabled: disableAll || disableRequireClick },\n { value: 'require', label: 'require click', disabled: disableAll || disableRequireClick },\n ]}\n value={(currentConfirmConfig?.behavior === 'autoProceed') ? 'auto' : 'require'}\n onValueChange={(v) => {\n const wantsAuto = v === 'auto';\n const isAuto = currentConfirmConfig?.behavior === 'autoProceed';\n if (wantsAuto !== isAuto) onToggleSkipClick?.();\n }}\n activeBg={'var(--w3a-colors-primary)'}\n height={40}\n buttonFontSize={12}\n containerStyle={{ background: 'var(--w3a-colors-surface2)', width: '100%' }}\n buttonStyle={{ display: 'grid', placeItems: 'center', lineHeight: 1, padding: '0 10px' }}\n activeButtonStyle={{ color: 'var(--w3a-colors-textButton)' }}\n />\n </div>\n </div>\n <Slider\n disabled={disableAll || disableDelaySlider}\n min={0}\n max={6}\n step={1}\n value={Math.round((currentConfirmConfig?.autoProceedDelay ?? 0) / 500)}\n onChange={(v) => onSetDelay(v * 500)}\n theme={theme}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAKA,MAAaA,8BAAyE,EACpF,sBACA,YACA,0BACA,aACA,qBACA,mBACA,YACA,WACA,OACA,SAAS,MACT,QAAQ,aACJ;CAEJ,MAAM,eAAe,MAAwB;AAC3C,IAAE;;CAGJ,MAAM,sBAAsB,sBAAsB,WAAW;CAC7D,MAAM,qBAAqB,uBAAuB,sBAAsB,aAAa;CACrF,MAAM,aAAa,CAAC;CACpB,MAAM,qBAAqB,YAAY,QAAQ;AAE/C,QACE,2CAAC;EACC,WAAW,iCAAiC,SAAS,gBAAgB,GAAG,GAAG,aAAa;EACjF;EACP,SAAS;YAET,2CAAC;GAAI,WAAU;aACb,2CAAC;IACC,WAAU;IACV,eAAa,CAAC;IACd,OAAO,EAAE,eAAe,SAAS,SAAS;cAE1C,4CAAC;KAAI,OAAO;MACV,OAAO;MACP,SAAS;MACT,eAAe;MACf,KAAK;;;MAEJ,cAAc,4BACb,4CAAC,oBACC,2CAAC;OAAI,WAAU;iBAA2B;UAG1C,2CAAC;OAAI,OAAO,EAAE,OAAO;iBACnB,2CAACC;QACC,OAAO,CACL;SAAE,OAAO;SAAgB,OAAO;SAAgB,UAAU;WAC1D;SAAE,OAAO;SAAoB,OAAO;SAAc,UAAU;;QAE9D,OAAO;QACP,gBAAgB,MAAM,yBAAyB,MAAM;QACrD,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,gBAAgB;SAAE,YAAY;SAA8B,OAAO;;QACnE,aAAa;SAAE,SAAS;SAAQ,YAAY;SAAU,YAAY;SAAG,SAAS;;QAC9E,mBAAmB,EAAE,OAAO;;;MAKpC,4CAAC,oBACC,2CAAC;OAAI,WAAU;iBAA2B;UAG1C,2CAAC;OAAI,OAAO,EAAE,OAAO;iBACnB,2CAACA;QACC,OAAO;SACL;UAAE,OAAO;UAAQ,OAAO;UAAQ,UAAU;;SAC1C;UAAE,OAAO;UAAS,OAAO;UAAS,UAAU;;SAC5C;UAAE,OAAO;UAAU,OAAO;UAAU,UAAU;;;QAEhD,OAAQ,sBAAsB,UAAU;QACxC,gBAAgB,MAAM,cAAc;QACpC,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,gBAAgB;SAAE,YAAY;SAA8B,OAAO;;QACnE,aAAa;SAAE,SAAS;SAAQ,YAAY;SAAU,YAAY;SAAG,SAAS;;QAC9E,mBAAmB,EAAE,OAAO;;;MAIlC,2CAAC;OACC,OAAO;QACL,SAAS,sBAAsB,KAAM;QACrC,eAAe,sBAAsB,SAAS;;iBAGhD,2CAAC;QAAI,OAAO,EAAE,OAAO;kBACnB,2CAACA;SACC,OAAO,CACL;UAAE,OAAO;UAAQ,OAAO;UAAgB,UAAU,cAAc;YAChE;UAAE,OAAO;UAAW,OAAO;UAAiB,UAAU,cAAc;;SAEtE,OAAQ,sBAAsB,aAAa,gBAAiB,SAAS;SACrE,gBAAgB,MAAM;UACpB,MAAM,YAAY,MAAM;UACxB,MAAM,SAAS,sBAAsB,aAAa;AAClD,cAAI,cAAc,OAAQ;;SAE5B,UAAU;SACV,QAAQ;SACR,gBAAgB;SAChB,gBAAgB;UAAE,YAAY;UAA8B,OAAO;;SACnE,aAAa;UAAE,SAAS;UAAQ,YAAY;UAAU,YAAY;UAAG,SAAS;;SAC9E,mBAAmB,EAAE,OAAO;;;;MAIlC,2CAACC;OACC,UAAU,cAAc;OACxB,KAAK;OACL,KAAK;OACL,MAAM;OACN,OAAO,KAAK,OAAO,sBAAsB,oBAAoB,KAAK;OAClE,WAAW,MAAM,WAAW,IAAI;OACzB"}
@@ -1,5 +1,7 @@
1
1
  /* Root container */
2
2
  .w3a-signup-menu-root {
3
+ /* JS sentinel used to avoid FOUC when CSS is still loading */
4
+ --w3a-pam2-css-ready: 1;
3
5
  position: relative; /* relative position to anchor back button */
4
6
  width: min(100dvw, 420px);
5
7
  max-width: 100dvw;
@@ -1006,4 +1008,4 @@
1006
1008
  }
1007
1009
 
1008
1010
 
1009
- /*# sourceMappingURL=PasskeyAuthMenu-CRlobBrN.css.map*/
1011
+ /*# sourceMappingURL=PasskeyAuthMenu-D2eRb2-S.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasskeyAuthMenu-D2eRb2-S.css","names":[],"sources":["../../../../../src/react/components/PasskeyAuthMenu/PasskeyAuthMenu.css"],"sourcesContent":["/* Root container */\n.w3a-signup-menu-root {\n /* JS sentinel used to avoid FOUC when CSS is still loading */\n --w3a-pam2-css-ready: 1;\n position: relative; /* relative position to anchor back button */\n width: min(100dvw, 420px);\n max-width: 100dvw;\n min-width: 330px;\n min-height: 250px;\n color: var(--w3a-colors-textPrimary);\n background: var(--w3a-colors-colorBackground);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 3rem;\n box-shadow: var(--w3a-shadows-lg);\n padding: var(--w3a-spacing-lg);\n padding-top: calc(var(--w3a-spacing-lg) + 4px);\n position: relative;\n display: flex;\n flex-direction: column;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1), min-height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n will-change: height, min-height;\n}\n\n/* Back button */\n.w3a-back-button {\n position: absolute;\n top: 1rem;\n left: 1rem;\n width: 48px;\n height: 48px;\n padding: 0;\n aspect-ratio: 1 / 1;\n display: grid;\n place-items: center;\n line-height: 0;\n border-radius: 50%;\n color: var(--w3a-colors-textPrimary);\n background: transparent;\n cursor: pointer;\n border: none;\n z-index: 3;\n transition: transform 120ms ease, background-color 160ms ease, opacity 220ms ease;\n opacity: 0;\n pointer-events: none;\n filter: blur(0.2px);\n}\n.w3a-back-button.is-visible {\n opacity: 1;\n pointer-events: auto;\n filter: none;\n}\n.w3a-back-button:hover {\n transform: scale(1.02);\n background: var(--w3a-colors-surface);\n}\n.w3a-back-button:active {\n transform: scale(0.96);\n}\n\n/* Header */\n.w3a-header {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n opacity: 1;\n height: auto;\n overflow: hidden;\n transition: opacity 240ms ease-out, height 260ms cubic-bezier(0.2, 0.8, 0.2, 1), padding 260ms cubic-bezier(0.2, 0.8, 0.2, 1), margin 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n pointer-events: auto;\n position: relative;\n will-change: height, opacity;\n}\n\n/* Hide header when waiting or scan device is active */\n.w3a-signup-menu-root[data-waiting=\"true\"] .w3a-header,\n.w3a-signup-menu-root[data-scan-device=\"true\"] .w3a-header {\n opacity: 0;\n height: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n margin-top: 0px;\n margin-bottom: 0px;\n pointer-events: none;\n}\n\n/* Hide header when email recovery is active */\n.w3a-signup-menu-root[data-email-recovery=\"true\"] .w3a-header {\n opacity: 0;\n height: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n margin-top: 0px;\n margin-bottom: 0px;\n pointer-events: none;\n}\n\n/* Adjust content area when header is hidden */\n.w3a-signup-menu-root[data-waiting=\"true\"] .w3a-content-area,\n.w3a-signup-menu-root[data-scan-device=\"true\"] .w3a-content-area {\n flex: 1 1 auto;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n/* Adjust content area when email recovery is active */\n.w3a-signup-menu-root[data-email-recovery=\"true\"] .w3a-content-area {\n flex: 1 1 auto;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n/* Specific height adjustments for different states */\n.w3a-signup-menu-root[data-waiting=\"true\"] {\n min-height: 200px;\n}\n\n.w3a-signup-menu-root[data-scan-device=\"true\"] {\n min-height: 300px;\n}\n\n.w3a-signup-menu-root[data-email-recovery=\"true\"] {\n min-height: 320px;\n}\n\n.w3a-title {\n font-size: 24px;\n font-weight: 700;\n margin: 0.5rem 0.75rem;\n}\n\n.w3a-subhead {\n font-size: 1rem;\n font-weight: 500;\n line-height: 1;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 20%);\n margin: 0;\n margin-bottom: 1rem;\n margin-left: 0.75rem;\n}\n\n/* Content switcher container */\n.w3a-content-switcher {\n display: flex;\n flex-direction: column;\n overflow: hidden; /* ensure smooth height animations without spillover */\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n will-change: height;\n}\n\n/* Content area container */\n.w3a-content-area {\n position: relative;\n /* do not force-stretch; let content define intrinsic height */\n flex: 0 1 auto;\n display: flex;\n flex-direction: column;\n animation: fade-in 240ms ease-out;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n/* Intrinsic sizer wrapper inside content area used for height measurement */\n.w3a-content-sizer {\n display: block;\n width: 100%;\n}\n\n/* Default content */\n.w3a-signin-menu {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0px;\n min-height: 250px;\n width: 100%;\n animation: content-enter 240ms ease-in-out;\n}\n\n@keyframes content-enter {\n from {\n opacity: 0;\n transform: scale(0.98) translateY(6px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Social providers row */\n.w3a-social-row {\n display: flex;\n gap: 8px;\n margin-bottom: var(--w3a-spacing-sm);\n}\n.w3a-social-btn {\n height: 48px;\n flex: 1 1 0;\n min-width: 0;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--w3a-colors-textSecondary, #64748b);\n overflow: hidden;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n border-radius: var(--w3a-border-radius-xl);\n /* no shadow requested */\n box-shadow: none;\n}\n.w3a-social-btn svg {\n color: var(--w3a-colors-textSecondary, #64748b);\n}\n.w3a-social-btn:hover {\n background: var(--w3a-colors-surface2);\n box-shadow: var(--w3a-shadows-sm);\n}\n.w3a-social-btn:hover svg {\n color: var(--w3a-colors-textPrimary, #1e293b);\n}\n\n/* Passkey row */\n.w3a-passkey-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.w3a-input-pill {\n position: relative;\n display: flex;\n flex: 1;\n align-items: center;\n padding: 0rem 1rem;\n height: 54px;\n gap: 8px;\n border: none;\n background: var(--w3a-colors-surface);\n border-radius: 2rem 2rem 2rem 2rem;\n box-shadow: none;\n overflow-x: hidden;\n transition: border-radius 150ms ease-in-out;\n}\n.w3a-input-pill.is-enabled {\n border-radius: 2rem 0.25rem 0.25rem 2rem;\n transition: border-radius 150ms ease-in-out;\n}\n\n.w3a-input-wrap {\n position: relative;\n flex: 1;\n height: 32px;\n display: flex;\n align-items: center;\n min-width: 0; /* allow input to shrink inside flex container without clipping */\n}\n.w3a-input {\n width: 100%;\n height: 32px;\n border: none;\n outline: none;\n background: transparent;\n color: var(--w3a-colors-textPrimary);\n font-size: 16px;\n padding: 0;\n min-width: 0; /* prevent overflow clipping in flex layouts */\n}\n\n/* Absolute status message anchored to bottom-right of the input area */\n.w3a-input::placeholder {\n /* Improve contrast for placeholders on dark */\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 35%);\n opacity: 0.95;\n}\n\n.w3a-postfix {\n position: absolute;\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n color: var(--w3a-colors-textSecondary);\n font-size: 16px;\n white-space: nowrap;\n pointer-events: none;\n visibility: hidden; /* React enables once measured */\n will-change: left;\n transition: left 32ms ease;\n}\n.w3a-postfix.is-existing {\n color: var(--w3a-colors-success);\n}\n/* On focus, keep postfix subtle for readability */\n.w3a-input:focus ~ .w3a-postfix {\n color: var(--w3a-colors-textMuted);\n}\n\n.w3a-arrow-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 0; /* hidden footprint by default */\n padding: 0;\n background: transparent;\n border: 0;\n border-radius: 2rem 0.25rem 0.25rem 2rem;\n color: #fff;\n line-height: 0;\n cursor: pointer;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n margin-left: -1rem;\n z-index: 1;\n border: 6px solid var(--w3a-colors-colorBackground, #fff);\n height: 64px;\n transition: transform 150ms ease,\n background-color 150ms ease,\n border-radius 150ms ease,\n opacity 150ms ease,\n width 150ms ease-in-out;\n}\n.w3a-arrow-btn.is-enabled {\n width: 100px; /* expand when enabled */\n /* Prefer themed primary; fall back to legacy then a sane default */\n background: var(--w3a-colors-primary, #2563eb);\n border-radius: 2rem;\n /* border-radius: 2rem; */\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n transition: transform 150ms ease,\n background-color 150ms ease,\n border-radius 150ms ease,\n opacity 150ms ease,\n width 150ms ease-in-out;\n}\n.w3a-arrow-btn.no-transition,\n.w3a-arrow-btn.no-transition.is-enabled {\n transition: none;\n}\n.w3a-arrow-btn .w3a-arrow-icon {\n color: #fff;\n}\n.w3a-arrow-btn.is-enabled:hover {\n /* transform: scale(1.02); */\n background: var(--w3a-colors-primaryHover, #1d4ed8);\n}\n.w3a-arrow-btn.is-enabled:active {\n transform: scale(0.96);\n}\n.w3a-arrow-btn:disabled {\n width: 0;\n cursor: not-allowed;\n opacity: 0.5;\n background: var(--w3a-colors-borderSecondary);\n transition: transform 150ms ease,\n background-color 150ms ease,\n border-radius 150ms ease,\n opacity 150ms ease,\n width 150ms ease-in-out;\n}\n.w3a-arrow-btn .w3a-arrow-label {\n margin-left: 8px;\n font-weight: 600;\n line-height: 1;\n}\n\n/* Animated arrow inside the continue button */\n.w3a-arrow-btn .stripe-arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.w3a-arrow-btn .stripe-arrow > .HoverArrow {\n position: relative;\n margin-top: 0.1rem;\n margin-left: 8px;\n stroke-width: 2;\n fill: none;\n stroke: currentColor;\n}\n\n/* Horizontal line: fades in on hover of the button */\n.w3a-arrow-btn .stripe-arrow > .HoverArrow .HoverArrow__linePath {\n opacity: 0;\n transition: opacity 120ms cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n/* Chevron: nudges right and slightly scales on hover */\n.w3a-arrow-btn .stripe-arrow > .HoverArrow .HoverArrow__tipPath {\n transition: transform 120ms cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.w3a-arrow-btn.is-enabled:hover .stripe-arrow > .HoverArrow .HoverArrow__linePath,\n.w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow > .HoverArrow .HoverArrow__linePath {\n opacity: 1;\n}\n\n.w3a-arrow-btn.is-enabled:hover .stripe-arrow > .HoverArrow .HoverArrow__tipPath,\n.w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow > .HoverArrow .HoverArrow__tipPath {\n transform: translateX(3px);\n}\n\n/* Segmented control */\n.w3a-seg {\n position: relative;\n min-height: 54px;\n overflow: hidden;\n padding: 5px;\n border: none;\n background: var(--w3a-colors-surface2);\n border-radius: var(--w3a-border-radius-xl);\n}\n.w3a-seg-active {\n position: absolute;\n top: 5px;\n bottom: 5px;\n left: 0;\n border-radius: var(--w3a-border-radius-xl);\n transition:\n transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1),\n width 220ms ease,\n opacity 150ms ease;\n will-change: transform, width;\n pointer-events: none;\n}\n.w3a-seg-grid {\n display: flex;\n gap: 4px;\n height: 100%;\n position: relative;\n z-index: 1;\n}\n.w3a-seg-btn {\n flex: 1 1 0;\n min-width: 0;\n min-height: 44px;\n border-radius: 12px;\n background: transparent;\n /* Make inactive tabs more legible and clearly tappable */\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 45%);\n font-weight: 600;\n cursor: pointer;\n border: none;\n /* Immediate taps on mobile; opt-out of double-tap zoom heuristics */\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n transition: color 200ms ease, transform 120ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n white-space: normal;\n padding: 0 14px;\n font-size: clamp(13px, 3.6vw, 15px);\n}\n.w3a-seg-btn:hover {\n transform: scale(1.02);\n}\n.w3a-seg-btn:active {\n transform: scale(0.98);\n}\n.w3a-seg-btn.is-active {\n color: var(--w3a-colors-textPrimary);\n}\n.w3a-seg-btn:focus-visible {\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--w3a-colors-focus), transparent 60%);\n}\n\n@media (max-width: 420px) {\n .w3a-signup-menu-root {\n padding: 1rem;\n padding-top: calc(1rem + 4px);\n border-radius: 2rem;\n max-width: calc(100dvw - 0.25rem);\n }\n\n @supports (width: 1dvw) {\n .w3a-signup-menu-root { max-width: calc(100dvw - 0.25rem); }\n }\n\n .w3a-title {\n font-size: 20px;\n }\n\n .w3a-subhead {\n font-size: 0.9rem;\n margin-bottom: 0.75rem;\n }\n\n .w3a-input-pill {\n height: 48px;\n }\n\n .w3a-arrow-btn {\n height: 60px;\n }\n\n .w3a-arrow-btn.is-enabled {\n width: 60px;\n }\n\n .w3a-seg {\n min-height: 48px;\n padding: 4px;\n }\n\n .w3a-seg-grid {\n gap: 3px;\n }\n\n .w3a-seg-active {\n top: 4px;\n bottom: 4px;\n }\n\n .w3a-seg-btn {\n min-height: 42px;\n padding: 0 12px;\n font-size: clamp(12px, 3.4vw, 14px);\n }\n\n .w3a-back-button {\n top: -0.5rem;\n left: -0.5rem;\n }\n}\n\n/* Waiting state */\n.w3a-waiting {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: transparent;\n text-align: center;\n min-height: 200px;\n /* Quick fade with configurable delay for smoother handoff */\n animation: content-enter 200ms ease-out;\n animation-delay: var(--w3a-waiting-delay, 0ms);\n animation-fill-mode: both;\n}\n.w3a-waiting-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n.w3a-waiting-text { font-size: 18px; font-weight: 600; }\n.w3a-waiting-subtext {\n font-size: 12px;\n font-weight: 500;\n line-height: 1.35;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);\n}\n.w3a-waiting-sdk-events {\n font-size: 11px;\n font-weight: 500;\n line-height: 1.35;\n white-space: pre-wrap;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 15%);\n}\n.w3a-spinner {\n width: 36px;\n height: 36px;\n border-radius: 999px;\n border: 3px solid rgba(255,255,255,0.15);\n border-top-color: var(--w3a-colors-primary);\n animation: w3a-spin 0.9s linear infinite;\n}\n\n/* Scan device content wrapper */\n.w3a-scan-device-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: transparent;\n text-align: center;\n min-height: 300px;\n width: 100%;\n overflow: hidden;\n animation: content-enter 240ms ease-out;\n}\n\n/* Ensure QR code content stays within bounds */\n.w3a-scan-device-content .qr-code-container,\n.w3a-scan-device-content .qr-modal-backdrop,\n.w3a-scan-device-content .qr-modal-content {\n max-width: 100%;\n max-height: 100%;\n overflow: hidden;\n}\n\n.w3a-scan-device-content .qr-code-display {\n max-width: 280px;\n width: 100%;\n}\n\n/* Status message row */\n.w3a-status-row {\n position: absolute;\n font-size: 0.75rem;\n bottom: -10px;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n.w3a-status-message {\n font-size: 11px;\n font-weight: 500;\n}\n\n/* Section divider */\n.w3a-section-divider {\n display: flex;\n align-items: center;\n margin: var(--w3a-spacing-md) 0;\n position: relative;\n}\n\n.w3a-section-divider::before,\n.w3a-section-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--w3a-colors-borderSecondary);\n}\n\n.w3a-section-divider-text {\n padding: 0 var(--w3a-spacing-sm);\n font-size: 12px;\n color: var(--w3a-colors-textSecondary);\n font-weight: 500;\n background: var(--w3a-colors-colorBackground);\n}\n\n/* Labels and helper text */\n.w3a-field-label {\n font-size: 12px;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 35%);\n margin: 6px 2px 6px;\n font-weight: 600;\n}\n.w3a-seg-help {\n font-size: 12px;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);\n margin: 0;\n margin-left: 0.75rem;\n}\n.w3a-seg-help-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 8px;\n}\n/* Tooltip for account existence status */\n.w3a-input-wrap .w3a-tooltip {\n position: absolute;\n right: 0;\n padding: 4px 8px;\n border-radius: 1rem;\n font-size: 0.7rem;\n background: var(--w3a-colors-surface2);\n color: var(--w3a-colors-textPrimary);\n opacity: 0;\n transform: translateX(50px) scale(0.9);\n pointer-events: none;\n transition: opacity 180ms ease, transform 200ms ease;\n z-index: 2;\n}\n.w3a-input-wrap .w3a-tooltip.is-visible {\n opacity: 0.8;\n transform: translateX(0px) scale(1);\n}\n.w3a-input-wrap .w3a-tooltip.is-error {\n color: var(--w3a-colors-error);\n background: var(--w3a-colors-colorBackground);\n /* background: color-mix(in srgb, var(--w3a-colors-error), transparent 90%); */\n}\n.w3a-input-wrap .w3a-tooltip.is-success {\n color: var(--w3a-colors-blue400);\n background: var(--w3a-colors-colorBackground);\n /* background: color-mix(in srgb, var(--w3a-colors-blue400), transparent 90%); */\n}\n\n@keyframes w3a-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@keyframes w3a-ellipsis-dot {\n 0%, 80%, 100% { opacity: 0; }\n 40% { opacity: 1; }\n}\n\n.w3a-ellipsis {\n display: inline-block;\n}\n\n.w3a-ellipsis-dot {\n display: inline-block;\n opacity: 0;\n animation: w3a-ellipsis-dot 1.2s infinite;\n}\n\n.w3a-ellipsis-dot:nth-child(2) { animation-delay: 0.15s; }\n.w3a-ellipsis-dot:nth-child(3) { animation-delay: 0.3s; }\n\n/* Pop/bounce-in animation (kept for legacy classes) */\n@keyframes w3a-input-msg-pop {\n 0% { opacity: 0; transform: translateY(8px) scale(0.98); }\n 60% { opacity: 1; transform: translateY(-2px) scale(1.02); }\n 100% { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .w3a-input-msg.is-error { animation: none; }\n .w3a-ellipsis-dot { animation: none; opacity: 1; }\n}\n\n/* Button System */\n.w3a-scan-device-row {\n}\n\n.w3a-secondary-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.w3a-link-device-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n overflow: hidden;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n height: 48px;\n width: 100%;\n max-width: 100%;\n background: var(--w3a-colors-surface) !important;\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 2rem;\n cursor: pointer;\n color: var(--w3a-colors-textPrimary);\n font-family: var(--w3a-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);\n font-weight: 500;\n font-size: 0.875rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Hover/focus elevated state (theme-reactive via CSS vars) */\n.w3a-link-device-btn:hover:not(:disabled),\n.w3a-link-device-btn:focus-visible {\n background: var(--w3a-colors-surface2) !important;\n}\n\n.w3a-link-device-btn-primary {\n background: var(--w3a-colors-buttonBackground, var(--w3a-colors-primary, #3b82f6)) !important;\n border-color: transparent;\n border-radius: 2rem;\n color: var(--w3a-colors-textButton, white);\n}\n\n.w3a-link-device-btn-primary:hover:not(:disabled),\n.w3a-link-device-btn-primary:focus-visible {\n background: var(--w3a-colors-buttonHoverBackground, var(--w3a-colors-primaryHover, #2563eb)) !important;\n color: var(--w3a-colors-textButton, white);\n}\n\n.w3a-link-device-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* Button-local spinner: match text size inside buttons */\n.w3a-link-device-btn .w3a-spinner {\n width: 1em;\n height: 1em;\n border-width: 2px;\n}\n\n.w3a-link-device-btn-primary .w3a-spinner {\n border-color: rgba(255, 255, 255, 0.35);\n border-top-color: #ffffff;\n}\n\n/* Email recovery slide */\n.w3a-email-recovery-content {\n width: 100%;\n padding-top: 1rem;\n}\n\n.w3a-email-recovery-slide {\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 260px;\n animation: content-enter 240ms ease-out;\n}\n\n.w3a-email-recovery-title {\n font-size: 20px;\n font-weight: 700;\n margin: 0.5rem 0.5rem;\n display: flex;\n justify-content: center;\n}\n\n.w3a-email-recovery-help {\n font-size: 0.95rem;\n line-height: 1.2;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 20%);\n margin: 0 0.25rem;\n}\n\n.w3a-email-recovery-meta {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n padding: 0 0.25rem;\n font-size: 0.85rem;\n}\n\n.w3a-email-recovery-meta-label {\n opacity: 0.85;\n}\n\n.w3a-email-recovery-meta-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 0.85rem;\n opacity: 0.9;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 70%;\n text-align: right;\n}\n\n.w3a-email-recovery-input-pill {\n height: 54px;\n padding: 0 1rem;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n transition: box-shadow 160ms ease, border-color 160ms ease;\n}\n\n.w3a-email-recovery-input-pill:focus-within {\n border-color: var(--w3a-colors-primary, #3b82f6);\n}\n\n.w3a-email-recovery-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n}\n\n.w3a-email-recovery-summary {\n font-size: 0.875rem;\n line-height: 1.2;\n padding: 0 0.25rem;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 20%);\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.w3a-email-recovery-warning {\n color: color-mix(in srgb, var(--w3a-colors-error), var(--w3a-colors-textPrimary) 30%);\n}\n\n.w3a-email-recovery-from-warning {\n margin-top: 1rem;\n font-weight: 600;\n}\n\n[data-w3a-theme=\"light\"] .w3a-email-recovery-from-warning {\n color: #d80;\n}\n\n[data-w3a-theme=\"dark\"] .w3a-email-recovery-from-warning {\n color: #ea5;\n}\n\n.w3a-email-recovery-link {\n font-size: 0.875rem;\n color: var(--w3a-colors-primary, #3b82f6);\n text-decoration: none;\n padding: 0;\n}\n\n.w3a-email-recovery-link:hover {\n text-decoration: underline;\n}\n\n.w3a-email-recovery-status {\n font-size: 0.875rem;\n padding: 0.75rem 0.875rem;\n border-radius: 1rem;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface2);\n color: var(--w3a-colors-textPrimary);\n margin-bottom: 4px;\n}\n\n.w3a-email-recovery-status.is-error {\n border-color: color-mix(in srgb, var(--w3a-colors-error), var(--w3a-colors-borderPrimary) 60%);\n color: var(--w3a-colors-error);\n}\n\n.w3a-email-recovery-elapsed {\n margin-left: 6px;\n opacity: 0.75;\n}\n\n.w3a-email-recovery-saved-emails {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.w3a-email-recovery-email-chip {\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n color: var(--w3a-colors-textPrimary);\n padding: 6px 10px;\n border-radius: 999px;\n font-size: 0.85rem;\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.w3a-email-recovery-email-chip-static {\n cursor: default;\n}\n\n.w3a-email-recovery-email-chip:hover:not(:disabled) {\n background: var(--w3a-colors-surface2);\n}\n\n.w3a-email-recovery-email-chip:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.w3a-email-recovery-toast {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0.75rem 0.875rem;\n border-radius: 1rem;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n font-size: 0.875rem;\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-email-recovery-toast a {\n color: var(--w3a-colors-primary, #3b82f6);\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.w3a-email-recovery-toast a:hover {\n text-decoration: underline;\n}\n\n.w3a-email-recovery-toast-close {\n margin-left: auto;\n width: 28px;\n height: 28px;\n border-radius: 999px;\n border: none;\n background: transparent;\n color: var(--w3a-colors-textSecondary);\n cursor: pointer;\n display: grid;\n place-items: center;\n}\n\n.w3a-email-recovery-toast-close:hover {\n background: var(--w3a-colors-surface2);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA"}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
6
6
  * Useful for hover/viewport/idle prefetch to reduce interaction latency.
7
7
  */
8
8
  function preloadPasskeyAuthMenu() {
9
- return Promise.resolve().then(() => require("./client.js")).then(() => void 0);
9
+ return Promise.resolve().then(() => require("./client.js")).then(() => void 0).catch(() => void 0);
10
10
  }
11
11
  var preload_default = preloadPasskeyAuthMenu;
12
12
 
@@ -1 +1 @@
1
- {"version":3,"file":"preload.js","names":[],"sources":["../../../../../src/react/components/PasskeyAuthMenu/preload.ts"],"sourcesContent":["/**\n * Preload the client-only implementation chunk for `PasskeyAuthMenu`.\n * Useful for hover/viewport/idle prefetch to reduce interaction latency.\n */\nexport function preloadPasskeyAuthMenu(): Promise<void> {\n return import('./client').then(() => undefined);\n}\n\nexport default preloadPasskeyAuthMenu;\n"],"mappings":";;;;;;;AAIA,SAAgB,yBAAwC;AACtD,6CAAO,gBAAmB,WAAW;;AAGvC,sBAAe"}
1
+ {"version":3,"file":"preload.js","names":[],"sources":["../../../../../src/react/components/PasskeyAuthMenu/preload.ts"],"sourcesContent":["/**\n * Preload the client-only implementation chunk for `PasskeyAuthMenu`.\n * Useful for hover/viewport/idle prefetch to reduce interaction latency.\n */\nexport function preloadPasskeyAuthMenu(): Promise<void> {\n // Best-effort: preloading should never crash callers or surface unhandled rejections.\n return import('./client')\n .then(() => undefined)\n .catch(() => undefined);\n}\n\nexport default preloadPasskeyAuthMenu;\n"],"mappings":";;;;;;;AAIA,SAAgB,yBAAwC;AAEtD,6CAAO,gBACJ,WAAW,QACX,YAAY;;AAGjB,sBAAe"}
@@ -3,6 +3,7 @@ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.js');
3
3
  const require_ThemeProvider = require('../theme/ThemeProvider.js');
4
4
  const require_themeScope = require('./themeScope.js');
5
5
  const require_skeleton = require('./skeleton.js');
6
+ const require_preload = require('./preload.js');
6
7
  let react = require("react");
7
8
  react = require_rolldown_runtime.__toESM(react);
8
9
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -38,19 +39,63 @@ var LazyErrorBoundary = class extends react.default.Component {
38
39
  const PasskeyAuthMenu = (props) => {
39
40
  const [isClient, setIsClient] = react.default.useState(false);
40
41
  const [retryKey, setRetryKey] = react.default.useState(0);
42
+ const [stylesReady, setStylesReady] = react.default.useState(false);
41
43
  const ClientLazy = react.default.useMemo(() => createClientLazy(), [retryKey]);
44
+ const skeletonRootRef = react.default.useRef(null);
42
45
  const { theme } = require_ThemeProvider.useTheme();
43
46
  react.default.useEffect(() => {
44
47
  setIsClient(true);
48
+ require_preload.preloadPasskeyAuthMenu();
45
49
  }, []);
50
+ react.default.useEffect(() => {
51
+ if (!isClient) return;
52
+ if (stylesReady) return;
53
+ if (typeof window === "undefined" || typeof requestAnimationFrame !== "function") {
54
+ setStylesReady(true);
55
+ return;
56
+ }
57
+ let cancelled = false;
58
+ const start = typeof performance !== "undefined" ? performance.now() : Date.now();
59
+ const maxWaitMs = 1500;
60
+ const tick = () => {
61
+ if (cancelled) return;
62
+ const el = skeletonRootRef.current;
63
+ if (el) try {
64
+ const cs = window.getComputedStyle(el);
65
+ const sentinelReady = cs.getPropertyValue("--w3a-pam2-css-ready").trim() === "1";
66
+ const borderOk = cs.borderTopStyle !== "none" && cs.borderTopWidth !== "0px";
67
+ const radiusOk = cs.borderTopLeftRadius !== "0px";
68
+ if (sentinelReady || borderOk || radiusOk) {
69
+ setStylesReady(true);
70
+ return;
71
+ }
72
+ } catch {}
73
+ const now = typeof performance !== "undefined" ? performance.now() : Date.now();
74
+ if (now - start >= maxWaitMs) {
75
+ setStylesReady(true);
76
+ return;
77
+ }
78
+ requestAnimationFrame(tick);
79
+ };
80
+ requestAnimationFrame(tick);
81
+ return () => {
82
+ cancelled = true;
83
+ };
84
+ }, [isClient, stylesReady]);
85
+ const skeletonWithRef = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_skeleton.PasskeyAuthMenuSkeletonInner, {
86
+ ref: skeletonRootRef,
87
+ className: props.className,
88
+ style: props.style
89
+ });
90
+ const skeleton = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_skeleton.PasskeyAuthMenuSkeletonInner, {
91
+ className: props.className,
92
+ style: props.style
93
+ });
46
94
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_themeScope.PasskeyAuthMenuThemeScope, {
47
95
  theme,
48
- children: isClient ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LazyErrorBoundary, {
96
+ children: isClient && stylesReady ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LazyErrorBoundary, {
49
97
  onRetry: () => setRetryKey((k) => k + 1),
50
- fallback: ({ retry }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_skeleton.PasskeyAuthMenuSkeletonInner, {
51
- className: props.className,
52
- style: props.style
53
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
98
+ fallback: ({ retry }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [skeleton, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54
99
  style: {
55
100
  marginTop: 10,
56
101
  fontSize: 12,
@@ -69,16 +114,10 @@ const PasskeyAuthMenu = (props) => {
69
114
  ]
70
115
  })] }),
71
116
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.default.Suspense, {
72
- fallback: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_skeleton.PasskeyAuthMenuSkeletonInner, {
73
- className: props.className,
74
- style: props.style
75
- }),
117
+ fallback: skeleton,
76
118
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ClientLazy, { ...props })
77
119
  })
78
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_skeleton.PasskeyAuthMenuSkeletonInner, {
79
- className: props.className,
80
- style: props.style
81
- })
120
+ }) : skeletonWithRef
82
121
  });
83
122
  };
84
123
  var shell_default = PasskeyAuthMenu;
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","names":["React","PasskeyAuthMenu: React.FC<PasskeyAuthMenuProps>","useTheme","PasskeyAuthMenuThemeScope","PasskeyAuthMenuSkeletonInner"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/shell.tsx"],"sourcesContent":["import React from 'react';\nimport { PasskeyAuthMenuSkeletonInner } from './skeleton';\nimport { PasskeyAuthMenuThemeScope } from './themeScope';\nimport type { PasskeyAuthMenuProps } from './types';\nimport { useTheme } from '../theme';\n\nfunction createClientLazy() {\n return React.lazy(() => import('./client').then((m) => ({ default: m.PasskeyAuthMenuClient })));\n}\n\nclass LazyErrorBoundary extends React.Component<\n {\n fallback: (args: { error: Error; retry: () => void }) => React.ReactNode;\n onRetry: () => void;\n children: React.ReactNode;\n },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error): { error: Error } {\n return { error };\n }\n\n retry = () => {\n this.setState({ error: null });\n this.props.onRetry();\n };\n\n render() {\n if (this.state.error) {\n return this.props.fallback({ error: this.state.error, retry: this.retry });\n }\n return this.props.children;\n }\n}\n\n/**\n * `PasskeyAuthMenu` — SSR-safe shell.\n *\n * - Server: renders a skeleton only.\n * - Client: lazy-loads the full implementation after mount.\n */\nexport const PasskeyAuthMenu: React.FC<PasskeyAuthMenuProps> = (props) => {\n const [isClient, setIsClient] = React.useState(false);\n const [retryKey, setRetryKey] = React.useState(0);\n const ClientLazy = React.useMemo(() => createClientLazy(), [retryKey]);\n\n // Align with the SDK Theme boundary when present (TatchiPasskeyProvider wraps one by default).\n // Falls back to system preference when used standalone.\n const { theme } = useTheme();\n\n React.useEffect(() => {\n setIsClient(true);\n }, []);\n\n return (\n <PasskeyAuthMenuThemeScope theme={theme}>\n {isClient ? (\n <LazyErrorBoundary\n onRetry={() => setRetryKey((k) => k + 1)}\n fallback={({ retry }) => (\n <div>\n <PasskeyAuthMenuSkeletonInner className={props.className} style={props.style} />\n <div style={{ marginTop: 10, fontSize: 12, textAlign: 'center', opacity: 0.9 }}>\n Failed to load menu.{' '}\n <button type=\"button\" onClick={retry} style={{ textDecoration: 'underline' }}>\n Retry\n </button>\n </div>\n </div>\n )}\n >\n <React.Suspense\n fallback={\n <PasskeyAuthMenuSkeletonInner className={props.className} style={props.style} />\n }\n >\n <ClientLazy {...props} />\n </React.Suspense>\n </LazyErrorBoundary>\n ) : (\n <PasskeyAuthMenuSkeletonInner className={props.className} style={props.style} />\n )}\n </PasskeyAuthMenuThemeScope>\n );\n};\n\nexport default PasskeyAuthMenu;\n"],"mappings":";;;;;;;;;;;AAMA,SAAS,mBAAmB;AAC1B,QAAOA,cAAM,gDAAW,gBAAmB,MAAM,OAAO,EAAE,SAAS,EAAE;;AAGvE,IAAM,oBAAN,cAAgCA,cAAM,UAOpC;CACA,QAAiC,EAAE,OAAO;CAE1C,OAAO,yBAAyB,OAAgC;AAC9D,SAAO,EAAE;;CAGX,cAAc;AACZ,OAAK,SAAS,EAAE,OAAO;AACvB,OAAK,MAAM;;CAGb,SAAS;AACP,MAAI,KAAK,MAAM,MACb,QAAO,KAAK,MAAM,SAAS;GAAE,OAAO,KAAK,MAAM;GAAO,OAAO,KAAK;;AAEpE,SAAO,KAAK,MAAM;;;;;;;;;AAUtB,MAAaC,mBAAmD,UAAU;CACxE,MAAM,CAAC,UAAU,eAAeD,cAAM,SAAS;CAC/C,MAAM,CAAC,UAAU,eAAeA,cAAM,SAAS;CAC/C,MAAM,aAAaA,cAAM,cAAc,oBAAoB,CAAC;CAI5D,MAAM,EAAE,UAAUE;AAElB,eAAM,gBAAgB;AACpB,cAAY;IACX;AAEH,QACE,2CAACC;EAAiC;YAC/B,WACC,2CAAC;GACC,eAAe,aAAa,MAAM,IAAI;GACtC,WAAW,EAAE,YACX,4CAAC,oBACC,2CAACC;IAA6B,WAAW,MAAM;IAAW,OAAO,MAAM;OACvE,4CAAC;IAAI,OAAO;KAAE,WAAW;KAAI,UAAU;KAAI,WAAW;KAAU,SAAS;;;KAAO;KACzD;KACrB,2CAAC;MAAO,MAAK;MAAS,SAAS;MAAO,OAAO,EAAE,gBAAgB;gBAAe;;;;aAOpF,2CAACJ,cAAM;IACL,UACE,2CAACI;KAA6B,WAAW,MAAM;KAAW,OAAO,MAAM;;cAGzE,2CAAC,cAAW,GAAI;;OAIpB,2CAACA;GAA6B,WAAW,MAAM;GAAW,OAAO,MAAM;;;;AAM/E,oBAAe"}
1
+ {"version":3,"file":"shell.js","names":["React","PasskeyAuthMenu: React.FC<PasskeyAuthMenuProps>","useTheme","PasskeyAuthMenuSkeletonInner","PasskeyAuthMenuThemeScope"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/shell.tsx"],"sourcesContent":["import React from 'react';\nimport { PasskeyAuthMenuSkeletonInner } from './skeleton';\nimport { PasskeyAuthMenuThemeScope } from './themeScope';\nimport type { PasskeyAuthMenuProps } from './types';\nimport { useTheme } from '../theme';\nimport { preloadPasskeyAuthMenu } from './preload';\n\nfunction createClientLazy() {\n return React.lazy(() => import('./client').then((m) => ({ default: m.PasskeyAuthMenuClient })));\n}\n\nclass LazyErrorBoundary extends React.Component<\n {\n fallback: (args: { error: Error; retry: () => void }) => React.ReactNode;\n onRetry: () => void;\n children: React.ReactNode;\n },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error): { error: Error } {\n return { error };\n }\n\n retry = () => {\n this.setState({ error: null });\n this.props.onRetry();\n };\n\n render() {\n if (this.state.error) {\n return this.props.fallback({ error: this.state.error, retry: this.retry });\n }\n return this.props.children;\n }\n}\n\n/**\n * `PasskeyAuthMenu` — SSR-safe shell.\n *\n * - Server: renders a skeleton only.\n * - Client: lazy-loads the full implementation after mount.\n */\nexport const PasskeyAuthMenu: React.FC<PasskeyAuthMenuProps> = (props) => {\n const [isClient, setIsClient] = React.useState(false);\n const [retryKey, setRetryKey] = React.useState(0);\n const [stylesReady, setStylesReady] = React.useState(false);\n const ClientLazy = React.useMemo(() => createClientLazy(), [retryKey]);\n const skeletonRootRef = React.useRef<HTMLDivElement | null>(null);\n\n // Align with the SDK Theme boundary when present (TatchiPasskeyProvider wraps one by default).\n // Falls back to system preference when used standalone.\n const { theme } = useTheme();\n\n React.useEffect(() => {\n setIsClient(true);\n // Start fetching the client chunk immediately; we’ll still gate showing it on `stylesReady`.\n preloadPasskeyAuthMenu();\n }, []);\n\n // Avoid FOUC when PasskeyAuthMenu is code-split and styles are still streaming in:\n // keep rendering the skeleton until we can observe CSS being applied.\n React.useEffect(() => {\n if (!isClient) return;\n if (stylesReady) return;\n if (typeof window === 'undefined' || typeof requestAnimationFrame !== 'function') {\n setStylesReady(true);\n return;\n }\n\n let cancelled = false;\n const start = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const maxWaitMs = 1500;\n\n const tick = () => {\n if (cancelled) return;\n const el = skeletonRootRef.current;\n if (el) {\n try {\n const cs = window.getComputedStyle(el);\n const sentinelReady = cs.getPropertyValue('--w3a-pam2-css-ready').trim() === '1';\n // Back-compat heuristic if the sentinel is ever missing.\n const borderOk = cs.borderTopStyle !== 'none' && cs.borderTopWidth !== '0px';\n const radiusOk = cs.borderTopLeftRadius !== '0px';\n if (sentinelReady || borderOk || radiusOk) {\n setStylesReady(true);\n return;\n }\n } catch {}\n }\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n if (now - start >= maxWaitMs) {\n setStylesReady(true);\n return;\n }\n requestAnimationFrame(tick);\n };\n\n requestAnimationFrame(tick);\n return () => {\n cancelled = true;\n };\n }, [isClient, stylesReady]);\n\n const skeletonWithRef = (\n <PasskeyAuthMenuSkeletonInner\n ref={skeletonRootRef}\n className={props.className}\n style={props.style}\n />\n );\n\n const skeleton = (\n <PasskeyAuthMenuSkeletonInner className={props.className} style={props.style} />\n );\n\n return (\n <PasskeyAuthMenuThemeScope theme={theme}>\n {isClient && stylesReady ? (\n <LazyErrorBoundary\n onRetry={() => setRetryKey((k) => k + 1)}\n fallback={({ retry }) => (\n <div>\n {skeleton}\n <div style={{ marginTop: 10, fontSize: 12, textAlign: 'center', opacity: 0.9 }}>\n Failed to load menu.{' '}\n <button type=\"button\" onClick={retry} style={{ textDecoration: 'underline' }}>\n Retry\n </button>\n </div>\n </div>\n )}\n >\n <React.Suspense\n fallback={skeleton}\n >\n <ClientLazy {...props} />\n </React.Suspense>\n </LazyErrorBoundary>\n ) : (\n skeletonWithRef\n )}\n </PasskeyAuthMenuThemeScope>\n );\n};\n\nexport default PasskeyAuthMenu;\n"],"mappings":";;;;;;;;;;;;AAOA,SAAS,mBAAmB;AAC1B,QAAOA,cAAM,gDAAW,gBAAmB,MAAM,OAAO,EAAE,SAAS,EAAE;;AAGvE,IAAM,oBAAN,cAAgCA,cAAM,UAOpC;CACA,QAAiC,EAAE,OAAO;CAE1C,OAAO,yBAAyB,OAAgC;AAC9D,SAAO,EAAE;;CAGX,cAAc;AACZ,OAAK,SAAS,EAAE,OAAO;AACvB,OAAK,MAAM;;CAGb,SAAS;AACP,MAAI,KAAK,MAAM,MACb,QAAO,KAAK,MAAM,SAAS;GAAE,OAAO,KAAK,MAAM;GAAO,OAAO,KAAK;;AAEpE,SAAO,KAAK,MAAM;;;;;;;;;AAUtB,MAAaC,mBAAmD,UAAU;CACxE,MAAM,CAAC,UAAU,eAAeD,cAAM,SAAS;CAC/C,MAAM,CAAC,UAAU,eAAeA,cAAM,SAAS;CAC/C,MAAM,CAAC,aAAa,kBAAkBA,cAAM,SAAS;CACrD,MAAM,aAAaA,cAAM,cAAc,oBAAoB,CAAC;CAC5D,MAAM,kBAAkBA,cAAM,OAA8B;CAI5D,MAAM,EAAE,UAAUE;AAElB,eAAM,gBAAgB;AACpB,cAAY;AAEZ;IACC;AAIH,eAAM,gBAAgB;AACpB,MAAI,CAAC,SAAU;AACf,MAAI,YAAa;AACjB,MAAI,OAAO,WAAW,eAAe,OAAO,0BAA0B,YAAY;AAChF,kBAAe;AACf;;EAGF,IAAI,YAAY;EAChB,MAAM,QAAQ,OAAO,gBAAgB,cAAc,YAAY,QAAQ,KAAK;EAC5E,MAAM,YAAY;EAElB,MAAM,aAAa;AACjB,OAAI,UAAW;GACf,MAAM,KAAK,gBAAgB;AAC3B,OAAI,GACF,KAAI;IACF,MAAM,KAAK,OAAO,iBAAiB;IACnC,MAAM,gBAAgB,GAAG,iBAAiB,wBAAwB,WAAW;IAE7E,MAAM,WAAW,GAAG,mBAAmB,UAAU,GAAG,mBAAmB;IACvE,MAAM,WAAW,GAAG,wBAAwB;AAC5C,QAAI,iBAAiB,YAAY,UAAU;AACzC,oBAAe;AACf;;WAEI;GAEV,MAAM,MAAM,OAAO,gBAAgB,cAAc,YAAY,QAAQ,KAAK;AAC1E,OAAI,MAAM,SAAS,WAAW;AAC5B,mBAAe;AACf;;AAEF,yBAAsB;;AAGxB,wBAAsB;AACtB,eAAa;AACX,eAAY;;IAEb,CAAC,UAAU;CAEd,MAAM,kBACJ,2CAACC;EACC,KAAK;EACL,WAAW,MAAM;EACjB,OAAO,MAAM;;CAIjB,MAAM,WACJ,2CAACA;EAA6B,WAAW,MAAM;EAAW,OAAO,MAAM;;AAGzE,QACE,2CAACC;EAAiC;YAC/B,YAAY,cACX,2CAAC;GACC,eAAe,aAAa,MAAM,IAAI;GACtC,WAAW,EAAE,YACX,4CAAC,oBACE,UACD,4CAAC;IAAI,OAAO;KAAE,WAAW;KAAI,UAAU;KAAI,WAAW;KAAU,SAAS;;;KAAO;KACzD;KACrB,2CAAC;MAAO,MAAK;MAAS,SAAS;MAAO,OAAO,EAAE,gBAAgB;gBAAe;;;;aAOpF,2CAACJ,cAAM;IACL,UAAU;cAEV,2CAAC,cAAW,GAAI;;OAIpB;;;AAMR,oBAAe"}
@@ -9,8 +9,9 @@ let react_jsx_runtime = require("react/jsx-runtime");
9
9
  react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
10
10
 
11
11
  //#region src/react/components/PasskeyAuthMenu/skeleton.tsx
12
- const PasskeyAuthMenuSkeletonInner = ({ className, style }) => {
12
+ const PasskeyAuthMenuSkeletonInner = react.default.forwardRef(({ className, style }, ref) => {
13
13
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
14
+ ref,
14
15
  className: `w3a-signup-menu-root w3a-skeleton${className ? ` ${className}` : ""}`,
15
16
  style,
16
17
  children: [
@@ -115,7 +116,8 @@ const PasskeyAuthMenuSkeletonInner = ({ className, style }) => {
115
116
  })
116
117
  ]
117
118
  });
118
- };
119
+ });
120
+ PasskeyAuthMenuSkeletonInner.displayName = "PasskeyAuthMenuSkeletonInner";
119
121
  const PasskeyAuthMenuSkeleton = (props) => {
120
122
  const { theme } = require_ThemeProvider.useTheme();
121
123
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_themeScope.PasskeyAuthMenuThemeScope, {
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.js","names":["PasskeyAuthMenuSkeletonInner: React.FC<PasskeyAuthMenuSkeletonProps>","PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps>","useTheme","PasskeyAuthMenuThemeScope"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/skeleton.tsx"],"sourcesContent":["import React from 'react';\nimport './PasskeyAuthMenu.css';\nimport { PasskeyAuthMenuThemeScope } from './themeScope';\nimport { useTheme } from '../theme';\n\nexport interface PasskeyAuthMenuSkeletonProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const PasskeyAuthMenuSkeletonInner: React.FC<PasskeyAuthMenuSkeletonProps> = ({\n className,\n style,\n}) => {\n return (\n <div\n className={`w3a-signup-menu-root w3a-skeleton${className ? ` ${className}` : ''}`}\n style={style}\n >\n <div className=\"w3a-header\">\n <div\n className=\"w3a-skeleton-block w3a-title-skeleton\"\n style={{ width: '60%', height: '24px', marginBottom: '8px' }}\n />\n <div\n className=\"w3a-skeleton-block w3a-subtitle-skeleton\"\n style={{ width: '80%', height: '16px' }}\n />\n </div>\n\n <div className=\"w3a-passkey-row\">\n <div className=\"w3a-input-pill w3a-skeleton-input\">\n <div\n className=\"w3a-skeleton-block\"\n style={{ width: '40%', height: '18px', marginLeft: '12px' }}\n />\n </div>\n </div>\n\n <div className=\"w3a-segmented-root\">\n <div className=\"w3a-seg-track\">\n <div className=\"w3a-seg-button\">Register</div>\n <div className=\"w3a-seg-button\">Login</div>\n <div className=\"w3a-seg-button\">Sync</div>\n </div>\n </div>\n\n <div className=\"w3a-seg-help-row\">\n <div\n className=\"w3a-skeleton-block\"\n style={{ width: '50%', height: '14px', margin: '0 auto' }}\n />\n </div>\n\n <div className=\"w3a-scan-device-row\">\n <div className=\"w3a-section-divider\">\n <div className=\"w3a-section-divider-text\">Already have an account?</div>\n </div>\n <div className=\"w3a-secondary-actions\">\n <button className=\"w3a-link-device-btn\" disabled>\n <div\n className=\"w3a-skeleton-block\"\n style={{\n width: '18px',\n height: '18px',\n marginRight: '8px',\n borderRadius: '4px',\n }}\n />\n Scan and Link Device\n </button>\n <button className=\"w3a-link-device-btn\" disabled>\n <div\n className=\"w3a-skeleton-block\"\n style={{\n width: '18px',\n height: '18px',\n marginRight: '8px',\n borderRadius: '9999px',\n }}\n />\n Recover Account with Email\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport const PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps> = (props) => {\n const { theme } = useTheme();\n return (\n <PasskeyAuthMenuThemeScope theme={theme}>\n <PasskeyAuthMenuSkeletonInner {...props} />\n </PasskeyAuthMenuThemeScope>\n );\n};\n\nexport default PasskeyAuthMenuSkeleton;\n"],"mappings":";;;;;;;;;;;AAUA,MAAaA,gCAAwE,EACnF,WACA,YACI;AACJ,QACE,4CAAC;EACC,WAAW,oCAAoC,YAAY,IAAI,cAAc;EACtE;;GAEP,4CAAC;IAAI,WAAU;eACb,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,cAAc;;QAEvD,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;;;;GAInC,2CAAC;IAAI,WAAU;cACb,2CAAC;KAAI,WAAU;eACb,2CAAC;MACC,WAAU;MACV,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,YAAY;;;;;GAKzD,2CAAC;IAAI,WAAU;cACb,4CAAC;KAAI,WAAU;;MACb,2CAAC;OAAI,WAAU;iBAAiB;;MAChC,2CAAC;OAAI,WAAU;iBAAiB;;MAChC,2CAAC;OAAI,WAAU;iBAAiB;;;;;GAIpC,2CAAC;IAAI,WAAU;cACb,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,QAAQ;;;;GAInD,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eACb,2CAAC;MAAI,WAAU;gBAA2B;;QAE5C,4CAAC;KAAI,WAAU;gBACb,4CAAC;MAAO,WAAU;MAAsB;iBACtC,2CAAC;OACC,WAAU;OACV,OAAO;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,cAAc;;UAEhB;SAGJ,4CAAC;MAAO,WAAU;MAAsB;iBACtC,2CAAC;OACC,WAAU;OACV,OAAO;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,cAAc;;UAEhB;;;;;;;AASd,MAAaC,2BAAmE,UAAU;CACxF,MAAM,EAAE,UAAUC;AAClB,QACE,2CAACC;EAAiC;YAChC,2CAAC,gCAA6B,GAAI;;;AAKxC,uBAAe"}
1
+ {"version":3,"file":"skeleton.js","names":["React","PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps>","useTheme","PasskeyAuthMenuThemeScope"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/skeleton.tsx"],"sourcesContent":["import React from 'react';\nimport './PasskeyAuthMenu.css';\nimport { PasskeyAuthMenuThemeScope } from './themeScope';\nimport { useTheme } from '../theme';\n\nexport interface PasskeyAuthMenuSkeletonProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const PasskeyAuthMenuSkeletonInner = React.forwardRef<\n HTMLDivElement,\n PasskeyAuthMenuSkeletonProps\n>(({ className, style }, ref) => {\n return (\n <div\n ref={ref}\n className={`w3a-signup-menu-root w3a-skeleton${className ? ` ${className}` : ''}`}\n style={style}\n >\n <div className=\"w3a-header\">\n <div\n className=\"w3a-skeleton-block w3a-title-skeleton\"\n style={{ width: '60%', height: '24px', marginBottom: '8px' }}\n />\n <div\n className=\"w3a-skeleton-block w3a-subtitle-skeleton\"\n style={{ width: '80%', height: '16px' }}\n />\n </div>\n\n <div className=\"w3a-passkey-row\">\n <div className=\"w3a-input-pill w3a-skeleton-input\">\n <div\n className=\"w3a-skeleton-block\"\n style={{ width: '40%', height: '18px', marginLeft: '12px' }}\n />\n </div>\n </div>\n\n <div className=\"w3a-segmented-root\">\n <div className=\"w3a-seg-track\">\n <div className=\"w3a-seg-button\">Register</div>\n <div className=\"w3a-seg-button\">Login</div>\n <div className=\"w3a-seg-button\">Sync</div>\n </div>\n </div>\n\n <div className=\"w3a-seg-help-row\">\n <div\n className=\"w3a-skeleton-block\"\n style={{ width: '50%', height: '14px', margin: '0 auto' }}\n />\n </div>\n\n <div className=\"w3a-scan-device-row\">\n <div className=\"w3a-section-divider\">\n <div className=\"w3a-section-divider-text\">Already have an account?</div>\n </div>\n <div className=\"w3a-secondary-actions\">\n <button className=\"w3a-link-device-btn\" disabled>\n <div\n className=\"w3a-skeleton-block\"\n style={{\n width: '18px',\n height: '18px',\n marginRight: '8px',\n borderRadius: '4px',\n }}\n />\n Scan and Link Device\n </button>\n <button className=\"w3a-link-device-btn\" disabled>\n <div\n className=\"w3a-skeleton-block\"\n style={{\n width: '18px',\n height: '18px',\n marginRight: '8px',\n borderRadius: '9999px',\n }}\n />\n Recover Account with Email\n </button>\n </div>\n </div>\n </div>\n );\n});\nPasskeyAuthMenuSkeletonInner.displayName = 'PasskeyAuthMenuSkeletonInner';\n\nexport const PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps> = (props) => {\n const { theme } = useTheme();\n return (\n <PasskeyAuthMenuThemeScope theme={theme}>\n <PasskeyAuthMenuSkeletonInner {...props} />\n </PasskeyAuthMenuThemeScope>\n );\n};\n\nexport default PasskeyAuthMenuSkeleton;\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,+BAA+BA,cAAM,YAG/C,EAAE,WAAW,SAAS,QAAQ;AAC/B,QACE,4CAAC;EACM;EACL,WAAW,oCAAoC,YAAY,IAAI,cAAc;EACtE;;GAEP,4CAAC;IAAI,WAAU;eACb,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,cAAc;;QAEvD,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;;;;GAInC,2CAAC;IAAI,WAAU;cACb,2CAAC;KAAI,WAAU;eACb,2CAAC;MACC,WAAU;MACV,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,YAAY;;;;;GAKzD,2CAAC;IAAI,WAAU;cACb,4CAAC;KAAI,WAAU;;MACb,2CAAC;OAAI,WAAU;iBAAiB;;MAChC,2CAAC;OAAI,WAAU;iBAAiB;;MAChC,2CAAC;OAAI,WAAU;iBAAiB;;;;;GAIpC,2CAAC;IAAI,WAAU;cACb,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,QAAQ;;;;GAInD,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eACb,2CAAC;MAAI,WAAU;gBAA2B;;QAE5C,4CAAC;KAAI,WAAU;gBACb,4CAAC;MAAO,WAAU;MAAsB;iBACtC,2CAAC;OACC,WAAU;OACV,OAAO;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,cAAc;;UAEhB;SAGJ,4CAAC;MAAO,WAAU;MAAsB;iBACtC,2CAAC;OACC,WAAU;OACV,OAAO;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,cAAc;;UAEhB;;;;;;;AAQd,6BAA6B,cAAc;AAE3C,MAAaC,2BAAmE,UAAU;CACxF,MAAM,EAAE,UAAUC;AAClB,QACE,2CAACC;EAAiC;YAChC,2CAAC,gCAA6B,GAAI;;;AAKxC,uBAAe"}
@@ -465,7 +465,11 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
465
465
  if (session?.login?.isLoggedIn) loginOk = true;
466
466
  else {
467
467
  safeSet(setStatusText, "Email recovery completed. Logging you in…");
468
- loginOk = await tatchiPasskey.loginAndCreateSession(normalizedAccountId).then(() => true).catch(() => false);
468
+ const loginResult = await tatchiPasskey.loginAndCreateSession(normalizedAccountId).catch(() => null);
469
+ if (loginResult?.success) {
470
+ const updatedSession = await tatchiPasskey.getLoginSession(normalizedAccountId).catch(() => null);
471
+ loginOk = !!updatedSession?.login?.isLoggedIn;
472
+ } else loginOk = false;
469
473
  }
470
474
  if (refreshLoginState) await refreshLoginState(normalizedAccountId).catch(() => {});
471
475
  safeSet(setStatusText, loginOk ? "Email recovery completed on this device." : "Email recovery completed. Please log in on this device.");