@tatchi-xyz/sdk 0.19.0 → 0.20.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 (71) hide show
  1. package/dist/cjs/core/EmailRecovery/index.js +25 -0
  2. package/dist/cjs/core/EmailRecovery/index.js.map +1 -1
  3. package/dist/cjs/core/TatchiPasskey/emailRecovery.js +70 -34
  4. package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
  5. package/dist/cjs/core/types/emailRecovery.js +33 -0
  6. package/dist/cjs/core/types/emailRecovery.js.map +1 -0
  7. package/dist/cjs/index.js +4 -0
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-CSSowiHP.css → LinkedDevicesModal-BCrFe5p3.css} +1 -1
  10. package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-BCrFe5p3.css.map} +1 -1
  11. package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-CEPMZ1gY.css → ProfileDropdown-CRJrtxDb.css} +1 -1
  12. package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-CRJrtxDb.css.map} +1 -1
  13. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css → Web3AuthProfileButton-DXFRw8ND.css} +1 -1
  14. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css.map → Web3AuthProfileButton-DXFRw8ND.css.map} +1 -1
  15. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css → TouchIcon-DNgbAK_i.css} +1 -1
  16. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css.map → TouchIcon-DNgbAK_i.css.map} +1 -1
  17. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css → PasskeyAuthMenu-DRwSoF8q.css} +1 -1
  18. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css.map → PasskeyAuthMenu-DRwSoF8q.css.map} +1 -1
  19. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +107 -21
  20. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  21. package/dist/cjs/react/components/{ShowQRCode-CCN4h6Uv.css → ShowQRCode-CL4gsszN.css} +1 -1
  22. package/dist/cjs/react/components/{ShowQRCode-CCN4h6Uv.css.map → ShowQRCode-CL4gsszN.css.map} +1 -1
  23. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +25 -0
  24. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  25. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +70 -34
  26. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  27. package/dist/cjs/react/sdk/src/core/types/emailRecovery.js +33 -0
  28. package/dist/cjs/react/sdk/src/core/types/emailRecovery.js.map +1 -0
  29. package/dist/esm/core/EmailRecovery/index.js +25 -1
  30. package/dist/esm/core/EmailRecovery/index.js.map +1 -1
  31. package/dist/esm/core/TatchiPasskey/emailRecovery.js +71 -35
  32. package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
  33. package/dist/esm/core/types/emailRecovery.js +26 -0
  34. package/dist/esm/core/types/emailRecovery.js.map +1 -0
  35. package/dist/esm/index.js +3 -1
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-CSSowiHP.css → LinkedDevicesModal-BCrFe5p3.css} +1 -1
  38. package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-BCrFe5p3.css.map} +1 -1
  39. package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-CEPMZ1gY.css → ProfileDropdown-CRJrtxDb.css} +1 -1
  40. package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-CRJrtxDb.css.map} +1 -1
  41. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css → Web3AuthProfileButton-DXFRw8ND.css} +1 -1
  42. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css.map → Web3AuthProfileButton-DXFRw8ND.css.map} +1 -1
  43. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css → TouchIcon-DNgbAK_i.css} +1 -1
  44. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css.map → TouchIcon-DNgbAK_i.css.map} +1 -1
  45. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css → PasskeyAuthMenu-DRwSoF8q.css} +1 -1
  46. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css.map → PasskeyAuthMenu-DRwSoF8q.css.map} +1 -1
  47. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +107 -21
  48. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  49. package/dist/esm/react/components/{ShowQRCode-CCN4h6Uv.css → ShowQRCode-CL4gsszN.css} +1 -1
  50. package/dist/esm/react/components/{ShowQRCode-CCN4h6Uv.css.map → ShowQRCode-CL4gsszN.css.map} +1 -1
  51. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +25 -1
  52. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  53. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +71 -35
  54. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  55. package/dist/esm/react/sdk/src/core/types/emailRecovery.js +26 -0
  56. package/dist/esm/react/sdk/src/core/types/emailRecovery.js.map +1 -0
  57. package/dist/esm/sdk/wallet-iframe-host.js +111 -33
  58. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  59. package/dist/types/src/core/EmailRecovery/index.d.ts +8 -0
  60. package/dist/types/src/core/EmailRecovery/index.d.ts.map +1 -1
  61. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +3 -1
  62. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
  63. package/dist/types/src/core/types/emailRecovery.d.ts +10 -0
  64. package/dist/types/src/core/types/emailRecovery.d.ts.map +1 -0
  65. package/dist/types/src/core/types/index.d.ts +1 -0
  66. package/dist/types/src/core/types/index.d.ts.map +1 -1
  67. package/dist/types/src/index.d.ts +1 -0
  68. package/dist/types/src/index.d.ts.map +1 -1
  69. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  70. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  71. package/package.json +1 -1
@@ -0,0 +1,33 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.js');
2
+
3
+ //#region src/core/types/emailRecovery.ts
4
+ var EmailRecoveryErrorCode, EmailRecoveryError;
5
+ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/types/emailRecovery.ts": (() => {
6
+ EmailRecoveryErrorCode = /* @__PURE__ */ function(EmailRecoveryErrorCode$1) {
7
+ EmailRecoveryErrorCode$1["REGISTRATION_NOT_VERIFIED"] = "EMAIL_RECOVERY_REGISTRATION_NOT_VERIFIED";
8
+ EmailRecoveryErrorCode$1["VRF_CHALLENGE_EXPIRED"] = "EMAIL_RECOVERY_VRF_CHALLENGE_EXPIRED";
9
+ return EmailRecoveryErrorCode$1;
10
+ }({});
11
+ EmailRecoveryError = class extends Error {
12
+ code;
13
+ context;
14
+ constructor(message, code, context) {
15
+ super(message);
16
+ this.name = "EmailRecoveryError";
17
+ this.code = code;
18
+ this.context = context;
19
+ }
20
+ };
21
+ }) });
22
+
23
+ //#endregion
24
+ init_emailRecovery();
25
+ exports.EmailRecoveryError = EmailRecoveryError;
26
+ exports.EmailRecoveryErrorCode = EmailRecoveryErrorCode;
27
+ Object.defineProperty(exports, 'init_emailRecovery', {
28
+ enumerable: true,
29
+ get: function () {
30
+ return init_emailRecovery;
31
+ }
32
+ });
33
+ //# sourceMappingURL=emailRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailRecovery.js","names":[],"sources":["../../../../src/core/types/emailRecovery.ts"],"sourcesContent":["export enum EmailRecoveryErrorCode {\n REGISTRATION_NOT_VERIFIED = 'EMAIL_RECOVERY_REGISTRATION_NOT_VERIFIED',\n VRF_CHALLENGE_EXPIRED = 'EMAIL_RECOVERY_VRF_CHALLENGE_EXPIRED',\n}\n\nexport class EmailRecoveryError extends Error {\n public readonly code: EmailRecoveryErrorCode;\n public readonly context?: Record<string, unknown>;\n\n constructor(message: string, code: EmailRecoveryErrorCode, context?: Record<string, unknown>) {\n super(message);\n this.name = 'EmailRecoveryError';\n this.code = code;\n this.context = context;\n }\n}\n\n"],"mappings":";;;;;CAAY,4EAAL;AACL;AACA;;;CAGW,qBAAb,cAAwC,MAAM;EAC5C,AAAgB;EAChB,AAAgB;EAEhB,YAAY,SAAiB,MAA8B,SAAmC;AAC5F,SAAM;AACN,QAAK,OAAO;AACZ,QAAK,OAAO;AACZ,QAAK,UAAU"}
package/dist/cjs/index.js CHANGED
@@ -13,6 +13,7 @@ const require_index = require('./core/WebAuthnManager/index.js');
13
13
  const require_recoverAccount = require('./core/TatchiPasskey/recoverAccount.js');
14
14
  const require_emailRecoveryPendingStore = require('./core/EmailRecovery/emailRecoveryPendingStore.js');
15
15
  const require_index$1 = require('./core/EmailRecovery/index.js');
16
+ const require_emailRecovery = require('./core/types/emailRecovery.js');
16
17
  const require_index$2 = require('./core/TatchiPasskey/index.js');
17
18
  const require_detect = require('./core/ExtensionWallet/detect.js');
18
19
 
@@ -25,6 +26,7 @@ require_rpc.init_rpc();
25
26
  require_sdkSentEvents.init_sdkSentEvents();
26
27
  require_accountIds.init_accountIds();
27
28
  require_actions.init_actions();
29
+ require_emailRecovery.init_emailRecovery();
28
30
 
29
31
  //#endregion
30
32
  exports.AccountRecoveryFlow = require_recoverAccount.AccountRecoveryFlow;
@@ -33,6 +35,8 @@ exports.DEFAULT_WAIT_STATUS = require_rpc.DEFAULT_WAIT_STATUS;
33
35
  exports.DEVICE_LINKING_CONFIG = require_config.DEVICE_LINKING_CONFIG;
34
36
  exports.DeviceLinkingPhase = require_sdkSentEvents.DeviceLinkingPhase;
35
37
  exports.DeviceLinkingStatus = require_sdkSentEvents.DeviceLinkingStatus;
38
+ exports.EmailRecoveryError = require_emailRecovery.EmailRecoveryError;
39
+ exports.EmailRecoveryErrorCode = require_emailRecovery.EmailRecoveryErrorCode;
36
40
  exports.EmailRecoveryPendingStore = require_emailRecoveryPendingStore.EmailRecoveryPendingStore;
37
41
  exports.MinimalNearClient = require_NearClient.MinimalNearClient;
38
42
  exports.PASSKEY_MANAGER_DEFAULT_CONFIGS = require_defaultConfigs.PASSKEY_MANAGER_DEFAULT_CONFIGS;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["\nexport { TatchiPasskey } from './core/TatchiPasskey';\nexport { WebAuthnManager } from './core/WebAuthnManager';\nexport { AccountRecoveryFlow } from './core/TatchiPasskey';\nexport {\n type NearClient,\n MinimalNearClient,\n encodeSignedTransactionBase64\n} from './core/NearClient';\nexport { verifyAuthenticationResponse } from './core/rpcCalls';\nexport { EmailRecoveryPendingStore, type PendingStore } from './core/EmailRecovery';\n\nexport * from './config';\nexport { base64UrlEncode, base64UrlDecode } from './utils/encoders';\nexport { PASSKEY_MANAGER_DEFAULT_CONFIGS } from './core/defaultConfigs';\nexport { buildConfigsFromEnv } from './core/defaultConfigs';\nexport { detectTatchiWalletExtension } from './core/ExtensionWallet/detect';\n\n///////////////////////////////////////////////////////////////\n// === Types re-exported from various type definition files ===\n///////////////////////////////////////////////////////////////\n\nexport type {\n TatchiConfigs,\n TatchiConfigsInput,\n // Registration\n RegistrationResult,\n // Login\n LoginResult,\n LoginAndCreateSessionResult,\n LoginSession,\n SigningSessionStatus,\n // Actions\n ActionResult,\n} from './core/types/tatchi';\n\nexport type {\n RegistrationSSEEvent,\n LoginSSEvent,\n // Account Recovery\n AccountRecoveryPhase,\n AccountRecoveryStatus,\n AccountRecoverySSEEvent,\n // Device Linking\n DeviceLinkingSSEEvent,\n // Hooks Options\n LoginHooksOptions,\n RegistrationHooksOptions,\n ActionHooksOptions,\n SignNEP413HooksOptions,\n AfterCall,\n EventCallback,\n} from './core/types/sdkSentEvents';\n\nexport { DEFAULT_WAIT_STATUS } from './core/types/rpc';\n\n// === Device Linking Types ===\nexport {\n DeviceLinkingPhase,\n DeviceLinkingStatus\n} from './core/types/sdkSentEvents';\nexport type {\n DeviceLinkingQRData,\n DeviceLinkingSession,\n LinkDeviceResult,\n DeviceLinkingError,\n DeviceLinkingErrorCode\n} from './core/types/linkDevice';\n\n// === AccountID Types ===\nexport type { AccountId } from './core/types/accountIds';\nexport { toAccountId } from './core/types/accountIds';\n\nexport type {\n SignNEP413MessageParams,\n SignNEP413MessageResult\n} from './core/TatchiPasskey/signNEP413';\n\n// === Action Types ===\nexport { ActionType } from './core/types/actions';\nexport type {\n ActionArgs,\n FunctionCallAction,\n TransferAction,\n CreateAccountAction,\n DeployContractAction,\n StakeAction,\n AddKeyAction,\n DeleteKeyAction,\n DeleteAccountAction\n} from './core/types/actions';\n\n// === ERROR TYPES ===\nexport type { PasskeyErrorDetails } from './core/types/errors';\n\n// === CONFIRMATION TYPES ===\nexport type {\n ConfirmationConfig,\n ConfirmationUIMode,\n ConfirmationBehavior,\n} from './core/types/signer-worker';\n"],"mappings":""}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["\nexport { TatchiPasskey } from './core/TatchiPasskey';\nexport { WebAuthnManager } from './core/WebAuthnManager';\nexport { AccountRecoveryFlow } from './core/TatchiPasskey';\nexport {\n type NearClient,\n MinimalNearClient,\n encodeSignedTransactionBase64\n} from './core/NearClient';\nexport { verifyAuthenticationResponse } from './core/rpcCalls';\nexport { EmailRecoveryPendingStore, type PendingStore } from './core/EmailRecovery';\n\nexport * from './config';\nexport { base64UrlEncode, base64UrlDecode } from './utils/encoders';\nexport { PASSKEY_MANAGER_DEFAULT_CONFIGS } from './core/defaultConfigs';\nexport { buildConfigsFromEnv } from './core/defaultConfigs';\nexport { detectTatchiWalletExtension } from './core/ExtensionWallet/detect';\n\n///////////////////////////////////////////////////////////////\n// === Types re-exported from various type definition files ===\n///////////////////////////////////////////////////////////////\n\nexport type {\n TatchiConfigs,\n TatchiConfigsInput,\n // Registration\n RegistrationResult,\n // Login\n LoginResult,\n LoginAndCreateSessionResult,\n LoginSession,\n SigningSessionStatus,\n // Actions\n ActionResult,\n} from './core/types/tatchi';\n\nexport type {\n RegistrationSSEEvent,\n LoginSSEvent,\n // Account Recovery\n AccountRecoveryPhase,\n AccountRecoveryStatus,\n AccountRecoverySSEEvent,\n // Device Linking\n DeviceLinkingSSEEvent,\n // Hooks Options\n LoginHooksOptions,\n RegistrationHooksOptions,\n ActionHooksOptions,\n SignNEP413HooksOptions,\n AfterCall,\n EventCallback,\n} from './core/types/sdkSentEvents';\n\nexport { DEFAULT_WAIT_STATUS } from './core/types/rpc';\n\n// === Device Linking Types ===\nexport {\n DeviceLinkingPhase,\n DeviceLinkingStatus\n} from './core/types/sdkSentEvents';\nexport type {\n DeviceLinkingQRData,\n DeviceLinkingSession,\n LinkDeviceResult,\n DeviceLinkingError,\n DeviceLinkingErrorCode\n} from './core/types/linkDevice';\n\n// === AccountID Types ===\nexport type { AccountId } from './core/types/accountIds';\nexport { toAccountId } from './core/types/accountIds';\n\nexport type {\n SignNEP413MessageParams,\n SignNEP413MessageResult\n} from './core/TatchiPasskey/signNEP413';\n\n// === Action Types ===\nexport { ActionType } from './core/types/actions';\nexport type {\n ActionArgs,\n FunctionCallAction,\n TransferAction,\n CreateAccountAction,\n DeployContractAction,\n StakeAction,\n AddKeyAction,\n DeleteKeyAction,\n DeleteAccountAction\n} from './core/types/actions';\n\n// === ERROR TYPES ===\nexport type { PasskeyErrorDetails } from './core/types/errors';\nexport { EmailRecoveryError, EmailRecoveryErrorCode } from './core/types/emailRecovery';\n\n// === CONFIRMATION TYPES ===\nexport type {\n ConfirmationConfig,\n ConfirmationUIMode,\n ConfirmationBehavior,\n} from './core/types/signer-worker';\n"],"mappings":""}
@@ -449,4 +449,4 @@
449
449
  }
450
450
 
451
451
 
452
- /*# sourceMappingURL=LinkedDevicesModal-CSSowiHP.css.map*/
452
+ /*# sourceMappingURL=LinkedDevicesModal-BCrFe5p3.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"LinkedDevicesModal-CSSowiHP.css","names":[],"sources":["../../../../../src/react/components/AccountMenuButton/LinkedDevicesModal.css"],"sourcesContent":["/* Linked Devices Modal Styles */\n\n.w3a-access-keys-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n /* Ensure this modal stays below the wallet iframe overlay */\n z-index: var(--w3a-z-underlay-backdrop, calc(var(--w3a-wallet-overlay-z, 2147483646) - var(--w3a-wallet-underlay-backdrop-offset, 2)));\n background: oklch(0.2 0.01 240 / 0.8);\n backdrop-filter: blur(8px);\n display: flex;\n justify-content: center;\n align-items: center;\n animation: backdrop-opacity 32ms ease-in;\n will-change: opacity;\n}\n\n.w3a-access-keys-modal-inner {\n position: relative;\n z-index: var(--w3a-z-underlay-content, calc(var(--w3a-wallet-overlay-z, 2147483646) - var(--w3a-wallet-underlay-content-offset, 1)));\n display: grid;\n place-items: center;\n height: 100%;\n width: 100%;\n max-width: 480;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n overflow: visible;\n}\n\n.w3a-access-keys-modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: 1rem;\n overflow: visible;\n min-height: 200px;\n max-width: 480px;\n min-width: 340px;\n background: var(--w3a-colors-colorBackground);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 2rem;\n}\n\n.w3a-access-keys-modal-close {\n position: absolute;\n top: 1rem;\n right: 1rem;\n background: none;\n border: none;\n font-size: 1rem;\n font-weight: 600;\n color: var(--w3a-colors-textMuted);\n cursor: pointer;\n padding: 24px;\n border-radius: 2rem;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n}\n\n.w3a-access-keys-modal-close:hover {\n color: var(--w3a-colors-textPrimary);\n background: var(--w3a-colors-surface);\n}\n\n.w3a-access-keys-modal-header {\n display: flex;\n justify-content: space-between;\n box-sizing: border-box;\n align-items: center;\n padding: 1rem;\n}\n\n.w3a-access-keys-modal-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--w3a-colors-textPrimary);\n margin: 0;\n}\n\n.w3a-access-keys-modal-subtitle {\n font-size: 1rem;\n font-weight: 600;\n color: var(--w3a-colors-textPrimary);\n margin: 16px 0 8px;\n}\n\n.w3a-access-keys-section {\n margin-top: 12px;\n}\n\n.theme-light .w3a-access-key-current {\n color: var(--w3a-colors-blue500, var(--w3a-colors-primary));\n}\n\n.theme-dark .w3a-access-key-current {\n color: var(--w3a-colors-primary, var(--w3a-colors-blue500));\n}\n\n\n/* Loading, error, and empty states */\n.w3a-access-keys-error,\n.w3a-access-keys-empty {\n text-align: center;\n padding: 32px;\n color: var(--w3a-colors-textMuted);\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\n.w3a-access-keys-error { color: var(--w3a-colors-error); }\n\n.w3a-access-keys-error .w3a-btn {\n margin-top: 16px;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .w3a-access-keys-modal-outer {\n padding: 8px;\n }\n\n .w3a-access-keys-modal-inner {\n max-width: 100%;\n max-height: 90vh;\n /* Prefer dynamic viewport height on capable browsers */\n @supports (height: 1dvh) {\n max-height: 90dvh;\n }\n }\n\n .w3a-access-keys-modal-header {\n padding: 16px;\n }\n\n .w3a-access-keys-modal-content {\n padding: 0 16px 16px;\n max-width: 480px;\n }\n}\n\n@media (max-width: 480px) {\n .w3a-key-item {\n max-width: 100%;\n }\n}\n\n/* Linked Devices List */\n.w3a-keys-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n overflow-x: visible;\n}\n\n.w3a-key-item {\n box-sizing: border-box;\n display: grid;\n align-items: center;\n background: var(--w3a-colors-surface);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 1rem;\n padding: 1rem;\n transition: all 0.2s ease;\n overflow: visible;\n animation: fadeInKeyItem 0.2s ease-in;\n}\n\n.w3a-key-content {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n}\n\n.w3a-key-details {\n flex: 1;\n min-width: 0;\n font-size: 0.9rem;\n font-weight: 500;\n line-height: 1rem;\n display: grid;\n gap: 0.5rem;\n}\n\n.w3a-key-details .mono {\n word-break: break-all;\n}\n\n.w3a-key-details .body {\n margin-bottom: 0;\n}\n\n.w3a-key-details .body:last-child {\n margin-bottom: 0;\n}\n\n.w3a-key-status {\n flex-shrink: 0;\n}\n\n.w3a-status-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 92px;\n padding: 2px 8px;\n background: transparent;\n color: var(--w3a-colors-success);\n border: 1px solid var(--w3a-colors-success);\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 500;\n}\n\n.theme-light .w3a-status-badge.w3a-full-access {\n color: var(--w3a-colors-blue500);\n border-color: var(--w3a-colors-blue500);\n}\n\n.w3a-key-header {\n display: flex;\n align-items: center;\n gap: var(--w3a-spacing-sm);\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-copyable-key {\n cursor: pointer;\n flex: 1;\n margin: 0;\n transition: all 0.2s ease;\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-copyable-key:hover {\n cursor: pointer;\n color: var(--w3a-colors-primary);\n}\n\n/* Tooltip styles */\n.w3a-copyable-key {\n position: relative;\n}\n\n.w3a-copy-tooltip {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: var(--w3a-colors-surface2);\n color: var(--w3a-colors-textPrimary);\n border: 1px solid var(--w3a-colors-textMuted);\n padding: 0.25rem 0.5rem;\n border-radius: 1rem;\n font-size: 0.75rem;\n white-space: nowrap;\n z-index: 1000;\n margin-bottom: 0.25rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n animation: tooltipFadeIn 0.1s ease-in-out;\n pointer-events: none;\n}\n\n.w3a-copy-tooltip::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: var(--w3a-colors-surface);\n}\n\n/* Registered timestamp styling */\n.w3a-registered {\n font-size: 0.9rem;\n color: var(--w3a-colors-textPrimary);\n}\n\n/* Theme-specific contrast for registered timestamps */\n.theme-dark .w3a-registered {\n color: var(--w3a-colors-textPrimary);\n}\n.theme-light .w3a-registered {\n color: var(--w3a-colors-textPrimary);\n}\n\n/* Inline device row layout */\n.w3a-device-row {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Device badge */\n.w3a-device-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px 8px;\n border-radius: 999px;\n border: 1px solid var(--w3a-colors-borderPrimary);\n color: #fff;\n background: var(--w3a-colors-buttonBackground);\n font-size: 0.825rem;\n font-weight: 600;\n line-height: 1;\n}\n\n.w3a-current-device-text {\n opacity: 0.85;\n}\n\n.w3a-separator {\n opacity: 0.6;\n}\n\n@keyframes tooltipFadeIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(4px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n@keyframes copiedPulse {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.05);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n/* Button System */\n.w3a-btn {\n padding: 4px 8px;\n border: none;\n border-radius: 8px;\n font-size: 0.9rem;\n font-weight: 500;\n min-width: 2rem;\n min-height: 2rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 2px;\n}\n\n.w3a-btn-primary {\n background: var(--w3a-colors-primary);\n color: #fff;\n}\n\n.w3a-btn-primary:hover:not(:disabled) {\n background: var(--w3a-colors-primaryHover);\n box-shadow: 0 2px 4px var(--w3a-shadows-sm);\n}\n\n.w3a-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.w3a-btn-danger {\n background: var(--w3a-colors-error);\n color: #fff;\n}\n\n.w3a-btn-danger:hover:not(:disabled) {\n background: var(--w3a-colors-error);\n box-shadow: 0 2px 4px var(--w3a-shadows-sm);\n}\n\n.w3a-btn-danger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.w3a-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--w3a-colors-borderPrimary);\n border-top: 2px solid var(--w3a-colors-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n/* Button-local spinner: match text size inside small buttons */\n.w3a-btn .w3a-spinner,\n.w3a-btn-primary .w3a-spinner,\n.w3a-btn-danger .w3a-spinner,\n.w3a-btn-disabled .w3a-spinner {\n width: 1em;\n height: 1em;\n border-width: 2px;\n margin-left: 0;\n}\n\n/* Danger button spinner: use white instead of primary/blue */\n.w3a-btn-danger .w3a-spinner {\n border-color: rgba(255, 255, 255, 0.4);\n border-top-color: #ffffff;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n@keyframes fadeInKeyItem {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes backdrop-opacity {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n"],"mappings":"AAAA;;AAEA;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"LinkedDevicesModal-BCrFe5p3.css","names":[],"sources":["../../../../../src/react/components/AccountMenuButton/LinkedDevicesModal.css"],"sourcesContent":["/* Linked Devices Modal Styles */\n\n.w3a-access-keys-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n /* Ensure this modal stays below the wallet iframe overlay */\n z-index: var(--w3a-z-underlay-backdrop, calc(var(--w3a-wallet-overlay-z, 2147483646) - var(--w3a-wallet-underlay-backdrop-offset, 2)));\n background: oklch(0.2 0.01 240 / 0.8);\n backdrop-filter: blur(8px);\n display: flex;\n justify-content: center;\n align-items: center;\n animation: backdrop-opacity 32ms ease-in;\n will-change: opacity;\n}\n\n.w3a-access-keys-modal-inner {\n position: relative;\n z-index: var(--w3a-z-underlay-content, calc(var(--w3a-wallet-overlay-z, 2147483646) - var(--w3a-wallet-underlay-content-offset, 1)));\n display: grid;\n place-items: center;\n height: 100%;\n width: 100%;\n max-width: 480;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n overflow: visible;\n}\n\n.w3a-access-keys-modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: 1rem;\n overflow: visible;\n min-height: 200px;\n max-width: 480px;\n min-width: 340px;\n background: var(--w3a-colors-colorBackground);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 2rem;\n}\n\n.w3a-access-keys-modal-close {\n position: absolute;\n top: 1rem;\n right: 1rem;\n background: none;\n border: none;\n font-size: 1rem;\n font-weight: 600;\n color: var(--w3a-colors-textMuted);\n cursor: pointer;\n padding: 24px;\n border-radius: 2rem;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n}\n\n.w3a-access-keys-modal-close:hover {\n color: var(--w3a-colors-textPrimary);\n background: var(--w3a-colors-surface);\n}\n\n.w3a-access-keys-modal-header {\n display: flex;\n justify-content: space-between;\n box-sizing: border-box;\n align-items: center;\n padding: 1rem;\n}\n\n.w3a-access-keys-modal-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--w3a-colors-textPrimary);\n margin: 0;\n}\n\n.w3a-access-keys-modal-subtitle {\n font-size: 1rem;\n font-weight: 600;\n color: var(--w3a-colors-textPrimary);\n margin: 16px 0 8px;\n}\n\n.w3a-access-keys-section {\n margin-top: 12px;\n}\n\n.theme-light .w3a-access-key-current {\n color: var(--w3a-colors-blue500, var(--w3a-colors-primary));\n}\n\n.theme-dark .w3a-access-key-current {\n color: var(--w3a-colors-primary, var(--w3a-colors-blue500));\n}\n\n\n/* Loading, error, and empty states */\n.w3a-access-keys-error,\n.w3a-access-keys-empty {\n text-align: center;\n padding: 32px;\n color: var(--w3a-colors-textMuted);\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\n.w3a-access-keys-error { color: var(--w3a-colors-error); }\n\n.w3a-access-keys-error .w3a-btn {\n margin-top: 16px;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .w3a-access-keys-modal-outer {\n padding: 8px;\n }\n\n .w3a-access-keys-modal-inner {\n max-width: 100%;\n max-height: 90vh;\n /* Prefer dynamic viewport height on capable browsers */\n @supports (height: 1dvh) {\n max-height: 90dvh;\n }\n }\n\n .w3a-access-keys-modal-header {\n padding: 16px;\n }\n\n .w3a-access-keys-modal-content {\n padding: 0 16px 16px;\n max-width: 480px;\n }\n}\n\n@media (max-width: 480px) {\n .w3a-key-item {\n max-width: 100%;\n }\n}\n\n/* Linked Devices List */\n.w3a-keys-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n overflow-x: visible;\n}\n\n.w3a-key-item {\n box-sizing: border-box;\n display: grid;\n align-items: center;\n background: var(--w3a-colors-surface);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 1rem;\n padding: 1rem;\n transition: all 0.2s ease;\n overflow: visible;\n animation: fadeInKeyItem 0.2s ease-in;\n}\n\n.w3a-key-content {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n}\n\n.w3a-key-details {\n flex: 1;\n min-width: 0;\n font-size: 0.9rem;\n font-weight: 500;\n line-height: 1rem;\n display: grid;\n gap: 0.5rem;\n}\n\n.w3a-key-details .mono {\n word-break: break-all;\n}\n\n.w3a-key-details .body {\n margin-bottom: 0;\n}\n\n.w3a-key-details .body:last-child {\n margin-bottom: 0;\n}\n\n.w3a-key-status {\n flex-shrink: 0;\n}\n\n.w3a-status-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 92px;\n padding: 2px 8px;\n background: transparent;\n color: var(--w3a-colors-success);\n border: 1px solid var(--w3a-colors-success);\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 500;\n}\n\n.theme-light .w3a-status-badge.w3a-full-access {\n color: var(--w3a-colors-blue500);\n border-color: var(--w3a-colors-blue500);\n}\n\n.w3a-key-header {\n display: flex;\n align-items: center;\n gap: var(--w3a-spacing-sm);\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-copyable-key {\n cursor: pointer;\n flex: 1;\n margin: 0;\n transition: all 0.2s ease;\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-copyable-key:hover {\n cursor: pointer;\n color: var(--w3a-colors-primary);\n}\n\n/* Tooltip styles */\n.w3a-copyable-key {\n position: relative;\n}\n\n.w3a-copy-tooltip {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: var(--w3a-colors-surface2);\n color: var(--w3a-colors-textPrimary);\n border: 1px solid var(--w3a-colors-textMuted);\n padding: 0.25rem 0.5rem;\n border-radius: 1rem;\n font-size: 0.75rem;\n white-space: nowrap;\n z-index: 1000;\n margin-bottom: 0.25rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n animation: tooltipFadeIn 0.1s ease-in-out;\n pointer-events: none;\n}\n\n.w3a-copy-tooltip::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: var(--w3a-colors-surface);\n}\n\n/* Registered timestamp styling */\n.w3a-registered {\n font-size: 0.9rem;\n color: var(--w3a-colors-textPrimary);\n}\n\n/* Theme-specific contrast for registered timestamps */\n.theme-dark .w3a-registered {\n color: var(--w3a-colors-textPrimary);\n}\n.theme-light .w3a-registered {\n color: var(--w3a-colors-textPrimary);\n}\n\n/* Inline device row layout */\n.w3a-device-row {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Device badge */\n.w3a-device-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px 8px;\n border-radius: 999px;\n border: 1px solid var(--w3a-colors-borderPrimary);\n color: #fff;\n background: var(--w3a-colors-buttonBackground);\n font-size: 0.825rem;\n font-weight: 600;\n line-height: 1;\n}\n\n.w3a-current-device-text {\n opacity: 0.85;\n}\n\n.w3a-separator {\n opacity: 0.6;\n}\n\n@keyframes tooltipFadeIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(4px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n@keyframes copiedPulse {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.05);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n/* Button System */\n.w3a-btn {\n padding: 4px 8px;\n border: none;\n border-radius: 8px;\n font-size: 0.9rem;\n font-weight: 500;\n min-width: 2rem;\n min-height: 2rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 2px;\n}\n\n.w3a-btn-primary {\n background: var(--w3a-colors-primary);\n color: #fff;\n}\n\n.w3a-btn-primary:hover:not(:disabled) {\n background: var(--w3a-colors-primaryHover);\n box-shadow: 0 2px 4px var(--w3a-shadows-sm);\n}\n\n.w3a-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.w3a-btn-danger {\n background: var(--w3a-colors-error);\n color: #fff;\n}\n\n.w3a-btn-danger:hover:not(:disabled) {\n background: var(--w3a-colors-error);\n box-shadow: 0 2px 4px var(--w3a-shadows-sm);\n}\n\n.w3a-btn-danger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.w3a-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--w3a-colors-borderPrimary);\n border-top: 2px solid var(--w3a-colors-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n/* Button-local spinner: match text size inside small buttons */\n.w3a-btn .w3a-spinner,\n.w3a-btn-primary .w3a-spinner,\n.w3a-btn-danger .w3a-spinner,\n.w3a-btn-disabled .w3a-spinner {\n width: 1em;\n height: 1em;\n border-width: 2px;\n margin-left: 0;\n}\n\n/* Danger button spinner: use white instead of primary/blue */\n.w3a-btn-danger .w3a-spinner {\n border-color: rgba(255, 255, 255, 0.4);\n border-top-color: #ffffff;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n@keyframes fadeInKeyItem {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes backdrop-opacity {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n"],"mappings":"AAAA;;AAEA;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -117,4 +117,4 @@ body[data-w3a-theme-pulse="1"] .w3a-profile-dropdown-menu {
117
117
  }
118
118
 
119
119
 
120
- /*# sourceMappingURL=ProfileDropdown-CEPMZ1gY.css.map*/
120
+ /*# sourceMappingURL=ProfileDropdown-CRJrtxDb.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileDropdown-CEPMZ1gY.css","names":[],"sources":["../../../../../src/react/components/AccountMenuButton/ProfileDropdown.css"],"sourcesContent":["/* ProfileDropdown component-specific styles */\n\n/* Dropdown (grid height animation with data-state) */\n.w3a-profile-dropdown-morphed {\n position: static;\n box-sizing: border-box;\n margin-top: 0;\n opacity: 0;\n visibility: hidden;\n display: grid;\n grid-template-rows: 0fr;\n grid-template-columns: 1fr;\n transition: opacity 120ms linear, grid-template-rows 140ms cubic-bezier(0.16, 1, 0.3, 1);\n border-top: 1px solid var(--w3a-colors-borderPrimary);\n}\n\n.w3a-profile-dropdown-morphed[data-state=\"open\"] {\n opacity: 1;\n visibility: visible;\n grid-template-rows: 1fr;\n grid-template-columns: 1fr;\n pointer-events: auto;\n --stagger-base: 40ms;\n}\n\n.w3a-profile-dropdown-morphed[data-state=\"closed\"] {\n pointer-events: none;\n border-top-width: 0;\n grid-template-rows: 0fr;\n height: 0;\n min-height: 0;\n width: 0;\n min-width: 0;\n max-width: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n}\n\n.w3a-profile-dropdown-morphed.hidden {\n display: none;\n}\n\n/* Inner clip and container */\n.w3a-profile-dropdown-menu {\n overflow: hidden;\n min-height: 0;\n min-width: 0;\n}\n\n/* Global theme pulse when toggling theme */\n@keyframes w3a-theme-pulse {\n 0% { filter: none; }\n 50% { filter: brightness(1.05) saturate(1.06); }\n 100% { filter: none; }\n}\nbody[data-w3a-theme-pulse=\"1\"] .w3a-profile-dropdown-menu {\n animation: w3a-theme-pulse 220ms ease;\n}\n\n/* Press feedback for menu items (animate even if state doesn't change) */\n.w3a-dropdown-menu-item {\n transition: transform 120ms ease, background-color 160ms ease, box-shadow 160ms ease;\n}\n.w3a-dropdown-menu-item:active {\n transform: scale(0.98);\n background: var(--w3a-colors-surface2);\n}\n\n/* Themed focus ring for accessibility */\n.w3a-dropdown-menu-item:focus { outline: none; }\n.w3a-dropdown-menu-item:focus-visible {\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--w3a-colors-focus), transparent 60%);\n}\n\n/* Menu item animation states */\n\n.w3a-profile-dropdown-morphed[data-state=\"closed\"] .w3a-dropdown-menu-item {\n opacity: 0;\n transform: translateX(-1rem);\n animation: none;\n}\n\n.w3a-profile-dropdown-morphed[data-state=\"open\"] .w3a-dropdown-menu-item {\n animation: w3a-profile-menu-item-enter 240ms linear forwards;\n animation-delay: calc(var(--stagger-base, 0ms) + var(--stagger-item-n, 0) * 20ms);\n}\n\n/* Menu Item Animation Keyframes */\n@keyframes w3a-profile-menu-item-enter {\n from {\n opacity: 0;\n transform: translateX(-1rem);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes w3a-profile-menu-item-exit {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(-1rem);\n }\n}\n\n/* Logout menu item specific styling */\n.w3a-logout-menu-item {\n border-top: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 0px 0px 2rem 2rem;\n margin-top: 0.5rem;\n}\n"],"mappings":"AAAA;;AAEA;AACA;AACA;AACA;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;;AAEA;AACA;AACA;;AAEA;AACA;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;;AAEA;;AAEA;AACA;AACA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"ProfileDropdown-CRJrtxDb.css","names":[],"sources":["../../../../../src/react/components/AccountMenuButton/ProfileDropdown.css"],"sourcesContent":["/* ProfileDropdown component-specific styles */\n\n/* Dropdown (grid height animation with data-state) */\n.w3a-profile-dropdown-morphed {\n position: static;\n box-sizing: border-box;\n margin-top: 0;\n opacity: 0;\n visibility: hidden;\n display: grid;\n grid-template-rows: 0fr;\n grid-template-columns: 1fr;\n transition: opacity 120ms linear, grid-template-rows 140ms cubic-bezier(0.16, 1, 0.3, 1);\n border-top: 1px solid var(--w3a-colors-borderPrimary);\n}\n\n.w3a-profile-dropdown-morphed[data-state=\"open\"] {\n opacity: 1;\n visibility: visible;\n grid-template-rows: 1fr;\n grid-template-columns: 1fr;\n pointer-events: auto;\n --stagger-base: 40ms;\n}\n\n.w3a-profile-dropdown-morphed[data-state=\"closed\"] {\n pointer-events: none;\n border-top-width: 0;\n grid-template-rows: 0fr;\n height: 0;\n min-height: 0;\n width: 0;\n min-width: 0;\n max-width: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n}\n\n.w3a-profile-dropdown-morphed.hidden {\n display: none;\n}\n\n/* Inner clip and container */\n.w3a-profile-dropdown-menu {\n overflow: hidden;\n min-height: 0;\n min-width: 0;\n}\n\n/* Global theme pulse when toggling theme */\n@keyframes w3a-theme-pulse {\n 0% { filter: none; }\n 50% { filter: brightness(1.05) saturate(1.06); }\n 100% { filter: none; }\n}\nbody[data-w3a-theme-pulse=\"1\"] .w3a-profile-dropdown-menu {\n animation: w3a-theme-pulse 220ms ease;\n}\n\n/* Press feedback for menu items (animate even if state doesn't change) */\n.w3a-dropdown-menu-item {\n transition: transform 120ms ease, background-color 160ms ease, box-shadow 160ms ease;\n}\n.w3a-dropdown-menu-item:active {\n transform: scale(0.98);\n background: var(--w3a-colors-surface2);\n}\n\n/* Themed focus ring for accessibility */\n.w3a-dropdown-menu-item:focus { outline: none; }\n.w3a-dropdown-menu-item:focus-visible {\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--w3a-colors-focus), transparent 60%);\n}\n\n/* Menu item animation states */\n\n.w3a-profile-dropdown-morphed[data-state=\"closed\"] .w3a-dropdown-menu-item {\n opacity: 0;\n transform: translateX(-1rem);\n animation: none;\n}\n\n.w3a-profile-dropdown-morphed[data-state=\"open\"] .w3a-dropdown-menu-item {\n animation: w3a-profile-menu-item-enter 240ms linear forwards;\n animation-delay: calc(var(--stagger-base, 0ms) + var(--stagger-item-n, 0) * 20ms);\n}\n\n/* Menu Item Animation Keyframes */\n@keyframes w3a-profile-menu-item-enter {\n from {\n opacity: 0;\n transform: translateX(-1rem);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes w3a-profile-menu-item-exit {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(-1rem);\n }\n}\n\n/* Logout menu item specific styling */\n.w3a-logout-menu-item {\n border-top: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 0px 0px 2rem 2rem;\n margin-top: 0.5rem;\n}\n"],"mappings":"AAAA;;AAEA;AACA;AACA;AACA;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;;AAEA;AACA;AACA;;AAEA;AACA;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;;AAEA;;AAEA;AACA;AACA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA"}
@@ -74,4 +74,4 @@
74
74
  }
75
75
 
76
76
 
77
- /*# sourceMappingURL=Web3AuthProfileButton-DopOg7Xc.css.map*/
77
+ /*# sourceMappingURL=Web3AuthProfileButton-DXFRw8ND.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"Web3AuthProfileButton-DopOg7Xc.css","names":[],"sources":["../../../../../src/react/components/AccountMenuButton/Web3AuthProfileButton.css"],"sourcesContent":["* {\n box-sizing: border-box;\n}\n\n.w3a-profile-button-morphable {\n position: relative;\n background-color: var(--w3a-colors-colorBackground);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 2rem;\n box-shadow: var(--w3a-shadows-sm);\n font-size: 14px;\n font-weight: 500;\n color: var(--w3a-colors-textPrimary);\n cursor: pointer;\n outline: none;\n overflow: visible;\n width: fit-content;\n transition: none;\n}\n\n.w3a-profile-button-morphable:hover {\n border-color: var(--w3a-colors-borderHover);\n}\n\n.w3a-profile-button-icon {\n flex-shrink: 0;\n}\n\n.w3a-profile-button-icon svg {\n overflow: visible;\n}\n\n.w3a-profile-button-username {\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.w3a-profile-button-icon {\n color: var(--w3a-colors-textSecondary);\n}\n\n.w3a-profile-button-username {\n display: block; color: var(--w3a-colors-textSecondary);\n}\n\n.w3a-profile-button-username.hidden {\n display: none;\n}\n\n.w3a-user-account--toggle-content {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: space-between;\n transition: opacity 0.15s ease-in-out;\n}\n\n.w3a-user-account--toggle-text {\n flex: 1;\n}\n\n.w3a-user-account--toggle-title {\n font-weight: 500;\n color: var(--w3a-colors-textPrimary);\n font-size: 14px;\n margin: 0;\n}\n\n.w3a-user-account--toggle-description {\n font-size: 14px;\n color: var(--w3a-colors-textMuted);\n margin: 0;\n}\n"],"mappings":"AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"Web3AuthProfileButton-DXFRw8ND.css","names":[],"sources":["../../../../../src/react/components/AccountMenuButton/Web3AuthProfileButton.css"],"sourcesContent":["* {\n box-sizing: border-box;\n}\n\n.w3a-profile-button-morphable {\n position: relative;\n background-color: var(--w3a-colors-colorBackground);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 2rem;\n box-shadow: var(--w3a-shadows-sm);\n font-size: 14px;\n font-weight: 500;\n color: var(--w3a-colors-textPrimary);\n cursor: pointer;\n outline: none;\n overflow: visible;\n width: fit-content;\n transition: none;\n}\n\n.w3a-profile-button-morphable:hover {\n border-color: var(--w3a-colors-borderHover);\n}\n\n.w3a-profile-button-icon {\n flex-shrink: 0;\n}\n\n.w3a-profile-button-icon svg {\n overflow: visible;\n}\n\n.w3a-profile-button-username {\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.w3a-profile-button-icon {\n color: var(--w3a-colors-textSecondary);\n}\n\n.w3a-profile-button-username {\n display: block; color: var(--w3a-colors-textSecondary);\n}\n\n.w3a-profile-button-username.hidden {\n display: none;\n}\n\n.w3a-user-account--toggle-content {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: space-between;\n transition: opacity 0.15s ease-in-out;\n}\n\n.w3a-user-account--toggle-text {\n flex: 1;\n}\n\n.w3a-user-account--toggle-title {\n font-weight: 500;\n color: var(--w3a-colors-textPrimary);\n font-size: 14px;\n margin: 0;\n}\n\n.w3a-user-account--toggle-description {\n font-size: 14px;\n color: var(--w3a-colors-textMuted);\n margin: 0;\n}\n"],"mappings":"AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA"}
@@ -38,4 +38,4 @@
38
38
  }
39
39
 
40
40
 
41
- /*# sourceMappingURL=TouchIcon-BQWentvJ.css.map*/
41
+ /*# sourceMappingURL=TouchIcon-DNgbAK_i.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"TouchIcon-BQWentvJ.css","names":[],"sources":["../../../../../../src/react/components/AccountMenuButton/icons/TouchIcon.css"],"sourcesContent":["/* TouchIcon specific styles and animations */\n\n.w3a-fingerprint-icon {\n transition: transform 400ms ease;\n}\n\n.w3a-fingerprint-icon path {\n /* Normalize path length so dash animations are simple */\n stroke: currentColor;\n}\n\n.w3a-fingerprint-icon.open path {\n /* Draw the fingerprint when expanding/opening */\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n animation: w3a-fp-open 1.6s ease-out 0.1s both;\n}\n\n/* Animate when closing the menu */\n.w3a-fingerprint-icon.closed path {\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n animation: w3a-fp-close 1.6s ease-out 0.1s both;\n}\n\n@keyframes w3a-fp-open {\n from { stroke-dashoffset: 1; }\n to { stroke-dashoffset: 0; }\n}\n\n@keyframes w3a-fp-close {\n from { stroke-dashoffset: 1; }\n to { stroke-dashoffset: 0; }\n}\n\n.w3a-fingerprint-icon:hover {\n transform: rotate(180deg) scale(1.2);\n}\n"],"mappings":"AAAA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA"}
1
+ {"version":3,"file":"TouchIcon-DNgbAK_i.css","names":[],"sources":["../../../../../../src/react/components/AccountMenuButton/icons/TouchIcon.css"],"sourcesContent":["/* TouchIcon specific styles and animations */\n\n.w3a-fingerprint-icon {\n transition: transform 400ms ease;\n}\n\n.w3a-fingerprint-icon path {\n /* Normalize path length so dash animations are simple */\n stroke: currentColor;\n}\n\n.w3a-fingerprint-icon.open path {\n /* Draw the fingerprint when expanding/opening */\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n animation: w3a-fp-open 1.6s ease-out 0.1s both;\n}\n\n/* Animate when closing the menu */\n.w3a-fingerprint-icon.closed path {\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n animation: w3a-fp-close 1.6s ease-out 0.1s both;\n}\n\n@keyframes w3a-fp-open {\n from { stroke-dashoffset: 1; }\n to { stroke-dashoffset: 0; }\n}\n\n@keyframes w3a-fp-close {\n from { stroke-dashoffset: 1; }\n to { stroke-dashoffset: 0; }\n}\n\n.w3a-fingerprint-icon:hover {\n transform: rotate(180deg) scale(1.2);\n}\n"],"mappings":"AAAA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA"}
@@ -951,4 +951,4 @@
951
951
  }
952
952
 
953
953
 
954
- /*# sourceMappingURL=PasskeyAuthMenu-DwrzWMYx.css.map*/
954
+ /*# sourceMappingURL=PasskeyAuthMenu-DRwSoF8q.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"PasskeyAuthMenu-DwrzWMYx.css","names":[],"sources":["../../../../../src/react/components/PasskeyAuthMenu/PasskeyAuthMenu.css"],"sourcesContent":["/* Root container */\n.w3a-signup-menu-root {\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-text { font-size: 18px; font-weight: 600; }\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/* 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}\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-link {\n font-size: 0.875rem;\n color: var(--w3a-colors-primary, #3b82f6);\n text-decoration: none;\n padding: 0 0.25rem;\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-surface);\n color: var(--w3a-colors-textPrimary);\n margin-bottom: 0.5rem;\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: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;;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;;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;AACA;AACA;;AAEA;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;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;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"}
1
+ {"version":3,"file":"PasskeyAuthMenu-DRwSoF8q.css","names":[],"sources":["../../../../../src/react/components/PasskeyAuthMenu/PasskeyAuthMenu.css"],"sourcesContent":["/* Root container */\n.w3a-signup-menu-root {\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-text { font-size: 18px; font-weight: 600; }\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/* 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}\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-link {\n font-size: 0.875rem;\n color: var(--w3a-colors-primary, #3b82f6);\n text-decoration: none;\n padding: 0 0.25rem;\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-surface);\n color: var(--w3a-colors-textPrimary);\n margin-bottom: 0.5rem;\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: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;;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;;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;AACA;AACA;;AAEA;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;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;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"}
@@ -1,6 +1,7 @@
1
1
  const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.js');
2
2
  const require_accountIds = require('../../../sdk/src/core/types/accountIds.js');
3
3
  const require_index = require('../../../sdk/src/core/IndexedDBManager/index.js');
4
+ const require_emailRecovery = require('../../../sdk/src/core/types/emailRecovery.js');
4
5
  let react = require("react");
5
6
  react = require_rolldown_runtime.__toESM(react);
6
7
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -9,6 +10,30 @@ react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
9
10
  //#region src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.tsx
10
11
  require_index.init_IndexedDBManager();
11
12
  require_accountIds.init_accountIds();
13
+ require_emailRecovery.init_emailRecovery();
14
+ function getEmailRecoveryErrorCode(err) {
15
+ const code = err?.code;
16
+ if (typeof code !== "string") return null;
17
+ return Object.values(require_emailRecovery.EmailRecoveryErrorCode).includes(code) ? code : null;
18
+ }
19
+ function getEmailRecoveryUiError(err) {
20
+ const fallback = err instanceof Error ? err.message : String(err || "");
21
+ const code = getEmailRecoveryErrorCode(err);
22
+ switch (code) {
23
+ case require_emailRecovery.EmailRecoveryErrorCode.VRF_CHALLENGE_EXPIRED: return {
24
+ message: fallback || "Timed out finalizing registration (VRF challenge expired). Please restart email recovery and try again.",
25
+ canRestart: true
26
+ };
27
+ case require_emailRecovery.EmailRecoveryErrorCode.REGISTRATION_NOT_VERIFIED: return {
28
+ message: fallback || "Registration did not verify on-chain. Please restart email recovery and try again.",
29
+ canRestart: true
30
+ };
31
+ default: return {
32
+ message: fallback || "Email recovery failed",
33
+ canRestart: false
34
+ };
35
+ }
36
+ }
12
37
  const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, emailRecoveryOptions }) => {
13
38
  const mountedRef = react.default.useRef(true);
14
39
  const mailtoAttemptTimerRef = react.default.useRef(null);
@@ -27,10 +52,12 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
27
52
  const [accountIdInput, setAccountIdInput] = react.default.useState("");
28
53
  const [recoveryEmailInput, setRecoveryEmailInput] = react.default.useState("");
29
54
  const [pendingMailtoUrl, setPendingMailtoUrl] = react.default.useState(null);
55
+ const [pendingNearPublicKey, setPendingNearPublicKey] = react.default.useState(null);
30
56
  const [mailtoUiState, setMailtoUiState] = react.default.useState("ready");
31
57
  const [statusText, setStatusText] = react.default.useState(null);
32
58
  const [pollingElapsedMs, setPollingElapsedMs] = react.default.useState(null);
33
59
  const [errorText, setErrorText] = react.default.useState(null);
60
+ const [canRestart, setCanRestart] = react.default.useState(false);
34
61
  const [accountInfo, setAccountInfo] = react.default.useState(null);
35
62
  const [accountInfoLoading, setAccountInfoLoading] = react.default.useState(false);
36
63
  const [accountInfoError, setAccountInfoError] = react.default.useState(null);
@@ -48,11 +75,13 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
48
75
  }, [accountId]);
49
76
  react.default.useEffect(() => {
50
77
  setPendingMailtoUrl(null);
78
+ setPendingNearPublicKey(null);
51
79
  setMailtoUiState("ready");
52
80
  cancelRequestedRef.current = false;
53
81
  setStatusText(null);
54
82
  setPollingElapsedMs(null);
55
83
  setErrorText(null);
84
+ setCanRestart(false);
56
85
  setAccountInfo(null);
57
86
  setAccountInfoError(null);
58
87
  setLocalRecoveryEmails([]);
@@ -69,10 +98,12 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
69
98
  };
70
99
  };
71
100
  const safeSetPendingMailtoUrl = react.default.useMemo(() => safeSet(setPendingMailtoUrl), []);
101
+ const safeSetPendingNearPublicKey = react.default.useMemo(() => safeSet(setPendingNearPublicKey), []);
72
102
  const safeSetStatusText = react.default.useMemo(() => safeSet(setStatusText), []);
73
103
  const safeSetPollingElapsedMs = react.default.useMemo(() => safeSet(setPollingElapsedMs), []);
74
104
  const safeSetErrorText = react.default.useMemo(() => safeSet(setErrorText), []);
75
105
  const safeSetIsBusy = react.default.useMemo(() => safeSet(setIsBusy), []);
106
+ const safeSetCanRestart = react.default.useMemo(() => safeSet(setCanRestart), []);
76
107
  const safeSetAccountInfo = react.default.useMemo(() => safeSet(setAccountInfo), []);
77
108
  const safeSetAccountInfoLoading = react.default.useMemo(() => safeSet(setAccountInfoLoading), []);
78
109
  const safeSetAccountInfoError = react.default.useMemo(() => safeSet(setAccountInfoError), []);
@@ -101,9 +132,11 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
101
132
  if (ev?.phase === "email-recovery-error" || ev?.status === "error") {
102
133
  const raw = ev?.error || ev?.message || "Email recovery failed";
103
134
  safeSetErrorText(String(raw));
135
+ safeSetCanRestart(false);
104
136
  }
105
137
  }, [
106
138
  emailRecoveryOptions,
139
+ safeSetCanRestart,
107
140
  safeSetErrorText,
108
141
  safeSetExplorerToast,
109
142
  safeSetPollingElapsedMs,
@@ -279,9 +312,11 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
279
312
  safeSetIsBusy(true);
280
313
  cancelRequestedRef.current = false;
281
314
  safeSetErrorText(null);
315
+ safeSetCanRestart(false);
282
316
  safeSetStatusText(null);
283
317
  safeSetPollingElapsedMs(null);
284
318
  safeSetPendingMailtoUrl(null);
319
+ safeSetPendingNearPublicKey(null);
285
320
  safeSetMailtoUiState("ready");
286
321
  let didForwardError = false;
287
322
  try {
@@ -300,6 +335,7 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
300
335
  }
301
336
  });
302
337
  safeSetPendingMailtoUrl(result.mailtoUrl);
338
+ safeSetPendingNearPublicKey(result.nearPublicKey);
303
339
  safeSetStatusText("Recovery email draft ready. If it didn’t open automatically, click “Open recovery email draft”. Waiting for verification…");
304
340
  attemptOpenMailtoAuto(result.mailtoUrl);
305
341
  const finalizePromise = tatchiPasskey.finalizeEmailRecovery({
@@ -309,7 +345,9 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
309
345
  onEvent,
310
346
  onError: (err) => {
311
347
  if (cancelRequestedRef.current) return;
312
- safeSetErrorText(err?.message || "Failed to finalize email recovery");
348
+ const uiError = getEmailRecoveryUiError(err);
349
+ safeSetErrorText(uiError.message || "Failed to finalize email recovery");
350
+ safeSetCanRestart(uiError.canRestart);
313
351
  didForwardError = true;
314
352
  emailRecoveryOptions?.onError?.(err);
315
353
  },
@@ -336,10 +374,14 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
336
374
  safeSetStatusText(null);
337
375
  safeSetPollingElapsedMs(null);
338
376
  safeSetPendingMailtoUrl(null);
377
+ safeSetPendingNearPublicKey(null);
339
378
  safeSetMailtoUiState("ready");
379
+ safeSetCanRestart(false);
340
380
  return;
341
381
  }
342
- safeSetErrorText(err?.message || "Failed to start email recovery");
382
+ const uiError = getEmailRecoveryUiError(err);
383
+ safeSetErrorText(uiError.message || "Failed to start email recovery");
384
+ safeSetCanRestart(uiError.canRestart);
343
385
  if (!didForwardError && err instanceof Error) emailRecoveryOptions?.onError?.(err);
344
386
  } finally {
345
387
  safeSetIsBusy(false);
@@ -360,6 +402,40 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
360
402
  attemptOpenMailtoAuto,
361
403
  tatchiPasskey
362
404
  ]);
405
+ const handleRestart = react.default.useCallback(async () => {
406
+ const normalizedAccountId = (accountIdInput || "").trim();
407
+ if (!normalizedAccountId) return;
408
+ safeSetIsBusy(true);
409
+ try {
410
+ cancelRequestedRef.current = true;
411
+ await tatchiPasskey.cancelEmailRecovery({
412
+ accountId: normalizedAccountId,
413
+ nearPublicKey: pendingNearPublicKey || void 0
414
+ }).catch(() => {});
415
+ safeSetErrorText(null);
416
+ safeSetStatusText(null);
417
+ safeSetPollingElapsedMs(null);
418
+ safeSetPendingMailtoUrl(null);
419
+ safeSetPendingNearPublicKey(null);
420
+ safeSetMailtoUiState("ready");
421
+ safeSetCanRestart(false);
422
+ } finally {
423
+ cancelRequestedRef.current = false;
424
+ safeSetIsBusy(false);
425
+ }
426
+ }, [
427
+ accountIdInput,
428
+ pendingNearPublicKey,
429
+ safeSetCanRestart,
430
+ safeSetErrorText,
431
+ safeSetIsBusy,
432
+ safeSetMailtoUiState,
433
+ safeSetPendingMailtoUrl,
434
+ safeSetPendingNearPublicKey,
435
+ safeSetPollingElapsedMs,
436
+ safeSetStatusText,
437
+ tatchiPasskey
438
+ ]);
363
439
  const summaryLine = accountInfoLoading ? "Checking if account has recovery emails configured..." : accountInfo && !accountInfoError ? `Recovery emails configured: ${accountInfo.emailsCount}` : "\xA0";
364
440
  const noRecoveryEmailsConfigured = !accountInfoLoading && !accountInfoError && !!accountInfo && accountInfo.emailsCount === 0;
365
441
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -371,7 +447,7 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
371
447
  }),
372
448
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
373
449
  className: "w3a-email-recovery-help",
374
- children: "Send a special recovery email from your recovery email address. Your account will be recovered with a new key once the email is verified."
450
+ children: "Send a recovery email from your registered email address. Your account will be recovered with a new key once the email is verified."
375
451
  }),
376
452
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
377
453
  className: "w3a-email-recovery-field",
@@ -441,22 +517,32 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
441
517
  }),
442
518
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
443
519
  className: "w3a-email-recovery-actions",
444
- children: [(!pendingMailtoUrl || !isBusy) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
445
- onClick: handleStart,
446
- className: "w3a-link-device-btn w3a-link-device-btn-primary",
447
- disabled: isBusy || noRecoveryEmailsConfigured,
448
- children: noRecoveryEmailsConfigured ? "No recovery emails configured" : isBusy ? "Working…" : "Start Email Recovery"
449
- }), pendingMailtoUrl && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
450
- type: "button",
451
- onClick: () => attemptOpenMailtoFromUserGesture(pendingMailtoUrl),
452
- className: "w3a-link-device-btn w3a-link-device-btn-primary",
453
- disabled: mailtoUiState === "opening",
454
- "aria-busy": mailtoUiState === "opening",
455
- children: [mailtoUiState === "opening" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
456
- className: "w3a-spinner",
457
- "aria-hidden": "true"
458
- }), mailtoUiState === "opening" ? "Opening email…" : "Open recovery email draft"]
459
- })]
520
+ children: [
521
+ (!pendingMailtoUrl || !isBusy) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
522
+ onClick: handleStart,
523
+ className: "w3a-link-device-btn w3a-link-device-btn-primary",
524
+ disabled: isBusy || noRecoveryEmailsConfigured,
525
+ children: noRecoveryEmailsConfigured ? "No recovery emails configured" : isBusy ? "Working…" : "Start Email Recovery"
526
+ }),
527
+ pendingMailtoUrl && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
528
+ type: "button",
529
+ onClick: () => attemptOpenMailtoFromUserGesture(pendingMailtoUrl),
530
+ className: "w3a-link-device-btn w3a-link-device-btn-primary",
531
+ disabled: mailtoUiState === "opening",
532
+ "aria-busy": mailtoUiState === "opening",
533
+ children: [mailtoUiState === "opening" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
534
+ className: "w3a-spinner",
535
+ "aria-hidden": "true"
536
+ }), mailtoUiState === "opening" ? "Opening email…" : "Open recovery email draft"]
537
+ }),
538
+ errorText && canRestart && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
539
+ type: "button",
540
+ onClick: handleRestart,
541
+ className: "w3a-link-device-btn",
542
+ disabled: isBusy,
543
+ children: "Restart email recovery"
544
+ })
545
+ ]
460
546
  }),
461
547
  (errorText || statusText || explorerToast) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
462
548
  className: `w3a-email-recovery-status${errorText ? " is-error" : ""}`,
@@ -470,13 +556,13 @@ const EmailRecoverySlide = ({ tatchiPasskey, accountId, refreshLoginState, email
470
556
  "s)."
471
557
  ]
472
558
  }),
473
- explorerToast && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("br", {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
559
+ explorerToast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
474
560
  className: "w3a-email-recovery-link",
475
561
  href: explorerToast.url,
476
562
  target: "_blank",
477
563
  rel: "noopener noreferrer",
478
564
  children: "View on explorer"
479
- })] })
565
+ }) })
480
566
  ]
481
567
  })
482
568
  ]