@tatchi-xyz/sdk 0.16.0 → 0.18.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 (501) hide show
  1. package/dist/cjs/core/EmailRecovery/emailRecoveryPendingStore.js +69 -0
  2. package/dist/cjs/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  3. package/dist/cjs/core/EmailRecovery/index.js +32 -13
  4. package/dist/cjs/core/EmailRecovery/index.js.map +1 -1
  5. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js +35 -36
  6. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  7. package/dist/cjs/core/NearClient.js +2 -1
  8. package/dist/cjs/core/NearClient.js.map +1 -1
  9. package/dist/cjs/core/TatchiPasskey/emailRecovery.js +557 -377
  10. package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
  11. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js +1 -0
  12. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  13. package/dist/cjs/core/TatchiPasskey/index.js +26 -0
  14. package/dist/cjs/core/TatchiPasskey/index.js.map +1 -1
  15. package/dist/cjs/core/TatchiPasskey/linkDevice.js +2 -0
  16. package/dist/cjs/core/TatchiPasskey/linkDevice.js.map +1 -1
  17. package/dist/cjs/core/TatchiPasskey/login.js +15 -4
  18. package/dist/cjs/core/TatchiPasskey/login.js.map +1 -1
  19. package/dist/cjs/core/TatchiPasskey/recoverAccount.js +1 -0
  20. package/dist/cjs/core/TatchiPasskey/recoverAccount.js.map +1 -1
  21. package/dist/cjs/core/TatchiPasskey/relay.js +23 -1
  22. package/dist/cjs/core/TatchiPasskey/relay.js.map +1 -1
  23. package/dist/cjs/core/TatchiPasskey/scanDevice.js +1 -0
  24. package/dist/cjs/core/TatchiPasskey/scanDevice.js.map +1 -1
  25. package/dist/cjs/core/WalletIframe/client/IframeTransport.js +3 -0
  26. package/dist/cjs/core/WalletIframe/client/IframeTransport.js.map +1 -1
  27. package/dist/cjs/core/WalletIframe/client/router.js +15 -2
  28. package/dist/cjs/core/WalletIframe/client/router.js.map +1 -1
  29. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  30. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  31. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  32. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  33. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +10 -1
  34. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js.map +1 -1
  35. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +1 -0
  36. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  37. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +1 -0
  38. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  39. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +1 -0
  40. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  41. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +1 -0
  42. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  43. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  44. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  45. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +1 -0
  46. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  47. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +1 -0
  48. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  49. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +1 -0
  50. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  51. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -0
  52. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  53. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/index.js +1 -0
  54. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  55. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  56. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  57. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +6 -0
  58. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  59. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  60. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  61. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -0
  62. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  63. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +1 -0
  64. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  65. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +4 -15
  66. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  67. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +1 -0
  68. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  69. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +1 -0
  70. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  71. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +1 -0
  72. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  73. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/index.js +17 -0
  74. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  75. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +64 -54
  76. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  77. package/dist/cjs/core/WebAuthnManager/credentialsHelpers.js +12 -2
  78. package/dist/cjs/core/WebAuthnManager/credentialsHelpers.js.map +1 -1
  79. package/dist/cjs/core/WebAuthnManager/index.js +6 -1
  80. package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
  81. package/dist/cjs/core/WebAuthnManager/touchIdPrompt.js +209 -201
  82. package/dist/cjs/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  83. package/dist/cjs/core/WebAuthnManager/userHandle.js +2 -1
  84. package/dist/cjs/core/WebAuthnManager/userHandle.js.map +1 -1
  85. package/dist/cjs/core/defaultConfigs.js +1 -1
  86. package/dist/cjs/core/defaultConfigs.js.map +1 -1
  87. package/dist/cjs/core/rpcCalls.js +8 -0
  88. package/dist/cjs/core/rpcCalls.js.map +1 -1
  89. package/dist/cjs/core/types/vrf-worker.js +10 -1
  90. package/dist/cjs/core/types/vrf-worker.js.map +1 -1
  91. package/dist/cjs/index.js +6 -2
  92. package/dist/cjs/index.js.map +1 -1
  93. package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-STvIsylA.css → LinkedDevicesModal-CSSowiHP.css} +1 -1
  94. package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-STvIsylA.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map} +1 -1
  95. package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-iARgUwK1.css → ProfileDropdown-CEPMZ1gY.css} +1 -1
  96. package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-iARgUwK1.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map} +1 -1
  97. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css → Web3AuthProfileButton-DopOg7Xc.css} +1 -1
  98. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css.map → Web3AuthProfileButton-DopOg7Xc.css.map} +1 -1
  99. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css → TouchIcon-BQWentvJ.css} +1 -1
  100. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css.map → TouchIcon-BQWentvJ.css.map} +1 -1
  101. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css → PasskeyAuthMenu-DwrzWMYx.css} +14 -1
  102. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css.map → PasskeyAuthMenu-DwrzWMYx.css.map} +1 -1
  103. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +122 -53
  104. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  105. package/dist/cjs/react/components/{ShowQRCode-DCnR__fx.css → ShowQRCode-CCN4h6Uv.css} +1 -1
  106. package/dist/cjs/react/components/{ShowQRCode-DCnR__fx.css.map → ShowQRCode-CCN4h6Uv.css.map} +1 -1
  107. package/dist/cjs/react/deviceDetection.js +75 -92
  108. package/dist/cjs/react/deviceDetection.js.map +1 -1
  109. package/dist/cjs/react/hooks/useQRCamera.js +1 -0
  110. package/dist/cjs/react/hooks/useQRCamera.js.map +1 -1
  111. package/dist/cjs/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js +69 -0
  112. package/dist/cjs/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  113. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +32 -13
  114. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  115. package/dist/cjs/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js +35 -36
  116. package/dist/cjs/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  117. package/dist/cjs/react/sdk/src/core/NearClient.js +2 -1
  118. package/dist/cjs/react/sdk/src/core/NearClient.js.map +1 -1
  119. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +557 -377
  120. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  121. package/dist/cjs/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +1 -0
  122. package/dist/cjs/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  123. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js +26 -0
  124. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  125. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -0
  126. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  127. package/dist/cjs/react/sdk/src/core/TatchiPasskey/login.js +15 -4
  128. package/dist/cjs/react/sdk/src/core/TatchiPasskey/login.js.map +1 -1
  129. package/dist/cjs/react/sdk/src/core/TatchiPasskey/recoverAccount.js +1 -0
  130. package/dist/cjs/react/sdk/src/core/TatchiPasskey/recoverAccount.js.map +1 -1
  131. package/dist/cjs/react/sdk/src/core/TatchiPasskey/relay.js +23 -1
  132. package/dist/cjs/react/sdk/src/core/TatchiPasskey/relay.js.map +1 -1
  133. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js +1 -0
  134. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  135. package/dist/cjs/react/sdk/src/core/WalletIframe/client/IframeTransport.js +3 -0
  136. package/dist/cjs/react/sdk/src/core/WalletIframe/client/IframeTransport.js.map +1 -1
  137. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js +15 -2
  138. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  139. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  140. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  141. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  142. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  143. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +10 -1
  144. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js.map +1 -1
  145. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +1 -0
  146. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  147. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +1 -0
  148. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  149. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +1 -0
  150. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  151. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +1 -0
  152. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  153. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  154. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  155. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +1 -0
  156. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  157. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +1 -0
  158. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  159. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +1 -0
  160. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  161. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -0
  162. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  163. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js +1 -0
  164. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  165. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  166. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  167. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +6 -0
  168. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  169. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  170. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  171. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -0
  172. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  173. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +1 -0
  174. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  175. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +4 -15
  176. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  177. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +1 -0
  178. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  179. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +1 -0
  180. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  181. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +1 -0
  182. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  183. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js +17 -0
  184. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  185. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +64 -54
  186. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  187. package/dist/cjs/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js +12 -2
  188. package/dist/cjs/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js.map +1 -1
  189. package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js +6 -1
  190. package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
  191. package/dist/cjs/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js +209 -201
  192. package/dist/cjs/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  193. package/dist/cjs/react/sdk/src/core/WebAuthnManager/userHandle.js +2 -1
  194. package/dist/cjs/react/sdk/src/core/WebAuthnManager/userHandle.js.map +1 -1
  195. package/dist/cjs/react/sdk/src/core/defaultConfigs.js +1 -1
  196. package/dist/cjs/react/sdk/src/core/defaultConfigs.js.map +1 -1
  197. package/dist/cjs/react/sdk/src/core/rpcCalls.js +8 -0
  198. package/dist/cjs/react/sdk/src/core/rpcCalls.js.map +1 -1
  199. package/dist/cjs/react/sdk/src/core/types/vrf-worker.js +10 -1
  200. package/dist/cjs/react/sdk/src/core/types/vrf-worker.js.map +1 -1
  201. package/dist/cjs/react/sdk/src/utils/index.js +13 -3
  202. package/dist/cjs/server/email-recovery/emailEncryptor.js +11 -0
  203. package/dist/cjs/server/email-recovery/emailEncryptor.js.map +1 -1
  204. package/dist/cjs/server/email-recovery/emailParsers.js +57 -0
  205. package/dist/cjs/server/email-recovery/emailParsers.js.map +1 -1
  206. package/dist/cjs/server/email-recovery/index.js +1 -1
  207. package/dist/cjs/server/email-recovery/index.js.map +1 -1
  208. package/dist/cjs/server/email-recovery/rpcCalls.js +14 -1
  209. package/dist/cjs/server/email-recovery/rpcCalls.js.map +1 -1
  210. package/dist/cjs/server/index.js +1 -0
  211. package/dist/cjs/server/router/cloudflare.js.map +1 -1
  212. package/dist/cjs/server/router/express.js.map +1 -1
  213. package/dist/cjs/server/sdk/src/core/defaultConfigs.js +1 -1
  214. package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
  215. package/dist/cjs/utils/index.js +13 -3
  216. package/dist/esm/core/EmailRecovery/emailRecoveryPendingStore.js +63 -0
  217. package/dist/esm/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  218. package/dist/esm/core/EmailRecovery/index.js +28 -14
  219. package/dist/esm/core/EmailRecovery/index.js.map +1 -1
  220. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js +35 -36
  221. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  222. package/dist/esm/core/NearClient.js +2 -1
  223. package/dist/esm/core/NearClient.js.map +1 -1
  224. package/dist/esm/core/TatchiPasskey/emailRecovery.js +557 -377
  225. package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
  226. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js +2 -1
  227. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  228. package/dist/esm/core/TatchiPasskey/index.js +28 -2
  229. package/dist/esm/core/TatchiPasskey/index.js.map +1 -1
  230. package/dist/esm/core/TatchiPasskey/linkDevice.js +4 -2
  231. package/dist/esm/core/TatchiPasskey/linkDevice.js.map +1 -1
  232. package/dist/esm/core/TatchiPasskey/login.js +13 -7
  233. package/dist/esm/core/TatchiPasskey/login.js.map +1 -1
  234. package/dist/esm/core/TatchiPasskey/recoverAccount.js +2 -1
  235. package/dist/esm/core/TatchiPasskey/recoverAccount.js.map +1 -1
  236. package/dist/esm/core/TatchiPasskey/relay.js +23 -1
  237. package/dist/esm/core/TatchiPasskey/relay.js.map +1 -1
  238. package/dist/esm/core/TatchiPasskey/scanDevice.js +2 -1
  239. package/dist/esm/core/TatchiPasskey/scanDevice.js.map +1 -1
  240. package/dist/esm/core/WalletIframe/client/IframeTransport.js +4 -1
  241. package/dist/esm/core/WalletIframe/client/IframeTransport.js.map +1 -1
  242. package/dist/esm/core/WalletIframe/client/router.js +16 -3
  243. package/dist/esm/core/WalletIframe/client/router.js.map +1 -1
  244. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  245. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  246. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  247. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  248. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +6 -2
  249. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +2 -1
  250. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  251. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +2 -1
  252. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  253. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +2 -1
  254. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  255. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +2 -1
  256. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  257. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  258. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  259. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +2 -1
  260. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  261. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +2 -1
  262. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  263. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +2 -1
  264. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  265. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +4 -2
  266. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  267. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/index.js +2 -1
  268. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  269. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  270. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  271. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +8 -2
  272. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  273. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  274. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  275. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +2 -1
  276. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  277. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +2 -1
  278. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  279. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +5 -16
  280. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  281. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +2 -1
  282. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  283. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +2 -1
  284. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  285. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +2 -1
  286. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  287. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/index.js +12 -0
  288. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  289. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +61 -55
  290. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  291. package/dist/esm/core/WebAuthnManager/credentialsHelpers.js +8 -3
  292. package/dist/esm/core/WebAuthnManager/index.js +8 -3
  293. package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
  294. package/dist/esm/core/WebAuthnManager/touchIdPrompt.js +207 -204
  295. package/dist/esm/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  296. package/dist/esm/core/WebAuthnManager/userHandle.js +2 -1
  297. package/dist/esm/core/WebAuthnManager/userHandle.js.map +1 -1
  298. package/dist/esm/core/defaultConfigs.js +1 -1
  299. package/dist/esm/core/defaultConfigs.js.map +1 -1
  300. package/dist/esm/core/rpcCalls.js +8 -1
  301. package/dist/esm/core/rpcCalls.js.map +1 -1
  302. package/dist/esm/core/types/vrf-worker.js +6 -2
  303. package/dist/esm/index.js +4 -1
  304. package/dist/esm/index.js.map +1 -1
  305. package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-STvIsylA.css → LinkedDevicesModal-CSSowiHP.css} +1 -1
  306. package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-STvIsylA.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map} +1 -1
  307. package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-iARgUwK1.css → ProfileDropdown-CEPMZ1gY.css} +1 -1
  308. package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-iARgUwK1.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map} +1 -1
  309. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css → Web3AuthProfileButton-DopOg7Xc.css} +1 -1
  310. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css.map → Web3AuthProfileButton-DopOg7Xc.css.map} +1 -1
  311. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css → TouchIcon-BQWentvJ.css} +1 -1
  312. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css.map → TouchIcon-BQWentvJ.css.map} +1 -1
  313. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css → PasskeyAuthMenu-DwrzWMYx.css} +14 -1
  314. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css.map → PasskeyAuthMenu-DwrzWMYx.css.map} +1 -1
  315. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +123 -54
  316. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  317. package/dist/esm/react/components/{ShowQRCode-DCnR__fx.css → ShowQRCode-CCN4h6Uv.css} +1 -1
  318. package/dist/esm/react/components/{ShowQRCode-DCnR__fx.css.map → ShowQRCode-CCN4h6Uv.css.map} +1 -1
  319. package/dist/esm/react/deviceDetection.js +72 -93
  320. package/dist/esm/react/deviceDetection.js.map +1 -1
  321. package/dist/esm/react/hooks/useQRCamera.js +2 -1
  322. package/dist/esm/react/hooks/useQRCamera.js.map +1 -1
  323. package/dist/esm/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js +63 -0
  324. package/dist/esm/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  325. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +28 -14
  326. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  327. package/dist/esm/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js +35 -36
  328. package/dist/esm/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  329. package/dist/esm/react/sdk/src/core/NearClient.js +2 -1
  330. package/dist/esm/react/sdk/src/core/NearClient.js.map +1 -1
  331. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +557 -377
  332. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  333. package/dist/esm/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +2 -1
  334. package/dist/esm/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  335. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js +28 -2
  336. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  337. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js +4 -2
  338. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  339. package/dist/esm/react/sdk/src/core/TatchiPasskey/login.js +13 -7
  340. package/dist/esm/react/sdk/src/core/TatchiPasskey/login.js.map +1 -1
  341. package/dist/esm/react/sdk/src/core/TatchiPasskey/recoverAccount.js +2 -1
  342. package/dist/esm/react/sdk/src/core/TatchiPasskey/recoverAccount.js.map +1 -1
  343. package/dist/esm/react/sdk/src/core/TatchiPasskey/relay.js +23 -1
  344. package/dist/esm/react/sdk/src/core/TatchiPasskey/relay.js.map +1 -1
  345. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js +2 -1
  346. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  347. package/dist/esm/react/sdk/src/core/WalletIframe/client/IframeTransport.js +4 -1
  348. package/dist/esm/react/sdk/src/core/WalletIframe/client/IframeTransport.js.map +1 -1
  349. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js +16 -3
  350. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  351. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  352. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  353. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  354. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  355. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +6 -2
  356. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +2 -1
  357. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  358. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +2 -1
  359. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  360. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +2 -1
  361. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  362. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +2 -1
  363. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  364. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  365. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  366. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +2 -1
  367. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  368. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +2 -1
  369. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  370. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +2 -1
  371. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  372. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +4 -2
  373. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  374. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js +2 -1
  375. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  376. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  377. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  378. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +8 -2
  379. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  380. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  381. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  382. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +2 -1
  383. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  384. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +2 -1
  385. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  386. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +5 -16
  387. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  388. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +2 -1
  389. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  390. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +2 -1
  391. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  392. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +2 -1
  393. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  394. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js +12 -0
  395. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  396. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +61 -55
  397. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  398. package/dist/esm/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js +8 -3
  399. package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js +8 -3
  400. package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
  401. package/dist/esm/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js +207 -204
  402. package/dist/esm/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  403. package/dist/esm/react/sdk/src/core/WebAuthnManager/userHandle.js +2 -1
  404. package/dist/esm/react/sdk/src/core/WebAuthnManager/userHandle.js.map +1 -1
  405. package/dist/esm/react/sdk/src/core/defaultConfigs.js +1 -1
  406. package/dist/esm/react/sdk/src/core/defaultConfigs.js.map +1 -1
  407. package/dist/esm/react/sdk/src/core/rpcCalls.js +8 -1
  408. package/dist/esm/react/sdk/src/core/rpcCalls.js.map +1 -1
  409. package/dist/esm/react/sdk/src/core/types/vrf-worker.js +6 -2
  410. package/dist/esm/react/sdk/src/utils/index.js +10 -4
  411. package/dist/esm/react/styles/styles.css +13 -0
  412. package/dist/esm/sdk/{safari-fallbacks-oQKu9xUs.js → WebAuthnFallbacks-Bl4BTsNt.js} +131 -135
  413. package/dist/esm/sdk/{createAdapters-pNiL2KNq.js → createAdapters-BumKM2ft.js} +59 -54
  414. package/dist/esm/sdk/createAdapters-BumKM2ft.js.map +1 -0
  415. package/dist/esm/sdk/{createAdapters-BWLe9Ddo.js → createAdapters-qVGD6i0g.js} +10 -3
  416. package/dist/esm/sdk/{defaultConfigs-VzvDejmy.js → defaultConfigs-DpslkAQd.js} +1 -1
  417. package/dist/esm/sdk/{getDeviceNumber-CkWRT17I.js → getDeviceNumber-fXizNGQl.js} +2 -2
  418. package/dist/esm/sdk/getDeviceNumber-fXizNGQl.js.map +1 -0
  419. package/dist/esm/sdk/{getDeviceNumber-CfmlgfMX.js → getDeviceNumber-zsOHT_Um.js} +6 -3
  420. package/dist/esm/sdk/{localOnly-DnpSyDaF.js → localOnly-Byi3AK7A.js} +2 -2
  421. package/dist/esm/sdk/{localOnly-DnpSyDaF.js.map → localOnly-Byi3AK7A.js.map} +1 -1
  422. package/dist/esm/sdk/{localOnly-BdumO2st.js → localOnly-pXMTqh1m.js} +5 -4
  423. package/dist/esm/sdk/offline-export-app.js +46 -44
  424. package/dist/esm/sdk/offline-export-app.js.map +1 -1
  425. package/dist/esm/sdk/{overlay-BTqPGG-o.js → overlay-ZGbucXIa.js} +2 -0
  426. package/dist/esm/sdk/{registration-C633u6x8.js → registration-CBiS4Ua_.js} +2 -2
  427. package/dist/esm/sdk/{registration-C633u6x8.js.map → registration-CBiS4Ua_.js.map} +1 -1
  428. package/dist/esm/sdk/{registration-xyYUFRqk.js → registration-DLPLsGCz.js} +5 -4
  429. package/dist/esm/sdk/{requestHelpers-DLBGBHMw.js → requestHelpers-Dh1hEYL9.js} +206 -204
  430. package/dist/esm/sdk/{router-BG6KC_p7.js → router-DuGYOd3G.js} +19 -4
  431. package/dist/esm/sdk/{rpcCalls-fLObBbbz.js → rpcCalls-BQrJMTdg.js} +3 -3
  432. package/dist/esm/sdk/{rpcCalls-CAU5XYEF.js → rpcCalls-YVeUVMk2.js} +9 -2
  433. package/dist/esm/sdk/{transactions-jH38BZ-Q.js → transactions-BIqKZeR0.js} +6 -18
  434. package/dist/esm/sdk/transactions-BIqKZeR0.js.map +1 -0
  435. package/dist/esm/sdk/{transactions-CzZAt1Yn.js → transactions-Bk-VavcV.js} +10 -21
  436. package/dist/esm/sdk/tx-confirm-ui.js +53 -53
  437. package/dist/esm/sdk/{tx-confirmer-wrapper-CqfVBUaA.js → tx-confirmer-wrapper-lHNgz9i4.js} +53 -53
  438. package/dist/esm/sdk/tx-confirmer.css +6 -4
  439. package/dist/esm/sdk/w3a-tx-confirmer.js +1 -1
  440. package/dist/esm/sdk/wallet-iframe-host.js +782 -447
  441. package/dist/esm/server/email-recovery/emailEncryptor.js +11 -1
  442. package/dist/esm/server/email-recovery/emailEncryptor.js.map +1 -1
  443. package/dist/esm/server/email-recovery/emailParsers.js +55 -1
  444. package/dist/esm/server/email-recovery/emailParsers.js.map +1 -1
  445. package/dist/esm/server/email-recovery/index.js +2 -2
  446. package/dist/esm/server/email-recovery/index.js.map +1 -1
  447. package/dist/esm/server/email-recovery/rpcCalls.js +14 -1
  448. package/dist/esm/server/email-recovery/rpcCalls.js.map +1 -1
  449. package/dist/esm/server/index.js +2 -2
  450. package/dist/esm/server/router/cloudflare.js.map +1 -1
  451. package/dist/esm/server/router/express.js.map +1 -1
  452. package/dist/esm/server/sdk/src/core/defaultConfigs.js +1 -1
  453. package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
  454. package/dist/esm/utils/index.js +10 -4
  455. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker.js +3 -0
  456. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  457. package/dist/types/src/core/EmailRecovery/emailRecoveryPendingStore.d.ts +25 -0
  458. package/dist/types/src/core/EmailRecovery/emailRecoveryPendingStore.d.ts.map +1 -0
  459. package/dist/types/src/core/EmailRecovery/index.d.ts +1 -0
  460. package/dist/types/src/core/EmailRecovery/index.d.ts.map +1 -1
  461. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts +11 -21
  462. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts.map +1 -1
  463. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +45 -5
  464. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
  465. package/dist/types/src/core/TatchiPasskey/index.d.ts +10 -2
  466. package/dist/types/src/core/TatchiPasskey/index.d.ts.map +1 -1
  467. package/dist/types/src/core/TatchiPasskey/relay.d.ts +2 -1
  468. package/dist/types/src/core/TatchiPasskey/relay.d.ts.map +1 -1
  469. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts +4 -0
  470. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts.map +1 -1
  471. package/dist/types/src/core/WalletIframe/client/router.d.ts +7 -3
  472. package/dist/types/src/core/WalletIframe/client/router.d.ts.map +1 -1
  473. package/dist/types/src/core/WalletIframe/host/wallet-iframe-handlers.d.ts.map +1 -1
  474. package/dist/types/src/core/WalletIframe/shared/messages.d.ts +6 -2
  475. package/dist/types/src/core/WalletIframe/shared/messages.d.ts.map +1 -1
  476. package/dist/types/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.d.ts.map +1 -1
  477. package/dist/types/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.d.ts.map +1 -1
  478. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.d.ts.map +1 -1
  479. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.d.ts.map +1 -1
  480. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.d.ts.map +1 -1
  481. package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
  482. package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
  483. package/dist/types/src/core/rpcCalls.d.ts +9 -0
  484. package/dist/types/src/core/rpcCalls.d.ts.map +1 -1
  485. package/dist/types/src/index.d.ts +1 -0
  486. package/dist/types/src/index.d.ts.map +1 -1
  487. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  488. package/dist/types/src/server/email-recovery/emailEncryptor.d.ts +4 -0
  489. package/dist/types/src/server/email-recovery/emailEncryptor.d.ts.map +1 -1
  490. package/dist/types/src/server/email-recovery/emailParsers.d.ts +7 -0
  491. package/dist/types/src/server/email-recovery/emailParsers.d.ts.map +1 -1
  492. package/dist/types/src/server/email-recovery/index.d.ts +1 -1
  493. package/dist/types/src/server/email-recovery/rpcCalls.d.ts +1 -1
  494. package/dist/types/src/server/email-recovery/rpcCalls.d.ts.map +1 -1
  495. package/dist/types/src/wasm_vrf_worker/pkg/wasm_vrf_worker.d.ts.map +1 -1
  496. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  497. package/dist/workers/web3authn-vrf.worker.js +3 -0
  498. package/package.json +1 -1
  499. package/dist/esm/sdk/createAdapters-pNiL2KNq.js.map +0 -1
  500. package/dist/esm/sdk/getDeviceNumber-CkWRT17I.js.map +0 -1
  501. package/dist/esm/sdk/transactions-jH38BZ-Q.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAdapters-BumKM2ft.js","names":["reservedNonces: string[] | undefined","fallback: TransactionContext","e","n","lastError: unknown","s","n","p","toMove: Node[]","m","unit","pct","e","s","vv: any","v","s","t","e","r","i","c","l","p","v","m","x","o","n","f","v","e","e","clickedReceiverLink: HTMLAnchorElement | null","t","root","repeat","c","content: TemplateResult | undefined","actionNodes: TreeNode[]","label: string","actionFolders: TreeNode[]","txFolders: TreeNode[]","TxTree","p","s","e","treeTheme: 'dark' | 'light'","LitElement","TxConfirmContentElement","PadlockIconElement","DrawerElement","e","p","vars: Record<string, string>","p","vars: Record<string, string>","TxConfirmContentElement","TxTree","HaloBorderElement","PasskeyHaloLoadingElement","e","p","DEFAULT_VARIANT: Variant","createRef","ref","error: string | undefined","detail: { confirmed: false; error?: string }","txs: TransactionInputWasm[]","v: 'modal' | 'drawer'","v","normalized: TransactionInputWasm[]","handle","reservedNonces: string[] | undefined","confirmHandle: ConfirmUIHandle | undefined"],"sources":["../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/near.ts","../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.ts","../../../src/core/WalletIframe/events.ts","../../../src/core/WebAuthnManager/LitComponents/confirm-ui-types.ts","../../../src/core/WebAuthnManager/LitComponents/Drawer/index.ts","../../../../node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/repeat.js","../../../src/core/WebAuthnManager/LitComponents/common/formatters.ts","../../../src/core/WebAuthnManager/LitComponents/TxTree/index.ts","../../../src/core/WebAuthnManager/LitComponents/TxTree/tx-tree-utils.ts","../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/tx-confirm-content.ts","../../../src/core/WebAuthnManager/LitComponents/common/PadlockIcon.ts","../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.ts","../../../src/core/WebAuthnManager/LitComponents/HaloBorder/index.ts","../../../src/core/WebAuthnManager/LitComponents/PasskeyHaloLoading/index.ts","../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.ts","../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/tx-confirmer-wrapper.ts","../../../src/core/WebAuthnManager/LitComponents/confirm-ui.ts","../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/ui.ts","../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.ts","../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.ts","../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/createAdapters.ts"],"sourcesContent":["import type { VrfWorkerManagerContext } from '../../';\nimport { TransactionContext } from '../../../../types';\nimport type { BlockReference, AccessKeyView } from '@near-js/types';\nimport { errorMessage } from '../../../../../utils/errors';\n\nexport async function fetchNearContext(\n ctx: VrfWorkerManagerContext,\n opts: { nearAccountId: string; txCount: number; reserveNonces: boolean },\n): Promise<{\n transactionContext: TransactionContext | null;\n error?: string;\n details?: string;\n reservedNonces?: string[];\n}> {\n try {\n // Prefer NonceManager when initialized (signing flows)\n // Use cached transaction context if fresh; avoid forcing a refresh here.\n // JIT refresh later will force a new block height for the VRF challenge.\n const transactionContext = await ctx.nonceManager.getNonceBlockHashAndHeight(ctx.nearClient);\n\n const txCount = opts.txCount || 1;\n let reservedNonces: string[] | undefined;\n if (opts.reserveNonces) {\n try {\n reservedNonces = ctx.nonceManager.reserveNonces(txCount);\n console.debug(`[NonceManager]: Reserved ${txCount} nonce(s):`, reservedNonces);\n // Provide the first reserved nonce to the worker context; worker handles per-tx assignment\n transactionContext.nextNonce = reservedNonces[0];\n } catch (error) {\n console.debug(`[NonceManager]: Failed to reserve ${txCount} nonce(s):`, error);\n // Continue with existing nextNonce; worker may auto-increment where appropriate\n }\n }\n\n return { transactionContext, reservedNonces };\n } catch (error) {\n // Registration or pre-login flows may not have NonceManager initialized.\n // Fallback: fetch latest block info directly; nonces are not required for registration/link flows.\n try {\n const block = await ctx.nearClient.viewBlock({ finality: 'final' } as BlockReference);\n const txBlockHeight = String(block?.header?.height ?? '');\n const txBlockHash = String(block?.header?.hash ?? '');\n const fallback: TransactionContext = {\n nearPublicKeyStr: '', // not needed for registration VRF challenge\n accessKeyInfo: ({\n nonce: 0,\n permission: 'FullAccess',\n block_height: 0,\n block_hash: ''\n } as unknown) as AccessKeyView, // minimal shape; not used in registration/link flows\n nextNonce: '0',\n txBlockHeight,\n txBlockHash,\n } as TransactionContext;\n return { transactionContext: fallback };\n } catch (e) {\n return {\n transactionContext: null,\n error: 'NEAR_RPC_FAILED',\n details: errorMessage(e) || errorMessage(error),\n };\n }\n }\n}\n\nexport function releaseReservedNonces(ctx: VrfWorkerManagerContext, nonces?: string[]) {\n nonces?.forEach((n) => ctx.nonceManager.releaseNonce(n));\n}\n\n","import type { VrfWorkerManagerContext } from '../../';\nimport { TransactionContext, VRFChallenge } from '../../../../types';\nimport type { SecureConfirmRequest } from '../types';\nimport { SecureConfirmationType } from '../types';\nimport { errorMessage, toError } from '../../../../../utils/errors';\n\nexport async function maybeRefreshVrfChallenge(\n ctx: VrfWorkerManagerContext,\n request: SecureConfirmRequest,\n nearAccountId: string,\n): Promise<{ vrfChallenge: VRFChallenge; transactionContext: TransactionContext }> {\n\n const rpId = ctx.touchIdPrompt.getRpId();\n const vrfWorkerManager = ctx.vrfWorkerManager;\n if (!vrfWorkerManager) {\n throw new Error('VrfWorkerManager not available');\n }\n // Only attempt a JIT refresh when NonceManager is initialized for this account.\n // Pre-login/registration flows should just skip (callers already treat this as best-effort).\n if (\n !ctx.nonceManager.nearAccountId ||\n !ctx.nonceManager.nearPublicKeyStr ||\n String(ctx.nonceManager.nearAccountId) !== String(nearAccountId)\n ) {\n throw new Error('NonceManager not initialized with user data');\n }\n\n const attempts = 3;\n return await retryWithBackoff(async (attempt) => {\n const latestCtx = await ctx.nonceManager.getNonceBlockHashAndHeight(ctx.nearClient, { force: true });\n\n const vrfChallenge = (request.type === SecureConfirmationType.REGISTER_ACCOUNT || request.type === SecureConfirmationType.LINK_DEVICE)\n ? (await vrfWorkerManager.generateVrfKeypairBootstrap({\n vrfInputData: {\n userId: nearAccountId,\n rpId,\n blockHeight: latestCtx.txBlockHeight,\n blockHash: latestCtx.txBlockHash,\n },\n saveInMemory: true,\n sessionId: request.requestId,\n })).vrfChallenge\n : await vrfWorkerManager.generateVrfChallengeForSession(\n {\n userId: nearAccountId,\n rpId,\n blockHeight: latestCtx.txBlockHeight,\n blockHash: latestCtx.txBlockHash,\n },\n request.requestId,\n );\n\n return {\n vrfChallenge,\n transactionContext: latestCtx\n };\n\n }, {\n attempts,\n baseDelayMs: 150,\n onError: (err, attempt) => {\n const msg = errorMessage(err);\n const isFinal = attempt >= attempts;\n if (isFinal) {\n console.warn(`[SecureConfirm] VRF refresh failed: ${msg}`);\n } else {\n console.debug(`[SecureConfirm] VRF refresh attempt ${attempt} failed: ${msg}`);\n }\n },\n errorFactory: () => new Error('VRF refresh failed'),\n });\n}\n\ninterface RetryOptions {\n attempts: number;\n baseDelayMs: number;\n onError?: (error: unknown, attempt: number) => void;\n errorFactory?: () => Error;\n}\n\nasync function retryWithBackoff<T>(fn: (attempt: number) => Promise<T>, options: RetryOptions): Promise<T> {\n const { attempts, baseDelayMs, onError, errorFactory } = options;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= Math.max(1, attempts); attempt++) {\n try {\n return await fn(attempt);\n } catch (err) {\n lastError = err;\n onError?.(err, attempt);\n if (attempt < attempts) {\n const delay = baseDelayMs * attempt;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw errorFactory ? errorFactory() : toError(lastError ?? new Error('Retry exhausted'));\n}\n","// Shared event name constants for Wallet iframe DOM interactions\n// These are re-used across the iframe host, Lit components, and tests.\n\nexport const WalletIframeDomEvents = {\n TX_CONFIRMER_CONFIRM: 'w3a:tx-confirmer-confirm',\n TX_CONFIRMER_CANCEL: 'w3a:tx-confirmer-cancel',\n} as const;\n\nexport type WalletIframeDomEvent = (typeof WalletIframeDomEvents)[keyof typeof WalletIframeDomEvents];\n","import { TransactionInputWasm, VRFChallenge } from '../../types';\n\nexport interface ConfirmUIElement {\n /** When true, host controls element removal (two-phase close). */\n deferClose?: boolean;\n /** Optional close API for programmatic removal with a final decision state. */\n close?(confirmed: boolean): void;\n}\n\nexport type ConfirmationUIMode = 'skip' | 'modal' | 'drawer';\n\n// Theme name used across confirm UI\nexport type ThemeName = 'dark' | 'light';\n// Optional enum-style helper to avoid magic strings at callsites\nexport enum Theme {\n Dark = 'dark',\n Light = 'light',\n}\n\nexport function validateTheme(s?: string): ThemeName | undefined {\n return s === 'dark' || s === 'light' ? (s as ThemeName) : undefined;\n}\n// Public handle returned by mount/await helpers\n\nexport type ConfirmUIUpdate = {\n nearAccountId?: string;\n txSigningRequests?: TransactionInputWasm[];\n vrfChallenge?: Partial<VRFChallenge>;\n theme?: ThemeName;\n loading?: boolean;\n errorMessage?: string;\n title?: string;\n body?: string;\n};\n\nexport interface ConfirmUIHandle {\n close(confirmed: boolean): void;\n update(props: ConfirmUIUpdate): void;\n}\n","import { html, css } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport { dispatchLitCancel } from '../lit-events';\nimport { ensureExternalStyles } from '../css/css-loader';\n\nexport type DrawerTheme = 'dark' | 'light';\n\n// Consolidated constants (single source of truth)\nconst SHEET_HEIGHT_VH = 100; // Tall sheet to allow reveal/overpull\nconst DEFAULT_VISIBLE_VH = 50; // Fallback visible height when not provided\nconst FLICK_UP_CLOSE_THRESHOLD = -0.6; // px/ms (~600 px/s upward)\nconst FLICK_DOWN_CLOSE_THRESHOLD = 0.7; // px/ms (~700 px/s downward)\nconst NEAR_CLOSED_PX = 50; // Close when within 50px of bottom\nconst OVERPULL_SHEET_FACTOR = 0.5; // Allow at least 50% of sheet height\nconst OVERPULL_VIEWPORT_FACTOR = 0.5; // Or 50% of viewport height\n\nfunction clamp(n: number, min: number, max: number): number { return Math.max(min, Math.min(max, n)); }\n\nexport class DrawerElement extends LitElementWithProps {\n static properties = {\n open: { type: Boolean, reflect: true },\n theme: { type: String, reflect: true },\n loading: { type: Boolean },\n errorMessage: { type: String },\n dragToClose: { type: Boolean, attribute: 'drag-to-close' },\n showCloseButton: { type: Boolean, attribute: 'show-close-button' },\n // Optional height cap for the drawer (e.g., '50vh')\n height: { type: String },\n // Minimum upward overpull allowance in pixels\n overpullPx: { type: Number, attribute: 'overpull-px' },\n // Height is content-driven with an optional cap\n } as const;\n\n declare open: boolean;\n declare theme: DrawerTheme;\n declare loading: boolean;\n declare errorMessage?: string;\n declare dragToClose: boolean;\n declare showCloseButton: boolean;\n declare height?: string;\n declare overpullPx: number;\n\n // Drag state\n private isDragging = false;\n private pendingDrag = false;\n private startY = 0;\n private currentY = 0;\n private dragDistance = 0;\n private lastDragTime = 0;\n private velocity = 0;\n private drawerElement: HTMLElement | null = null;\n private overlayElement: HTMLElement | null = null;\n private bodyElement: HTMLElement | null = null;\n private drawerHeight = 0;\n private startTranslateYPx = 0; // translateY at gesture start, in px\n private openRestTranslateYPx = 0; // translateY for the default \"open\" rest position, in px\n private dragStartTime = 0; // ms\n private isClosing = false;\n private aboveFoldResizeObserver?: ResizeObserver;\n private drawerResizeObserver?: ResizeObserver;\n private detachViewportSync?: () => void;\n\n private _syncRAF: number | null = null;\n private _lastOpenTranslatePct?: string;\n private _contentAnimRAF: number | null = null;\n private _activeHeightTransitions = 0;\n private detachContentAnimSync?: () => void;\n // Disable transitions during first layout to avoid wrong-direction animation\n private _initialMount = true;\n // Suppress transition for the very first programmatic open\n private _firstOpen = true;\n // Styles gating to avoid FOUC under strict CSP (no inline styles)\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n // Observe and adopt any children appended after mount (e.g., viewer injected later)\n private _childObserver: MutationObserver | null = null;\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // Light DOM render by design (no Shadow DOM):\n // - Strict CSP: avoid inline <style> and nonces; rely on external <link> or constructable stylesheets.\n // - Compatibility: adoptedStyleSheets is not universally available (iOS Safari/WebViews).\n // - Composition: sharing CSS variables across LitElements is simpler in light DOM; Shadow DOM would\n // require pushing CSS vars into every component boundary. We therefore expose a stable `contentRoot`\n // and use a slot-like adoption helper instead of <slot> in Shadow DOM.\n const root = (this as unknown) as HTMLElement;\n // Ensure drawer structural styles are available on the host/document\n const p = ensureExternalStyles(root as ShadowRoot | DocumentFragment | HTMLElement, 'drawer.css', 'data-w3a-drawer-css');\n this._stylePromises.push(p);\n p.catch(() => {});\n return root;\n }\n\n constructor() {\n super();\n this.open = false;\n this.theme = 'dark';\n this.loading = false;\n this.dragToClose = true;\n this.showCloseButton = true;\n this.height = undefined;\n this.overpullPx = 120;\n }\n\n protected getComponentPrefix(): string { return 'modal'; }\n\n // Capture initial light-DOM children so they can be projected into the template\n private _initialChildren: Node[] | null = null;\n\n connectedCallback() {\n // Preserve existing child nodes before Lit's first render\n if (!this._initialChildren) {\n this._initialChildren = Array.from(this.childNodes);\n try {\n for (const n of this._initialChildren) this.removeChild(n);\n } catch {}\n }\n super.connectedCallback();\n this.attachViewportSync();\n }\n\n // Defer initial render until external styles are adopted to prevent FOUC\n protected shouldUpdate(_changed: Map<string | number | symbol, unknown>): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const settle = Promise.all(this._stylePromises)\n .then(() => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r()))));\n this._stylesAwaiting = settle.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeDragListeners();\n this.drawerElement?.removeEventListener('transitionend', this.handleTransitionEnd as EventListener);\n this.aboveFoldResizeObserver?.disconnect();\n this.drawerResizeObserver?.disconnect();\n if (this.detachViewportSync) { this.detachViewportSync(); this.detachViewportSync = undefined; }\n if (this.detachContentAnimSync) { this.detachContentAnimSync(); this.detachContentAnimSync = undefined; }\n if (this._childObserver) { this._childObserver.disconnect(); this._childObserver = null; }\n }\n\n // Ensure visual state resets immediately when `open` attribute flips\n attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null) {\n super.attributeChangedCallback?.(name, oldVal, newVal);\n if (name === 'open' && newVal !== oldVal) {\n // When opening, rely on CSS; avoid inline style writes for CSP\n if (newVal !== null) { this.isClosing = false; }\n }\n }\n\n firstUpdated() {\n const root = this.renderRoot as unknown as ParentNode;\n this.drawerElement = root.querySelector('.drawer') as HTMLElement;\n this.overlayElement = root.querySelector('.overlay') as HTMLElement;\n this.bodyElement = root.querySelector('.body') as HTMLElement;\n this.syncCssVarsForOpenTranslate();\n // Seed a safe default for drag translate so if a drag starts before\n // we have published a pixel value, it falls back to the current open\n // translate instead of 0px. This prevents any momentary jump to the top.\n try { this.setCssVars({ '--w3a-drawer__drag-translate': 'var(--w3a-drawer__open-translate)' }); } catch {}\n // Ensure no transition on first measurement; enable after a frame\n requestAnimationFrame(() => {\n this._initialMount = false;\n this.requestUpdate();\n });\n this.drawerElement?.addEventListener('transitionend', this.handleTransitionEnd as EventListener);\n // Encapsulated: follow inner height transitions so the drawer animates with content\n this.setupAnimateWithContentSync();\n // Recalculate when slot content changes or viewport resizes\n // In light DOM mode, slotchange is not meaningful; rely on ResizeObserver below\n window.addEventListener('resize', this.syncCssVarsForOpenTranslate.bind(this));\n // Observe size changes of the above-fold content and drawer container\n const above = root.querySelector('.above-fold') as HTMLElement | null;\n if (above && 'ResizeObserver' in window) {\n this.aboveFoldResizeObserver = new ResizeObserver(() => this.syncCssVarsForOpenTranslate());\n this.aboveFoldResizeObserver.observe(above);\n }\n if (this.drawerElement && 'ResizeObserver' in window) {\n this.drawerResizeObserver = new ResizeObserver(() => this.syncCssVarsForOpenTranslate());\n this.drawerResizeObserver.observe(this.drawerElement);\n }\n this.setupDragListeners();\n\n // Slot-like adoption: move any host children appended after mount into the drawer's content area.\n // We intentionally do not use Shadow DOM + <slot> here because we want to:\n // - stay CSP-compatible without nonces (no inline <style>),\n // - work on platforms without adoptedStyleSheets (e.g., iOS Safari/WebViews), and\n // - make cross-component CSS variable sharing straightforward without punching vars through\n // multiple ShadowRoot boundaries.\n this.adoptContentIntoSlot();\n this._childObserver = new MutationObserver(() => this.adoptContentIntoSlot());\n this._childObserver.observe(this as unknown as Node, { childList: true });\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>) {\n super.updated(changedProperties);\n\n if (changedProperties.has('open')) {\n // When externally toggled open, allow CSS transitions to play naturally.\n if (this.open) {\n this.isClosing = false;\n // No first-open transition suppression; double rAF in the viewer handles settle.\n this._firstOpen = false;\n this.dispatchEvent(new CustomEvent('w3a:drawer-open-start', { bubbles: true, composed: true }));\n } else {\n this.dispatchEvent(new CustomEvent('w3a:drawer-close-start', { bubbles: true, composed: true }));\n }\n }\n\n // Re-setup drag listeners if dragToClose property changed\n if (changedProperties.has('dragToClose')) {\n this.removeDragListeners();\n this.setupDragListeners();\n }\n\n // Map `height` (visible height) to open translate percentage for a 100vh sheet\n if (changedProperties.has('height') || changedProperties.has('open')) {\n // Defer to ensure DOM paints before measuring\n setTimeout(() => this.syncCssVarsForOpenTranslate(), 0);\n }\n }\n\n // Slot-like adoption helper\n // Moves any host children not part of the drawer shell into the drawer's content slot (`.above-fold`).\n // Rationale: prefer light DOM composition over Shadow DOM slots so we can keep strict CSP compliance,\n // support environments without adoptedStyleSheets, and share CSS variables across LitElements without\n // duplicating style plumbing per component.\n private adoptContentIntoSlot(): void {\n const root = this.renderRoot as unknown as ParentNode;\n const above = root.querySelector('.above-fold') as HTMLElement | null;\n if (!above) return;\n const host = this as unknown as HTMLElement;\n const toMove: Node[] = [];\n host.childNodes.forEach((n) => {\n if (n.nodeType !== Node.ELEMENT_NODE) return;\n const el = n as Element;\n // Skip elements that are part of the drawer shell\n if ((el as HTMLElement).classList?.contains('overlay')) return;\n if ((el as HTMLElement).classList?.contains('drawer')) return;\n toMove.push(n);\n });\n toMove.forEach((n) => above.appendChild(n));\n // After moving, recompute open translate to fit content\n this.syncCssVarsForOpenTranslate();\n }\n\n // Public: stable container where consumers should append their content.\n // This plays the role of a \"slot\" in our light-DOM composition model, avoiding Shadow DOM so\n // we can keep CSP strict and share CSS variables across components without duplicating styles.\n // When null, the drawer has not mounted yet.\n public get contentRoot(): HTMLElement | null {\n const root = this.renderRoot as unknown as ParentNode;\n return (root && (root.querySelector('.above-fold') as HTMLElement | null)) || null;\n }\n\n // ---- Helpers for visible height ↔ translateY% ----\n private getVisibleVh(): number {\n const h = (this.height || '').trim();\n // Accept 0-100 with units: vh, dvh, svh, lvh; \"auto\" (or unset) falls back to content-fit\n const m = h.match(/^([0-9]+(?:\\.[0-9]+)?)\\s*(d?vh|svh|lvh|vh)$/i);\n if (m) return clamp(parseFloat(m[1]), 0, 100);\n return DEFAULT_VISIBLE_VH;\n }\n\n private getOpenTranslateRatio(): number {\n // translateY ratio (0..1) for a 100vh sheet\n const visible = this.getVisibleVh();\n return clamp((SHEET_HEIGHT_VH - visible) / SHEET_HEIGHT_VH, 0, 1);\n }\n\n private _performSyncCssVarsForOpenTranslate(): void {\n const drawer = this.drawerElement;\n if (!drawer) return;\n // Do not mutate the open rest position while the user is dragging or a drag is queued.\n // Freezing prevents sudden jumps when content inside (e.g., TxTree) expands/collapses\n // and height transitions are running.\n if (this.isDragging || this.pendingDrag) return;\n\n // Prefer explicit height prop; otherwise fit to content\n const h = (this.height || '').trim();\n const m = h.match(/^([0-9]+(?:\\.[0-9]+)?)\\s*(d?vh|svh|lvh|vh)$/i);\n if (m) {\n const unit = (m[2] || 'vh').toLowerCase();\n const visibleVh = clamp(parseFloat(m[1]), 0, 100);\n const pct = clamp(100 - visibleVh, 0, 100);\n // Sheet uses same viewport unit as provided height for better alignment\n this.setCssVars({ '--w3a-drawer__sheet-height': `100${unit}` });\n // Freeze rest position while open to avoid mid-open jumps\n if (!this.open) {\n this.setCssVars({ '--w3a-drawer__open-translate': pct + '%' });\n }\n return;\n }\n\n // Default: auto-fit to content height (.above-fold)\n const unit = (typeof CSS !== 'undefined' && CSS.supports && CSS.supports('height', '1dvh')) ? 'dvh' : 'vh';\n this.setCssVars({ '--w3a-drawer__sheet-height': `${SHEET_HEIGHT_VH}${unit}` });\n\n // Measure above-fold bottom relative to drawer top to fit content exactly above the fold\n const root = this.renderRoot as unknown as ParentNode;\n const above = root.querySelector('.above-fold') as HTMLElement | null;\n if (!above) return;\n const drawerRect = drawer.getBoundingClientRect();\n const aboveRect = above.getBoundingClientRect();\n const contentBottomPx = Math.max(0, Math.round(aboveRect.bottom - drawerRect.top));\n const sheetPx = drawer.offsetHeight || (typeof window !== 'undefined' ? window.innerHeight : contentBottomPx);\n // Compute desired open translate from content.\n // For auto height (no explicit `height` provided), fully follow the\n // measured content height so the drawer can both open further (expand)\n // and close further (collapse) as the TxTree changes size.\n // This ensures the action buttons remain visible and the drawer slides\n // down enough on collapse.\n const measured = clamp(1 - contentBottomPx / Math.max(1, sheetPx), 0, 1);\n const ratio = measured;\n const pct = (ratio * 100).toFixed(4) + '%';\n\n // Avoid thrashing if value hasn't meaningfully changed\n if (pct === this._lastOpenTranslatePct) return;\n\n // If we're open, allow transform transitions to run so the drawer\n // follows content growth in real time.\n if (this.open) {\n this.drawerElement?.classList.remove('vv-sync');\n }\n\n this.setCssVars({ '--w3a-drawer__open-translate': pct });\n this._lastOpenTranslatePct = pct;\n }\n\n // Coalesce multiple triggers into a single measurement per frame\n private syncCssVarsForOpenTranslate(): void {\n if (this._syncRAF != null) return;\n this._syncRAF = requestAnimationFrame(() => {\n this._syncRAF = null;\n this._performSyncCssVarsForOpenTranslate();\n });\n }\n\n private handleTransitionEnd = (e: TransitionEvent) => {\n if (!this.drawerElement) return;\n if (e.target !== this.drawerElement) return;\n if (e.propertyName !== 'transform') return;\n const type = this.open ? 'w3a:drawer-open-end' : 'w3a:drawer-close-end';\n this.dispatchEvent(new CustomEvent(type, { bubbles: true, composed: true }));\n };\n\n // Single entry to wire content-height animation sync (child height transitions → drawer transform)\n private setupAnimateWithContentSync() {\n const root = this.renderRoot as unknown as ParentNode;\n const host = root.querySelector('.drawer') as HTMLElement | null;\n if (!host) return;\n\n const ensureLoop = () => {\n if (this._contentAnimRAF != null) return;\n const step = () => {\n this._contentAnimRAF = null;\n this._performSyncCssVarsForOpenTranslate();\n this._contentAnimRAF = requestAnimationFrame(step);\n };\n this._contentAnimRAF = requestAnimationFrame(step);\n };\n\n const stopLoop = () => {\n if (this._contentAnimRAF != null) { cancelAnimationFrame(this._contentAnimRAF); this._contentAnimRAF = null; }\n this.syncCssVarsForOpenTranslate();\n };\n\n const syncTimingFromElement = (el: Element) => {\n const cs = getComputedStyle(el);\n const props = (cs.transitionProperty || '').split(',').map(s => s.trim());\n const durations = (cs.transitionDuration || '').split(',').map(s => s.trim());\n const easings = (cs.transitionTimingFunction || '').split(',').map(s => s.trim());\n let idx = props.findIndex(p => p === 'height');\n if (idx < 0) idx = props.findIndex(p => p === 'all');\n if (idx < 0) idx = 0;\n const dur = durations[Math.min(idx, durations.length - 1)] || '100ms';\n const ease = easings[Math.min(idx, easings.length - 1)] || 'cubic-bezier(0.2, 0.6, 0.2, 1)';\n this.setCssVars({ '--w3a-drawer__transition-duration': dur, '--w3a-drawer__transition-easing': ease });\n };\n\n const onRun = (ev: Event) => {\n const e = ev as TransitionEvent;\n if (!this.open) return;\n if (e.propertyName !== 'height') return;\n this._activeHeightTransitions++;\n ensureLoop();\n };\n\n const onStart = (ev: Event) => {\n const e = ev as TransitionEvent;\n if (!this.open) return;\n if (e.propertyName !== 'height') return;\n if (e.target && e.target instanceof Element) syncTimingFromElement(e.target);\n this._activeHeightTransitions++;\n ensureLoop();\n };\n\n const onEnd = (ev: Event) => {\n const e = ev as TransitionEvent;\n if (e.propertyName !== 'height') return;\n this._activeHeightTransitions = Math.max(0, this._activeHeightTransitions - 1);\n if (this._activeHeightTransitions === 0) stopLoop();\n };\n\n host.addEventListener('transitionrun', onRun, true);\n host.addEventListener('transitionstart', onStart, true);\n host.addEventListener('transitionend', onEnd, true);\n\n this.detachContentAnimSync = () => {\n host.removeEventListener('transitionrun', onRun, true);\n host.removeEventListener('transitionstart', onStart, true);\n host.removeEventListener('transitionend', onEnd, true);\n if (this._contentAnimRAF != null) { cancelAnimationFrame(this._contentAnimRAF); this._contentAnimRAF = null; }\n this._activeHeightTransitions = 0;\n };\n }\n\n private setupDragListeners() {\n if (!this.dragToClose) return;\n\n // Use a small delay to ensure the element is rendered\n setTimeout(() => {\n const root = this.renderRoot as unknown as ParentNode;\n const drawerElement = root.querySelector('.drawer') as HTMLElement;\n\n if (!drawerElement) {\n console.warn('Drawer element not found for drag listeners');\n return;\n }\n\n // Remove any existing listeners first\n this.removeDragListeners();\n\n const supportsPointer = typeof window !== 'undefined' && 'PointerEvent' in window;\n if (supportsPointer) {\n // Prefer Pointer Events for unified handling\n drawerElement.addEventListener('pointerdown', this.handlePointerDown as any, { capture: true } as AddEventListenerOptions);\n document.addEventListener('pointermove', this.handlePointerMove as any);\n document.addEventListener('pointerup', this.handlePointerUp as any);\n document.addEventListener('pointercancel', this.handlePointerCancel as any);\n } else {\n // Fallback: mouse + touch\n drawerElement.addEventListener('mousedown', this.handleMouseDown, { capture: true } as AddEventListenerOptions);\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n\n drawerElement.addEventListener('touchstart', this.handleTouchStart, { passive: false, capture: true });\n document.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd, { passive: false });\n }\n }, 0);\n }\n\n private attachViewportSync() {\n const root = this.renderRoot as unknown as ParentNode;\n const drawerElement = root.querySelector('.drawer') as HTMLElement | null;\n if (!drawerElement) return;\n const vv: any = (typeof window !== 'undefined') ? (window as any).visualViewport : undefined;\n const schedule = () => this.suppressTransitionForViewportTick();\n\n window.addEventListener('resize', schedule, { passive: true } as AddEventListenerOptions);\n window.addEventListener('orientationchange', schedule, { passive: true } as AddEventListenerOptions);\n vv && vv.addEventListener && vv.addEventListener('resize', schedule);\n vv && vv.addEventListener && vv.addEventListener('scroll', schedule);\n\n this.detachViewportSync = () => {\n window.removeEventListener('resize', schedule as EventListener);\n window.removeEventListener('orientationchange', schedule as EventListener);\n vv && vv.removeEventListener && vv.removeEventListener('resize', schedule as EventListener);\n vv && vv.removeEventListener && vv.removeEventListener('scroll', schedule as EventListener);\n };\n }\n\n private suppressTransitionForViewportTick() {\n const root = this.renderRoot as unknown as ParentNode;\n const drawerElement = root.querySelector('.drawer') as HTMLElement | null;\n if (!drawerElement) return;\n // Avoid fighting with active drag state; dragging already disables transitions\n if (!this.isDragging) drawerElement.classList.add('vv-sync');\n }\n\n private removeDragListeners() {\n const root = this.renderRoot as unknown as ParentNode;\n const drawerElement = root.querySelector('.drawer') as HTMLElement;\n if (!drawerElement) return;\n\n // Remove listeners from drawer element\n drawerElement.removeEventListener('touchstart', this.handleTouchStart as EventListener);\n drawerElement.removeEventListener('mousedown', this.handleMouseDown as EventListener);\n drawerElement.removeEventListener('pointerdown', this.handlePointerDown as EventListener);\n\n // Remove listeners from document\n document.removeEventListener('touchmove', this.handleTouchMove as EventListener);\n document.removeEventListener('touchend', this.handleTouchEnd as EventListener);\n document.removeEventListener('mousemove', this.handleMouseMove as EventListener);\n document.removeEventListener('mouseup', this.handleMouseUp as EventListener);\n document.removeEventListener('pointermove', this.handlePointerMove as EventListener);\n document.removeEventListener('pointerup', this.handlePointerUp as EventListener);\n document.removeEventListener('pointercancel', this.handlePointerCancel as EventListener);\n }\n\n // ===== Pointer Events (preferred) =====\n private handlePointerDown = (e: PointerEvent) => {\n if (this.loading || !this.open) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n // Defer decision until move for all pointer types to preserve inner clicks/taps\n this.pendingDrag = true;\n this.startY = e.clientY;\n this.currentY = e.clientY;\n this.dragStartTime = Date.now();\n // Do not preventDefault here; keep click/tap semantics intact unless we transition into drag\n };\n\n private handlePointerMove = (e: PointerEvent) => {\n if (!this.pendingDrag && !this.isDragging) return;\n const y = e.clientY;\n if (this.pendingDrag) {\n const dy = y - this.startY;\n const absDy = Math.abs(dy);\n const ACTIVATE_PX = 8;\n // For touch/pen, only start dragging when inner body is at top so we don't steal scroll\n const body = this.bodyElement;\n const atTop = !body || body.scrollTop <= 0;\n if (absDy >= ACTIVATE_PX && atTop) {\n this.pendingDrag = false;\n this.startDrag(this.startY);\n (e.target as Element)?.setPointerCapture?.(e.pointerId);\n } else {\n return;\n }\n }\n if (this.isDragging) {\n this.updateDrag(y);\n e.preventDefault();\n }\n };\n\n private handlePointerUp = (e: PointerEvent) => {\n if (this.pendingDrag) { this.pendingDrag = false; }\n if (this.isDragging) {\n this.endDrag();\n e.preventDefault();\n }\n (e.target as Element)?.releasePointerCapture?.(e.pointerId);\n };\n\n private handlePointerCancel = (e: PointerEvent) => {\n if (this.pendingDrag) this.pendingDrag = false;\n if (this.isDragging) this.endDrag();\n (e.target as Element)?.releasePointerCapture?.(e.pointerId);\n };\n\n private handleTouchStart = (e: TouchEvent) => {\n if (this.loading || !this.open) return;\n\n // Do not initiate a drawer drag when the touch starts on the close button\n const target = e.target as HTMLElement | null;\n if (target && target.closest && target.closest('.close-btn')) {\n return;\n }\n\n const touch = e.touches[0];\n this.pendingDrag = true;\n this.startY = touch.clientY;\n this.currentY = touch.clientY;\n // Do not preventDefault yet; decide on first meaningful move to allow normal scrolling when appropriate\n };\n\n private handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // Decide whether to begin dragging on first significant move\n if (this.pendingDrag && !this.isDragging) {\n const dy = touch.clientY - this.startY;\n const absDy = Math.abs(dy);\n const ACTIVATE_PX = 8; // small threshold to distinguish from taps\n // Determine if content can scroll\n const body = this.bodyElement;\n const canScroll = !!body && body.scrollHeight > body.clientHeight;\n const atTop = !body || body.scrollTop <= 0;\n\n if (absDy >= ACTIVATE_PX) {\n // Begin drawer drag when the content is at the top boundary, for both\n // downward (close) and upward (open further) gestures. If the content\n // is not at the top yet, keep the gesture pending so the user can keep\n // scrolling the inner content until it reaches top, then transition into\n // a drawer drag in the same touch sequence.\n if (atTop) {\n this.startDrag(this.startY);\n this.isDragging = true;\n this.pendingDrag = false;\n } else {\n // Allow inner scrolling to proceed; keep pending so we can switch to drag when atTop\n // no-op\n }\n }\n }\n\n if (!this.isDragging) return;\n this.updateDrag(touch.clientY);\n e.preventDefault();\n };\n\n private handleTouchEnd = (e: TouchEvent) => {\n // Clear any undecided pending drag\n this.pendingDrag = false;\n if (!this.isDragging) return;\n this.endDrag();\n e.preventDefault();\n };\n\n private handleMouseDown = (e: MouseEvent) => {\n if (this.loading || !this.open) return;\n\n this.startDrag(e.clientY);\n e.preventDefault();\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n\n this.updateDrag(e.clientY);\n e.preventDefault();\n };\n\n private handleMouseUp = (e: MouseEvent) => {\n if (!this.isDragging) return;\n\n this.endDrag();\n e.preventDefault();\n };\n\n private startDrag(y: number) {\n this.isDragging = true;\n this.startY = y;\n this.currentY = y;\n this.dragDistance = 0;\n this.dragStartTime = Date.now();\n this.lastDragTime = this.dragStartTime;\n this.velocity = 0;\n\n if (this.drawerElement) {\n this.drawerHeight = this.drawerElement.offsetHeight;\n // Rest position derived from the same visible height value used for CSS\n this.openRestTranslateYPx = this.drawerHeight * this.getOpenTranslateRatio();\n\n // Determine current translateY in px to support starting drags from any snapped position\n const computed = getComputedStyle(this.drawerElement);\n const transform = computed.transform || '';\n const ty = this.parseTranslateY(transform);\n // If transform is 'none', use the rest position\n this.startTranslateYPx = Number.isFinite(ty) ? ty : this.openRestTranslateYPx;\n // Align logical \"rest\" with actual CSS transform (which may include offsets)\n if (Number.isFinite(ty)) this.openRestTranslateYPx = ty as number;\n\n // Seed drag translate to current position before enabling .dragging to prevent jumps\n // Prevent initial flash to top when adding the dragging class by\n // publishing the current translateY as the drag variable first.\n this.setCssVars({ '--w3a-drawer__drag-translate': `${this.startTranslateYPx}px` });\n // Force a layout flush so the newly-applied CSS variable is visible to\n // the next style recalculation that includes the `.dragging` selector.\n // Without this, some engines may briefly resolve the var() fallback (0px)\n // for one frame, causing a jump to the top when starting an upward drag.\n try { void this.drawerElement.offsetHeight; } catch {}\n this.drawerElement.classList.add('dragging');\n }\n }\n\n private updateDrag(y: number) {\n if (!this.isDragging || !this.drawerElement) return;\n\n const now = Date.now();\n const deltaTime = now - this.lastDragTime;\n const deltaY = y - this.currentY;\n\n if (deltaTime > 0) {\n this.velocity = deltaY / deltaTime;\n }\n\n this.currentY = y;\n this.dragDistance = y - this.startY; // negative = upward, positive = downward\n\n // Elastic overdrag only when crossing above the fully-open rest position\n // Allow at least 50% of sheet or viewport height, or the configured minimum\n const viewportHalf = (typeof window !== 'undefined' && window.innerHeight)\n ? window.innerHeight * OVERPULL_VIEWPORT_FACTOR\n : 0;\n const maxOverdragUpPx = Math.max(this.drawerHeight * OVERPULL_SHEET_FACTOR, viewportHalf, this.overpullPx);\n\n const rawTargetTranslateY = this.startTranslateYPx + this.dragDistance;\n let targetTranslateY = rawTargetTranslateY;\n\n // openRestTranslateYPx is the minimal (most open) resting translateY.\n // If the user drags above this (smaller translateY), apply elastic.\n if (rawTargetTranslateY < this.openRestTranslateYPx) {\n const overdragUp = this.openRestTranslateYPx - rawTargetTranslateY; // positive px\n const elasticUp = maxOverdragUpPx * (1 - 1 / (overdragUp / maxOverdragUpPx + 1));\n targetTranslateY = this.openRestTranslateYPx - elasticUp;\n }\n // Disable transitions via class; drive transform via CSS variable for CSP compliance\n this.setCssVars({ '--w3a-drawer__drag-translate': `${targetTranslateY}px` });\n\n this.lastDragTime = now;\n }\n\n private endDrag() {\n if (!this.isDragging || !this.drawerElement) return;\n\n this.isDragging = false;\n this.pendingDrag = false;\n this.drawerElement.classList.remove('dragging');\n\n const drawerHeight = this.drawerHeight || this.drawerElement.offsetHeight;\n // Preserve 0 as a valid rest position; only fall back if NaN\n const openRestPx = Number.isFinite(this.openRestTranslateYPx) ? this.openRestTranslateYPx : drawerHeight * 0.20;\n\n // Compute effective velocities (instantaneous and average over gesture)\n const now = Date.now();\n const gestureMs = Math.max(1, now - this.dragStartTime);\n const totalDeltaPx = this.currentY - this.startY; // positive = down, negative = up\n const avgVelocity = totalDeltaPx / gestureMs; // px/ms\n const effectiveDownV = Math.max(this.velocity, avgVelocity);\n const effectiveUpV = Math.min(this.velocity, avgVelocity);\n\n // Velocity-based flick-to-close (upward flick)\n // negative means upward movement\n if (effectiveUpV <= FLICK_UP_CLOSE_THRESHOLD) {\n this.closeDrawer();\n this.resetDragState();\n return;\n }\n\n // Velocity-based flick-to-close (downward flick)\n if (effectiveDownV >= FLICK_DOWN_CLOSE_THRESHOLD) {\n this.closeDrawer();\n this.resetDragState();\n return;\n }\n\n // Evaluate current position for near-closed detection\n const currentTransformTy = this.parseTranslateY(getComputedStyle(this.drawerElement).transform);\n const currentTranslatePx = Number.isFinite(currentTransformTy) ? currentTransformTy : openRestPx;\n\n // If near fully closed (bottom within threshold), close\n if (currentTranslatePx >= drawerHeight - NEAR_CLOSED_PX) {\n this.closeDrawer();\n this.resetDragState();\n return;\n }\n\n // No snapping: let CSS govern final position via [open]; just drop dragging class\n this.resetDragState();\n }\n\n private resetDragState() {\n this.dragDistance = 0;\n this.velocity = 0;\n }\n\n // Parse translateY value from CSS transform string (matrix or matrix3d)\n private parseTranslateY(transform: string): number {\n if (!transform || transform === 'none') return NaN;\n // matrix(a, b, c, d, tx, ty)\n if (transform.startsWith('matrix(')) {\n const values = transform.slice(7, -1).split(',').map(v => parseFloat(v.trim()));\n return values.length === 6 ? values[5] : NaN;\n }\n // matrix3d(a1..a16) -> ty is value 14 (index 13)\n if (transform.startsWith('matrix3d(')) {\n const values = transform.slice(9, -1).split(',').map(v => parseFloat(v.trim()));\n return values.length === 16 ? values[13] : NaN;\n }\n // translateY(XXpx/%)\n const match = transform.match(/translateY\\(([-\\d.]+)px\\)/);\n if (match) return parseFloat(match[1]);\n return NaN;\n }\n\n private closeDrawer() {\n if (this.isClosing) return;\n this.isClosing = true;\n // Let CSS drive close; avoid inline style writes\n if (this.drawerElement) { this.drawerElement.classList.remove('dragging'); }\n // Flip the `open` property so CSS applies the closed transform and overlay state\n this.open = false;\n // Notify host after state change\n dispatchLitCancel(this);\n // Reset closing guard after a short delay to avoid duplicate cancels\n setTimeout(() => { this.isClosing = false; }, 300);\n }\n\n private onClose = () => {\n if (this.loading) return;\n if (this.isClosing) return;\n\n if (this.drawerElement) { this.drawerElement.classList.remove('dragging'); }\n // Flip open then notify host (use lit-cancel for host listeners)\n this.open = false;\n dispatchLitCancel(this);\n this.isClosing = true;\n setTimeout(() => { this.isClosing = false; }, 300);\n };\n\n // Click/tap on the handle toggles open/close\n private onHandleClick = () => {\n if (!this.open) {\n this.show();\n } else {\n this.hide('handle');\n }\n };\n\n // Imperative API (uncontrolled usage)\n public show() {\n if (this.drawerElement) { this.drawerElement.classList.remove('dragging'); }\n this.open = true;\n }\n\n public hide(reason: string = 'programmatic') {\n if (this.drawerElement) { this.drawerElement.classList.remove('dragging'); }\n this.open = false;\n // Dispatch lit-cancel so host listeners can react\n dispatchLitCancel(this, { reason });\n }\n\n public toggle(force?: boolean) {\n const target = typeof force === 'boolean' ? force : !this.open;\n if (target) this.show(); else this.hide('toggle');\n }\n\n // Public helpers for explicit open/close control\n public handleOpen() { this.show(); }\n public handleClose() { this.hide('handleClose'); }\n\n render() {\n return html`\n <div class=\"overlay\" @click=${this.onClose}></div>\n <section class=\"drawer ${this._initialMount ? 'init' : ''}\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"relative\">\n <div class=\"handle\" @click=${this.onHandleClick}></div>\n ${this.showCloseButton ? html`<button aria-label=\"Close\" title=\"Close\" class=\"close-btn\" @click=${this.onClose} @touchend=${this.onClose}>×</button>` : null}\n </div>\n <div class=\"body\">\n ${this.errorMessage ? html`<div class=\"error\">${this.errorMessage}</div>` : null}\n <div class=\"above-fold\">${this._initialChildren}</div>\n </div>\n </section>\n `;\n }\n}\n\nimport { W3A_DRAWER_ID } from '../tags';\nexport default (function ensureDefined() {\n const TAG = W3A_DRAWER_ID;\n if (!customElements.get(TAG)) {\n customElements.define(TAG, DrawerElement);\n }\n return DrawerElement;\n})();\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","\nexport function formatArgs(args?: string | Record<string, string>): string {\n if (!args) return '';\n if (typeof args === 'string') return args;\n try {\n return JSON.stringify(args, (_k, v) => typeof v === 'bigint' ? v.toString() : v, 2);\n } catch (e) {\n return String(args);\n }\n}\n\nexport function formatDeposit(deposit?: string): string {\n if (!deposit || deposit === '0') return '0 NEAR';\n try {\n const yocto = BigInt(deposit);\n const YOCTO_FACTOR = BigInt('1000000000000000000000000'); // 1e24\n\n const whole = yocto / YOCTO_FACTOR;\n const frac = yocto % YOCTO_FACTOR;\n\n // Format up to 5 decimal places (as before), then trim trailing zeros\n const maxDecimals = 5;\n if (frac === BigInt(0)) {\n return `${whole.toString()} NEAR`;\n }\n\n // Pad fractional to 24 digits, then take the first maxDecimals\n const fracStrFull = frac.toString().padStart(24, '0');\n let fracStr = fracStrFull.slice(0, maxDecimals);\n // Trim trailing zeros\n fracStr = fracStr.replace(/0+$/g, '');\n\n // If trimming removed all digits, omit decimal part\n if (fracStr.length === 0) {\n return `${whole.toString()} NEAR`;\n }\n\n return `${whole.toString()}.${fracStr} NEAR`;\n } catch (e) {\n // If parsing fails, return original value\n return deposit;\n }\n}\n\nexport function formatGas(gas?: string): string {\n if (!gas) return '';\n try {\n const gasValue = BigInt(gas);\n const tgas = gasValue / BigInt('1000000000000'); // Convert to Tgas (divide by 10^12)\n return `${tgas} Tgas`;\n } catch (e) {\n // If parsing fails, return original value\n return gas;\n }\n}\n\n/**\n * Shorten a long public key or identifier by keeping a head and tail\n * and replacing the middle with an ellipsis.\n * Example: ed25519:ABCDEFGH...WXYZ12\n */\nexport function shortenPubkey(\n pk?: string,\n opts: { prefix?: number; suffix?: number } = {}\n): string {\n if (!pk || typeof pk !== 'string') return '';\n const { prefix = 12, suffix = 6 } = opts;\n if (pk.length <= prefix + suffix + 3) return pk; // +3 for '...'\n const head = pk.slice(0, prefix);\n const tail = pk.slice(-suffix);\n return `${head}...${tail}`;\n}\n\n\n// Helper function for calculating code size\nexport function formatCodeSize(code: Uint8Array | string): string {\n if (!code) return '0 bytes';\n if (code instanceof Uint8Array) return `${code.byteLength} bytes`;\n if (Array.isArray(code)) return `${code.length} bytes`;\n if (typeof code === 'string') return `${code.length} bytes`;\n return 'unknown';\n}","import { html, type TemplateResult } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport { dispatchLitTreeToggled } from '../lit-events';\nimport type { TreeNode } from './tx-tree-utils';\nimport type { TxTreeStyles } from './tx-tree-themes';\nimport { TX_TREE_THEMES } from './tx-tree-themes';\nimport { formatGas, formatDeposit, formatCodeSize, shortenPubkey } from '../common/formatters';\nimport { isNumber, isString } from '../../../WalletIframe/validation';\nimport { ensureExternalStyles } from '../css/css-loader';\n// Re-export for backward compatibility\nexport type { TxTreeStyles } from './tx-tree-themes';\n\n/**\n * TxTree\n * A small, dependency-free Lit component that renders a tree-like UI suitable for tooltips.\n *\n * Usage:\n * <w3a-tx-tree .node=${node} depth=\"0\"></w3a-tx-tree>\n *\n * Mapping note: txSigningRequests (TransactionInput[]) → TreeNode structure\n * Example (single FunctionCall):\n * {\n * id: 'txs-root', label: 'Transaction', type: 'folder', open: true,\n * children: [\n * {\n * id: 'tx-0',\n * label: 'Transaction 1 to w3a-v1.testnet',\n * type: 'folder',\n * open: true,\n * children: [\n * {\n * id: 'action-0',\n * label: 'Action 1: FunctionCall',\n * type: 'folder',\n * open: false,\n * children: [\n * { id: 'a0-method', label: 'method: set_greeting', type: 'file' },\n * { id: 'a0-gas', label: 'gas: 30000000000000', type: 'file' },\n * { id: 'a0-deposit', label: 'deposit: 0', type: 'file' },\n * { id: 'a0-args', label: 'args', type: 'file', content: '{\\n \"greeting\": \"Hello from Embedded Component! [...]\"\\n}' }\n * ]\n * }\n * ]\n * }\n * ]\n * }\n */\nexport class TxTree extends LitElementWithProps {\n\n // Pure component contract:\n // - Renders solely from inputs (node, depth, styles); holds no internal state\n // - Complex inputs are passed via property binding, not attributes\n static properties = {\n // Explicitly disable attribute reflection for complex objects to ensure\n // property binding (.node=..., .depth=..., .styles=...) is used and not coerced via attributes\n node: { attribute: false },\n // depth is driven by parent; keep attribute: false to avoid attr/property mismatch\n depth: { type: Number, attribute: false },\n // styles accepts full CSS customization - reactive to trigger re-renders\n styles: { attribute: false, state: true },\n theme: { type: String, reflect: true },\n // Optional width for the tree at depth=0. Accepts number (px) or any CSS length string.\n // Exposed as attribute for convenience, but property binding works too.\n width: { type: String },\n // Opt-in: render in Shadow DOM for encapsulation; default is light DOM for CSP simplicity\n shadowDom: { type: Boolean, attribute: 'shadow-dom' },\n // Optional: base URL for NEAR explorer links, e.g., https://testnet.nearblocks.io\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n // Controls whether the outer tooltip wrapper shows a drop shadow.\n // Defaults to true to preserve existing tooltip visuals.\n showShadow: { type: Boolean, attribute: 'show-shadow' }\n } as const;\n\n // Do NOT set class field initializers for reactive props.\n // Initializers can overwrite values set by the parent during element upgrade.\n node?: TreeNode | null;\n depth?: number;\n styles?: TxTreeStyles;\n theme?: 'dark' | 'light';\n // Optional class applied to the root container (depth=0 only)\n class?: string;\n // Optional width for the tree (applies at depth=0 root container). Number is treated as pixels.\n width?: string | number;\n // When true, render using Shadow DOM and adopt styles into the ShadowRoot\n shadowDom?: boolean;\n // Optional base URL for explorer (e.g., https://testnet.nearblocks.io)\n nearExplorerUrl?: string;\n // When true (default), render the outer wrapper with drop shadow for tooltip usage\n showShadow: boolean = true;\n\n // Static styles removed; this component now relies on external tx-tree.css\n\n // Track which node IDs have recently been copied\n private _copied: Set<string> = new Set();\n private _copyTimers: Map<string, number> = new Map();\n private _animating: WeakSet<HTMLDetailsElement> = new WeakSet();\n\n private isCopied(id: string): boolean {\n return this._copied.has(id);\n }\n\n private async handleCopyClick(e: Event, node: TreeNode) {\n e.stopPropagation();\n const value = node.copyValue;\n if (!value) return;\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(value);\n } else {\n const ta = document.createElement('textarea');\n ta.value = value;\n ta.setAttribute('readonly', '');\n ta.className = 'w3a-offscreen';\n document.body.appendChild(ta);\n ta.select();\n try { document.execCommand('copy'); } catch {}\n document.body.removeChild(ta);\n }\n // Mark as copied for 2 seconds\n this._copied.add(node.id);\n this.requestUpdate();\n const existing = this._copyTimers.get(node.id);\n if (existing) {\n window.clearTimeout(existing);\n }\n const timer = window.setTimeout(() => {\n this._copied.delete(node.id);\n this._copyTimers.delete(node.id);\n this.requestUpdate();\n }, 2000);\n this._copyTimers.set(node.id, timer);\n } catch {\n // Swallow errors silently\n }\n }\n\n private handleToggle() {\n // Notify parents that layout may have changed so they can re-measure\n dispatchLitTreeToggled(this);\n }\n\n /**\n * Intercept summary clicks to run height animations for open/close.\n * Keeps native semantics by toggling details.open at the appropriate time.\n */\n private onSummaryClick = (e: Event) => {\n const summary = e.currentTarget as HTMLElement | null;\n if (!summary) return;\n\n // If the click originated on a receiver-id link, prevent the native\n // toggle on <summary> and open the link in a new tab instead.\n const path = (e as any).composedPath?.() as EventTarget[] | undefined;\n let clickedReceiverLink: HTMLAnchorElement | null = null;\n if (Array.isArray(path)) {\n for (const t of path) {\n if (t && typeof (t as any).matches === 'function' && (t as any).matches('a.highlight-receiver-id')) {\n clickedReceiverLink = t as HTMLAnchorElement;\n break;\n }\n }\n } else {\n const target = e.target as HTMLElement | null;\n clickedReceiverLink = (target?.closest?.('a.highlight-receiver-id') as HTMLAnchorElement | null) ?? null;\n }\n if (clickedReceiverLink) {\n e.preventDefault();\n e.stopPropagation();\n try { window.open(clickedReceiverLink.href, '_blank', 'noopener'); } catch {}\n return;\n }\n\n // Otherwise, prevent native toggle so we can animate first\n e.preventDefault();\n e.stopPropagation();\n\n const details = summary.closest('details') as HTMLDetailsElement | null;\n if (!details || this._animating.has(details)) return;\n\n // Find the collapsible body (folder children or file row content)\n const body = details.querySelector(':scope > .folder-children, :scope > .row.file-row') as HTMLElement | null;\n // If no body, fall back to instant toggle + event\n if (!body) {\n details.open = !details.open;\n this.handleToggle();\n return;\n }\n\n // Respect reduced motion\n const reduceMotion = (() => {\n return typeof window !== 'undefined' && 'matchMedia' in window\n ? window.matchMedia('(prefers-reduced-motion: reduce)').matches\n : false;\n })();\n\n if (reduceMotion) {\n details.open = !details.open;\n this.handleToggle();\n return;\n }\n\n if (!details.open) {\n this.animateOpen(details, body);\n } else {\n this.animateClose(details, body);\n }\n }\n\n private animateOpen(details: HTMLDetailsElement, body: HTMLElement) {\n this._animating.add(details);\n // Prepare closed state and open the details element\n body.classList.add('anim-h');\n details.open = true;\n\n requestAnimationFrame(() => {\n const target = `${body.scrollHeight}px`;\n // Drive animation via host CSS variable; avoid inline styles\n this.setCssVars({ '--w3a-tree__anim-target': target });\n // Activate transition to target height\n body.classList.add('anim-h-active');\n let done = false;\n const cleanup = () => {\n if (done) return; done = true;\n body.classList.remove('anim-h');\n body.classList.remove('anim-h-active');\n this._animating.delete(details);\n this.handleToggle();\n };\n const onEnd = (ev: TransitionEvent) => {\n if (ev.propertyName !== 'height') return;\n body.removeEventListener('transitionend', onEnd);\n cleanup();\n };\n body.addEventListener('transitionend', onEnd);\n // Safety fallback in case transitionend doesn't fire (e.g., no CSS vars path)\n window.setTimeout(() => {\n body.removeEventListener('transitionend', onEnd);\n cleanup();\n }, 200);\n });\n }\n\n private animateClose(details: HTMLDetailsElement, body: HTMLElement) {\n this._animating.add(details);\n const start = `${body.scrollHeight}px`;\n // Pin current height, then transition to 0 using classes\n this.setCssVars({ '--w3a-tree__anim-target': start });\n body.classList.add('anim-h');\n body.classList.add('anim-h-active');\n // Force reflow to ensure start height is applied\n void body.offsetHeight;\n requestAnimationFrame(() => {\n body.classList.remove('anim-h-active');\n let done = false;\n const cleanup = () => {\n if (done) return; done = true;\n body.removeEventListener('transitionend', onEnd);\n details.open = false;\n body.classList.remove('anim-h');\n this._animating.delete(details);\n this.handleToggle();\n };\n const onEnd = (ev: TransitionEvent) => {\n if (ev.propertyName !== 'height') return;\n cleanup();\n };\n body.addEventListener('transitionend', onEnd);\n // Safety fallback in case transitionend doesn't fire\n window.setTimeout(() => cleanup(), 250);\n });\n }\n\n protected getComponentPrefix(): string {\n return 'tree';\n }\n\n protected applyStyles(styles: TxTreeStyles): void {\n super.applyStyles(styles, 'tree');\n }\n\n // Prefer light DOM rendering so styles are fully externalized for strict CSP.\n // External tx-tree.css is ensured for both light/shadow contexts, but we render\n // in light DOM by default to avoid Lit injecting a <style> tag.\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n if (this.shadowDom) {\n // Encapsulated mode: render in ShadowRoot and adopt stylesheet there\n const root = super.createRenderRoot();\n ensureExternalStyles(root as ShadowRoot | DocumentFragment | HTMLElement, 'tx-tree.css', 'data-w3a-tx-tree-css').catch(() => {});\n return root;\n }\n // Default: light DOM render for CSP simplicity; ensure styles at host and (if present) nearest ShadowRoot\n ensureExternalStyles(this as unknown as HTMLElement, 'tx-tree.css', 'data-w3a-tx-tree-css').catch(() => {});\n const root = (this.getRootNode && this.getRootNode()) as any;\n if (root && typeof root === 'object' && 'host' in root) {\n ensureExternalStyles(root as ShadowRoot, 'tx-tree.css', 'data-w3a-tx-tree-css').catch(() => {});\n }\n return this as unknown as HTMLElement;\n }\n\n /**\n * Lifecycle method to apply styles when they change\n */\n protected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n // 1) Apply explicit styles when provided and non-empty\n const hasExplicitStyles = !!this.styles && Object.keys(this.styles as Record<string, unknown>).length > 0;\n if (changedProperties.has('styles') && hasExplicitStyles) {\n this.applyStyles(this.styles as TxTreeStyles);\n }\n // 2) Fall back to theme-driven defaults when styles are not provided/changed\n // This makes <w3a-tx-tree theme=\"dark|light\"> responsive even if a parent forgets\n // to pass a styles object for the theme.\n if (changedProperties.has('theme') && !hasExplicitStyles && this.theme) {\n const preset = TX_TREE_THEMES[this.theme] || TX_TREE_THEMES.dark;\n this.applyStyles(preset);\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n }\n\n private renderLabelWithSelectiveHighlight(treeNode: TreeNode): TemplateResult | string {\n // Action-level labels (with inline highlights)\n if (treeNode.action) {\n const a = treeNode.action;\n switch (a.type) {\n case 'FunctionCall': {\n let method = a.methodName;\n let gasStr = formatGas(a.gas);\n let depositStr = formatDeposit(a.deposit);\n return html`Calling <span class=\"highlight-method-name\">${method}</span>\n ${depositStr !== '0 NEAR' ? html` with <span class=\"highlight-method-name\">${depositStr}</span>` : ''}\n ${gasStr ? html` using <span class=\"highlight-method-name\">${gasStr}</span>` : ''}`;\n }\n case 'Transfer': {\n let amount = formatDeposit(a.amount);\n return html`Transfer <span class=\"highlight-amount\">${amount}</span>`;\n }\n case 'CreateAccount':\n return 'Creating Account';\n case 'DeleteAccount':\n // let beneficiaryId = formatDeposit(a.beneficiaryId);\n // return html`Deleting Account, sending balance to <span class=\"highlight-amount\">${beneficiaryId}</span>`;\n return 'Deleting Account';\n case 'Stake':\n return `Staking ${formatDeposit(a.stake)}`;\n case 'AddKey':\n let ak = a.accessKey;\n // let accessKeyObj = typeof ak === 'string' ? JSON.parse(ak) : ak;\n // let permission = accessKeyObj.permission === 'FullAccess' ? 'Full Access' : 'Function Call';\n return `Adding Key`;\n case 'DeleteKey':\n return `Deleting Key`;\n case 'DeployContract': {\n const codeSize = formatCodeSize(a.code);\n return `Deploying WASM contract (${codeSize})`;\n }\n case 'DeployGlobalContract': {\n const codeSize = formatCodeSize((a as any).code);\n const mode = (a as any).deployMode || 'Unknown';\n return `Deploy global WASM contract (mode: ${mode}, size ${codeSize})`;\n }\n case 'UseGlobalContract': {\n const accountId = (a as any).accountId;\n const codeHash = (a as any).codeHash;\n if (accountId) {\n const base = (this.nearExplorerUrl || 'https://testnet.nearblocks.io').replace(/\\/$/, '');\n const href = `${base}/address/${encodeURIComponent(accountId)}`;\n return html`Use global contract <a\n class=\"highlight-receiver-id\"\n href=${href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >${accountId}</a>`;\n }\n if (codeHash) {\n const short = shortenPubkey(codeHash, { prefix: 10, suffix: 6 });\n return html`Use global contract by hash <span class=\"highlight-method-name\">${short}</span>`;\n }\n return 'Use global contract';\n }\n default: {\n const idxText = isNumber(treeNode.actionIndex) ? ` ${treeNode.actionIndex + 1}` : '';\n const typeText = a.type || 'Unknown';\n return `Action ${idxText}: ${typeText}`;\n }\n }\n }\n\n // Transaction-level labels (with inline receiver highlight)\n if (treeNode.transaction) {\n const total = treeNode.totalTransactions ?? 1;\n const idx = treeNode.transactionIndex ?? 0;\n const prefix = total > 1 ? `Transaction ${idx + 1}: to ` : 'Transaction to ';\n const receiverId = treeNode.transaction.receiverId;\n const base = (this.nearExplorerUrl || 'https://testnet.nearblocks.io').replace(/\\/$/, '');\n const href = `${base}/address/${encodeURIComponent(receiverId)}`;\n return html`${prefix}<a\n class=\"highlight-receiver-id\"\n href=${href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >${receiverId}</a>`;\n }\n\n // Fallback to plain label for non-action, non-transaction nodes\n return treeNode.label || '';\n }\n\n /**\n * Compute a plain-text version of the label for use in the title tooltip.\n * Mirrors renderLabelWithSelectiveHighlight but without inline HTML/spans.\n */\n private computePlainLabel(treeNode: TreeNode): string {\n // Action-level labels\n if (treeNode.action) {\n const a = treeNode.action;\n switch (a.type) {\n case 'FunctionCall': {\n const method = a.methodName;\n const gasStr = formatGas(a.gas);\n const depositStr = formatDeposit(a.deposit);\n return `Calling ${method} with ${depositStr} using ${gasStr}`;\n }\n case 'Transfer':\n return `Transfer ${formatDeposit(a.amount)}`;\n case 'CreateAccount':\n return 'Creating Account';\n case 'DeleteAccount':\n return 'Deleting Account';\n case 'Stake':\n return `Staking ${formatDeposit(a.stake)}`;\n case 'AddKey':\n return 'Adding Key';\n case 'DeleteKey':\n return 'Deleting Key';\n case 'DeployContract':\n return 'Deploying WASM contract';\n case 'DeployGlobalContract': {\n const codeSize = formatCodeSize((a as any).code);\n const mode = (a as any).deployMode || 'Unknown';\n return `Deploy global WASM contract (mode: ${mode}, size ${codeSize})`;\n }\n case 'UseGlobalContract': {\n const accountId = (a as any).accountId;\n const codeHash = (a as any).codeHash;\n if (accountId) {\n return `Use global contract by account ${accountId}`;\n }\n if (codeHash) {\n return `Use global contract by hash ${codeHash}`;\n }\n return 'Use global contract';\n }\n default: {\n const idxText = isNumber(treeNode.actionIndex) ? ` ${treeNode.actionIndex + 1}` : '';\n const typeText = a.type || 'Unknown';\n return `Action${idxText}: ${typeText}`;\n }\n }\n }\n\n // Transaction-level labels\n if (treeNode.transaction) {\n const total = treeNode.totalTransactions ?? 1;\n const idx = treeNode.transactionIndex ?? 0;\n const prefix = total > 1 ? `Transaction ${idx + 1}: to ` : 'Transaction to ';\n const receiverId = treeNode.transaction.receiverId;\n return `${prefix}${receiverId}`;\n }\n\n return treeNode.label || '';\n }\n\n private renderLeaf(depth: number, node: TreeNode): TemplateResult | undefined {\n\n const depthIndex = Math.max(0, depth - 1);\n\n // If content exists, render a collapsible details with the content\n if (isString(node.content) && node.content.length > 0) {\n return html`\n <details class=\"tree-node file\" ?open=${!!node.open}>\n <summary class=\"row summary-row depth-${depthIndex}\"\n data-no-elbow=\"${!!node.hideLabel}\"\n @click=${this.onSummaryClick}\n >\n <span class=\"indent\"></span>\n <span class=\"label label-action-node\" ?hidden=${!!node.hideLabel}>\n ${\n !node.hideChevron\n ? html`\n <svg class=\"chevron\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path fill=\"currentColor\" d=\"M6 3l5 5-5 5z\" />\n </svg>`\n : ''\n }\n <span class=\"label-text\" title=${this.computePlainLabel(node)}>\n ${this.renderLabelWithSelectiveHighlight(node)}\n </span>\n ${\n node.copyValue\n ? html`\n <span class=\"copy-badge\"\n data-copied=${this.isCopied(node.id)}\n @click=${(e: Event) => this.handleCopyClick(e, node)}\n title=${this.isCopied(node.id) ? 'Copied' : 'Copy'}\n >\n ${this.isCopied(node.id) ? 'copied' : 'copy'}\n </span>`\n : ''\n }\n </span>\n <!-- Move file-content into .summary-row so we can collapse it by default -->\n <div class=\"file-content\">${node.content}</div>\n </summary>\n <!-- Alternative rendering for file content kept for reference; no inline styles allowed -->\n </details>\n `;\n }\n // Plain file row without content\n return html`\n <div class=\"row file-row depth-${depthIndex}\"\n data-no-elbow=\"${!!node.hideLabel}\"\n ?open=${!!node.open}\n >\n <span class=\"indent\"></span>\n <span class=\"label label-action-node\" ?hidden=${!!node.hideLabel}>\n <span class=\"label-text\" title=${this.computePlainLabel(node)}>\n ${this.renderLabelWithSelectiveHighlight(node)}\n </span>\n ${node.copyValue ? html`\n <span class=\"copy-badge\"\n data-copied=${this.isCopied(node.id)}\n @click=${(e: Event) => this.handleCopyClick(e, node)}\n title=${this.isCopied(node.id) ? 'Copied' : 'Copy'}\n >${this.isCopied(node.id) ? 'copied' : 'copy'}</span>\n ` : ''}\n </span>\n </div>\n `;\n }\n\n private renderFolder(depth: number, node: TreeNode): TemplateResult | undefined {\n\n const { children: nodeChildren } = node;\n const depthIndex = Math.max(0, depth - 1);\n\n return html`\n <details class=\"tree-node folder\" ?open=${!!node.open}>\n <summary class=\"row summary-row depth-${depthIndex}\"\n data-no-elbow=\"${!!node.hideLabel}\"\n @click=${this.onSummaryClick}\n >\n <span class=\"indent\"></span>\n <span class=\"label\" ?hidden=${!!node.hideLabel}>\n ${!node.hideChevron ? html`\n <svg class=\"chevron\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path fill=\"currentColor\" d=\"M6 3l5 5-5 5z\" />\n </svg>\n ` : ''}\n <span class=\"label-text\" title=${this.computePlainLabel(node)}>\n ${this.renderLabelWithSelectiveHighlight(node)}\n </span>\n </span>\n </summary>\n ${nodeChildren && nodeChildren.length > 0 ? html`\n <div class=\"folder-children\">\n ${repeat(nodeChildren, (c) => c.id, (c) => this.renderAnyNode(c, depth + 1))}\n </div>\n ` : html``}\n </details>\n `;\n }\n\n private renderAnyNode(node: TreeNode, depth: number): TemplateResult | undefined {\n return node.type === 'file'\n ? this.renderLeaf(depth, node)\n : this.renderFolder(depth, node);\n }\n\n render() {\n if (!this.node || (this.node.type === 'folder' && !this.node.children?.length)) {\n return html``;\n }\n\n let depth = this.depth ?? 0;\n let content: TemplateResult | undefined;\n if (depth === 0) {\n const extraClass = this.class ? ` ${this.class}` : '';\n const scrollClass = this.class ? ' scrollable-root' : '';\n // Render only the children as top-level entries\n // When showShadow=false, skip the outer shadow wrapper to blend into host surfaces\n const inner = html`\n <div class=\"tooltip-tree-root${extraClass}${scrollClass}\">\n <div class=\"tooltip-tree-children\">\n ${repeat(\n Array.isArray(this.node.children) ? this.node.children : [],\n (child) => child.id,\n (child) => this.renderAnyNode(child, depth + 1)\n )}\n </div>\n </div>\n `;\n content = this.showShadow\n ? html`<div class=\"tooltip-border-outer\">${inner}</div>`\n : inner;\n } else if (this.node.type === 'folder') {\n content = this.renderFolder(depth, this.node);\n } else if (this.node.type === 'file') {\n content = this.renderLeaf(depth, this.node);\n }\n\n return content;\n }\n}\n\nimport { W3A_TX_TREE_ID } from '../tags';\n\nif (!customElements.get(W3A_TX_TREE_ID)) {\n customElements.define(W3A_TX_TREE_ID, TxTree);\n}\n// Legacy alias: use a subclass to avoid constructor reuse error\nif (!customElements.get('tx-tree')) {\n class TxTreeAlias extends TxTree {}\n customElements.define('tx-tree', TxTreeAlias as unknown as CustomElementConstructor);\n}\n\nexport default TxTree;\n","import { TxTreeStyles } from './tx-tree-themes';\nimport type { ActionArgs, TransactionInput } from '../../../types/actions';\nimport { formatArgs, formatDeposit, shortenPubkey, formatCodeSize } from '../common/formatters';\nimport { isString } from '../../../WalletIframe/validation';\n\nexport type TreeNodeType = 'folder' | 'file';\n\n// Structured highlight specification for labels\nexport type HighlightSpec =\n | { transaction: 'receiverId' }\n | { actionType: 'FunctionCall' | 'Transfer' | string; highlightKeys: string[] };\n\nexport interface TreeNode {\n /* Unique identifier for the tree node, used for React keys and DOM element IDs */\n id: string;\n /* Display text shown for this node in the tree UI */\n label: string;\n /* Type of the tree node - either 'folder' (expandable) or 'file' (leaf node) */\n type: TreeNodeType;\n /* Whether the node is initially expanded (folders only). Defaults to false.\n * When true, folder nodes will be rendered in an open state.\n */\n open?: boolean;\n /* Optional content for the node. When provided on a 'file' node,\n * it will be shown inside a collapsible details section.\n * Typically used for displaying formatted data like JSON arguments.\n */\n content?: string;\n /* Child nodes for folder-type nodes. Undefined or empty array for file nodes.\n * The tree structure is built recursively through this property.\n */\n children?: TreeNode[];\n /** Optional value that can be copied to clipboard when the row is clicked */\n copyValue?: string;\n /**\n * Optional highlighting information for special nodes\n */\n highlight?: {\n type: 'receiverId' | 'methodName';\n color: string;\n };\n /** Structured highlighting preferences for building labels */\n highlightSpec?: HighlightSpec;\n /* Optional flag to hide the chevron icon for folder nodes.\n * When true, the expand/collapse chevron will not be rendered,\n * though the folder will still be expandable/collapsible.\n */\n hideChevron?: boolean;\n /* Optional flag to hide the label text for file nodes.\n * When true, the label will be set to display: none,\n * but the content will still be visible.\n */\n hideLabel?: boolean;\n\n /**\n * For action folder nodes, attach the underlying ActionArgs so the\n * renderer can construct the label and apply selective highlights.\n */\n action?: ActionArgs;\n /**\n * The index of this action within its transaction, for display purposes.\n */\n actionIndex?: number;\n /** Transaction data for transaction-level folder nodes */\n transaction?: TransactionInput;\n /** Index of this transaction in the list */\n transactionIndex?: number;\n /** Total count of transactions in the request */\n totalTransactions?: number;\n}\n\n// Builds a TreeNode for a single action\nfunction buildActionNode(action: ActionArgs, idx: number): TreeNode {\n\n let actionNodes: TreeNode[];\n\n switch (action.type) {\n case 'FunctionCall':\n actionNodes = [\n // Skip showing gas for FunctionCall, we show it in the label\n // { id: `a${idx}-gas`, label: `gas: ${formatGas(action.gas)}`, type: 'file' },\n {\n id: `a${idx}-args`,\n label: 'using args:',\n type: 'file',\n open: false,\n hideChevron: true,\n hideLabel: true, // hide \"args:\" row label\n content: formatArgs(action.args)\n }\n ];\n break;\n\n case 'Transfer':\n actionNodes = []; // Transfers don't have gas property\n break;\n\n case 'CreateAccount':\n actionNodes = [];\n break;\n\n case 'DeployContract': {\n const code = action.code;\n const codeSize = formatCodeSize(code as any);\n actionNodes = [\n {\n id: `a${idx}-code-size`,\n label: `WASM contract code size: ${codeSize}`,\n type: 'file',\n open: false,\n }\n ];\n break;\n }\n\n case 'DeployGlobalContract': {\n const code = action.code;\n const deployMode = action.deployMode;\n const codeSize = formatCodeSize(code as any);\n actionNodes = [\n {\n id: `a${idx}-deploy-mode`,\n label: `mode: ${deployMode}`,\n type: 'file',\n open: false,\n },\n {\n id: `a${idx}-code-size`,\n label: `WASM global contract code size: ${codeSize}`,\n type: 'file',\n open: false,\n }\n ];\n break;\n }\n\n case 'UseGlobalContract': {\n const accountId = action.accountId;\n const codeHash = action.codeHash;\n let label: string;\n if (accountId) {\n label = `by account: ${accountId}`;\n } else if (codeHash) {\n const short = shortenPubkey(codeHash, { prefix: 10, suffix: 6 });\n label = `by hash: ${short}`;\n } else {\n label = 'by global contract identifier';\n }\n actionNodes = [\n {\n id: `a${idx}-identifier`,\n label,\n type: 'file',\n open: false,\n }\n ];\n break;\n }\n\n case 'Stake':\n actionNodes = [\n {\n id: `a${idx}-publicKey`,\n label: `validator: ${shortenPubkey(action.publicKey)}`,\n type: 'file',\n open: true,\n copyValue: action.publicKey\n }\n ];\n break;\n\n case 'AddKey':\n const ak = action.accessKey;\n let permissions = '';\n try {\n const accessKeyObj = isString(ak) ? JSON.parse(ak) : ak;\n permissions = accessKeyObj.permission === 'FullAccess'\n ? 'Full Access'\n : 'Function Call';\n } catch {\n permissions = 'Unknown';\n }\n actionNodes = [\n {\n id: `a${idx}-publicKey`,\n label: `key: ${shortenPubkey(action.publicKey)}`,\n open: false,\n type: 'file',\n copyValue: action.publicKey\n },\n {\n id: `a${idx}-permissions`,\n label: `permissions: ${permissions}`,\n open: false,\n type: 'file'\n }\n ];\n break;\n\n case 'DeleteKey':\n actionNodes = [\n {\n id: `a${idx}-publicKey`,\n label: `key: ${shortenPubkey(action.publicKey)}`,\n open: false,\n type: 'file',\n copyValue: action.publicKey\n }\n ];\n break;\n\n case 'DeleteAccount':\n actionNodes = [\n {\n id: `a${idx}-beneficiaryId`,\n label: `sending balance to: ${action.beneficiaryId}`,\n open: false,\n type: 'file'\n }\n ];\n break;\n\n default:\n // Unknown action - show raw data\n let raw = '';\n try { raw = JSON.stringify(action, null, 2); } catch { raw = String(action); }\n actionNodes = [\n {\n id: `a${idx}-action`,\n label: `Action: ${action.type || 'Unknown'}`,\n open: false,\n type: 'file'\n },\n {\n id: `a${idx}-raw`,\n label: 'Raw Data',\n type: 'file',\n open: false,\n content: raw\n }\n ];\n break;\n }\n\n return {\n id: `action-${idx}`,\n // Label is now computed at render time from action data\n label: '',\n type: 'folder',\n open: false,\n hideChevron: true,\n // Attach action data for the renderer\n action,\n actionIndex: idx,\n children: actionNodes\n } as TreeNode;\n}\n\n// Pure builder that converts a TransactionInput into a TreeNode transaction tree\n// Label format: \"Transaction to receiverId\" for single tx, \"Transaction(index) to receiverId\" for multiple txs\nexport function buildTransactionNode(\n tx: TransactionInput,\n tIdx: number,\n totalTransactions: number,\n styles?: TxTreeStyles\n): TreeNode {\n\n const actionFolders: TreeNode[] = tx.actions.map((action: ActionArgs, idx: number) =>\n buildActionNode(action, idx)\n );\n\n return {\n id: `tx-${tIdx}`,\n // Label is computed at render time; keep empty string here\n label: '',\n type: 'folder',\n open: true, // all transactions folders are open by default\n hideChevron: true,\n transaction: tx,\n transactionIndex: tIdx,\n totalTransactions,\n children: [...actionFolders]\n };\n}\n\n// Builds a display tree from transaction payloads for tooltip rendering\n// a two-level tree: Transaction -> Action N -> subfields\nexport function buildDisplayTreeFromTxPayloads(\n txSigningRequests: TransactionInput[],\n styles?: TxTreeStyles\n): TreeNode {\n\n const totalTransactions = txSigningRequests.length;\n const txFolders: TreeNode[] = txSigningRequests.map((tx: TransactionInput, tIdx: number) =>\n buildTransactionNode(tx, tIdx, totalTransactions, styles)\n );\n\n return {\n id: 'txs-root',\n label: totalTransactions > 1 ? 'Transactions' : 'Transaction',\n type: 'folder',\n open: true,\n children: txFolders\n };\n}\n","import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport { dispatchLitCancel, dispatchLitConfirm } from '../lit-events';\n\nimport type { TransactionInputWasm } from '../../../types';\nimport type { VRFChallenge } from '../../../types/vrf-worker';\nimport { fromTransactionInputsWasm } from '../../../types/actions';\nimport TxTree from '../TxTree';\nimport { buildDisplayTreeFromTxPayloads } from '../TxTree/tx-tree-utils';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport { W3A_TX_TREE_ID } from '../tags';\nimport type { ThemeName } from '../confirm-ui-types';\n\n/**\n * Shared confirmation content surface used by both Modal and Drawer containers.\n * - Renders summary, TxTree, and confirm/cancel actions\n * - Emits semantic events: `lit-confirm` and `lit-cancel` (containers bridge to w3a:* events)\n * - Does not own backdrop, focus traps, or ESC handling\n */\nexport class TxConfirmContentElement extends LitElementWithProps {\n // Fail fast in dev if nested custom elements are not defined\n static requiredChildTags = [W3A_TX_TREE_ID, 'tx-tree'];\n static keepDefinitions = [TxTree];\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n txSigningRequests: { type: Array },\n intentDigest: { type: String, attribute: 'intent-digest' },\n vrfChallenge: { type: Object },\n theme: { type: String },\n loading: { type: Boolean },\n errorMessage: { type: String },\n title: { type: String },\n confirmText: { type: String },\n cancelText: { type: String },\n // Treat internal tree node as reactive state so setting it re-renders immediately\n _treeNode: { attribute: false, state: true },\n // Optional: set tooltip width via CSS var for nested components\n tooltipWidth: { type: String, attribute: 'tooltip-width' },\n // Optional: pass explorer base URL down to TxTree\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n // Forwarded flag to control TxTree's shadow wrapper (drop shadow)\n showShadow: { type: Boolean, attribute: 'show-shadow' },\n } as const;\n\n declare nearAccountId: string;\n declare txSigningRequests: TransactionInputWasm[];\n declare intentDigest?: string;\n declare vrfChallenge?: Partial<VRFChallenge>;\n declare theme: ThemeName;\n declare loading: boolean;\n declare errorMessage?: string;\n declare title: string;\n declare confirmText: string;\n declare cancelText: string;\n declare tooltipWidth?: string | number;\n declare nearExplorerUrl?: string;\n declare showShadow: boolean;\n\n private _treeNode: any | null = null;\n // Keep essential custom elements from being tree-shaken\n private _ensureTreeDefinition = TxTree;\n // Tree width now sourced from a single CSS var so host can control it.\n // Falls back to the embedded tooltip width, and then to 360px.\n private _txTreeWidth: string | number = 'var(--tooltip-width, 100%)';\n\n // No static styles: structural styles are provided by tx-confirmer.css\n\n // Styles gating to avoid first-paint before tx-tree.css is ready\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n\n constructor() {\n super();\n // Pre-ensure document-level styles to warm the cache and await link loads\n const root = (document?.documentElement || null) as unknown as HTMLElement | null;\n if (root) {\n this._stylePromises.push(\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n );\n }\n this.nearAccountId = '';\n this.txSigningRequests = [];\n this.theme = 'dark';\n this.loading = false;\n this.title = 'Review Transaction';\n this.confirmText = 'Confirm';\n this.cancelText = 'Cancel';\n this.showShadow = false;\n // Leave tooltipWidth undefined by default so CSS responsive var applies.\n }\n\n protected getComponentPrefix(): string { return 'tx-confirm-content'; }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = (this as unknown) as HTMLElement;\n // Ensure tx-tree.css for nested light-DOM TxTree\n this._stylePromises.push(ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'));\n // Also ensure tx-confirmer.css for shared confirmer styles\n this._stylePromises.push(ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'));\n return root;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Reflect tooltip width var for nested components\n this._applyTooltipWidthVar();\n // Build initial tree from any pre-set props (upgrade-safe)\n this._rebuildTree();\n // Prevent drawer drag initiation from content area\n this.addEventListener('pointerdown', this._stopDragStart as EventListener);\n this.addEventListener('mousedown', this._stopDragStart as EventListener);\n this.addEventListener('touchstart', this._stopDragStart as EventListener, { passive: false } as AddEventListenerOptions);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('pointerdown', this._stopDragStart as EventListener);\n this.removeEventListener('mousedown', this._stopDragStart as EventListener);\n this.removeEventListener('touchstart', this._stopDragStart as EventListener);\n // No resize listener to clean up (width is CSS-driven)\n super.disconnectedCallback();\n }\n\n protected shouldUpdate(_changed: PropertyValues): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const p = Promise.all(this._stylePromises).then(\n () => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())))\n );\n this._stylesAwaiting = p.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n\n updated(changed: PropertyValues) {\n super.updated(changed);\n if (changed.has('txSigningRequests')) {\n this._rebuildTree();\n }\n if (changed.has('tooltipWidth')) {\n this._applyTooltipWidthVar();\n }\n }\n\n private _applyTooltipWidthVar() {\n const w = this._normalizeWidth(this.tooltipWidth);\n // Only set when a caller explicitly provides a width; otherwise\n // keep the responsive CSS default defined on :host.\n if (w) this.setCssVars({ '--tooltip-width': w });\n }\n\n private _normalizeWidth(val?: string | number): string | undefined {\n if (val === undefined || val === null) return undefined;\n if (typeof val === 'number' && Number.isFinite(val)) return `${val}px`;\n const s = String(val).trim();\n return s.length ? s : undefined;\n }\n\n private _rebuildTree() {\n try {\n const inputs = Array.isArray(this.txSigningRequests) ? this.txSigningRequests : [];\n const uiTxs = fromTransactionInputsWasm(inputs);\n this._treeNode = buildDisplayTreeFromTxPayloads(uiTxs);\n } catch (e) {\n console.warn('[TxConfirmContent] failed to build TxTree', e);\n this._treeNode = null;\n }\n // Ensure view refreshes even if this runs in firstUpdated before Lit schedules next frame\n this.requestUpdate();\n }\n\n private _stopDragStart = (e: Event) => {\n e.stopPropagation();\n };\n\n private onConfirm = () => {\n if (this.loading) return;\n // Emit semantic event for containers to bridge to canonical events\n dispatchLitConfirm(this);\n };\n\n private onCancel = () => {\n if (this.loading) return;\n dispatchLitCancel(this);\n };\n\n render() {\n return html`\n <div class=\"txc-root\">\n ${this.errorMessage ? html`<div class=\"error\">${this.errorMessage}</div>` : null}\n ${(() => {\n const treeTheme: 'dark' | 'light' = this.theme === 'dark' ? 'dark' : 'light';\n const explorerBase = this.nearExplorerUrl || 'https://testnet.nearblocks.io';\n return this._treeNode\n ? html`<div class=\"tooltip-width\">\n <w3a-tx-tree\n light-dom\n .node=${this._treeNode}\n .theme=${treeTheme}\n .width=${this._txTreeWidth}\n .nearExplorerUrl=${explorerBase}\n .showShadow=${this.showShadow}\n ></w3a-tx-tree>\n </div>`\n : html`<div class=\"muted\">No actions</div>`;\n })()}\n <div class=\"actions\">\n <button\n class=\"cancel\"\n @click=${this.onCancel}\n ?disabled=${this.loading}\n >\n ${this.cancelText}\n </button>\n <button\n class=\"confirm ${this.loading ? 'loading' : ''}\"\n @click=${this.onConfirm}\n ?disabled=${this.loading}\n >\n ${this.loading\n ? html`<span class=\"loading-indicator\" role=\"progressbar\" aria-label=\"Loading\"></span><span class=\"sr-only\">Loading</span>`\n : html`${this.confirmText}`}\n </button>\n </div>\n </div>\n `;\n }\n}\n\nimport { W3A_TX_CONFIRM_CONTENT_ID } from '../tags';\n\nif (!customElements.get(W3A_TX_CONFIRM_CONTENT_ID)) {\n customElements.define(W3A_TX_CONFIRM_CONTENT_ID, TxConfirmContentElement);\n}\n\nexport default TxConfirmContentElement;\n","import { html, LitElement } from 'lit';\nimport { ensureExternalStyles } from '../css/css-loader';\n\nexport class PadlockIconElement extends LitElement {\n static properties = {\n size: { type: String },\n strokeWidth: { type: Number, attribute: 'stroke-width' },\n } as const;\n\n declare size?: string;\n declare strokeWidth?: number;\n\n // Static styles removed; external stylesheet is adopted for CSP compatibility\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n ensureExternalStyles(root as ShadowRoot | DocumentFragment | HTMLElement, 'padlock-icon.css', 'data-w3a-padlock-icon-css').catch(() => {});\n return root;\n }\n\n constructor() {\n super();\n this.size = undefined; // allows CSS width/height or class to control size\n this.strokeWidth = 2;\n }\n\n render() {\n const size = this.size || undefined;\n const sw = Number(this.strokeWidth) || 2;\n return html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=${sw}\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n width=${size || '100%'}\n height=${size || '100%'}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n `;\n }\n}\n\ntry {\n if (!customElements.get('w3a-padlock-icon')) {\n customElements.define('w3a-padlock-icon', PadlockIconElement);\n }\n} catch {}\n\nexport default PadlockIconElement;\n","import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport DrawerElement from '../Drawer';\nimport { W3A_DRAWER_ID } from '../tags';\nimport TxConfirmContentElement from './tx-confirm-content';\nimport PadlockIconElement from '../common/PadlockIcon';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\nimport type { TransactionInputWasm, VRFChallenge } from '../../../types';\nimport type { ThemeName } from '../confirm-ui-types';\nimport type { ConfirmUIElement } from '../confirm-ui-types';\n\n/**\n * DrawerTxConfirmer: Drawer variant of the transaction confirmer\n */\nexport class DrawerTxConfirmerElement extends LitElementWithProps implements ConfirmUIElement {\n static requiredChildTags = ['w3a-tx-confirm-content', 'w3a-drawer'];\n static strictChildDefinitions = true;\n // Prevent bundlers from dropping nested custom element definitions used via templates\n static keepDefinitions = [TxConfirmContentElement, PadlockIconElement];\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n theme: { type: String, reflect: true },\n loading: { type: Boolean },\n errorMessage: { type: String },\n body: { type: String },\n title: { type: String },\n confirmText: { type: String },\n cancelText: { type: String },\n // Two‑phase close: when true, host controls removal\n deferClose: { type: Boolean, attribute: 'defer-close' },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n } as const;\n\n declare nearAccountId: string;\n declare txSigningRequests: TransactionInputWasm[];\n declare vrfChallenge?: Partial<VRFChallenge>;\n // Theme tokens now come from external CSS (tx-confirmer.css)\n // style injection has been removed to satisfy strict CSP.\n declare theme: ThemeName;\n declare loading: boolean;\n declare errorMessage?: string;\n declare body: string;\n declare title: string;\n declare confirmText: string;\n declare cancelText: string;\n declare deferClose: boolean;\n declare nearExplorerUrl?: string;\n declare intentDigest?: string;\n\n // Keep essential custom elements from being tree-shaken\n private _ensureDrawerDefinition = DrawerElement;\n private _drawerEl: any | null = null;\n private _open: boolean = false;\n\n private _onWindowMessage = (ev: MessageEvent) => {\n const data = (ev && ev.data) || {};\n if (!data || typeof (data as any).type !== 'string') return;\n if ((data as any).type === 'MODAL_TIMEOUT') {\n const msg = typeof (data as any).payload === 'string' && (data as any).payload\n ? (data as any).payload\n : 'Operation timed out';\n this.loading = false;\n this.errorMessage = msg;\n // Best-effort close and emit cancel so host resolves and cleans up\n this._drawerEl?.handleClose?.();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (this.loading) return;\n e.preventDefault();\n this._drawerEl?.handleClose();\n if (!this._drawerEl) {\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n }\n // Rely on drawer's `cancel` event -> onDrawerCancel to emit w3a:modal-cancel\n }\n };\n\n constructor() {\n super();\n this.nearAccountId = '';\n this.txSigningRequests = [];\n this.theme = 'dark';\n this.loading = false;\n this.body = '';\n this.title = '';\n this.confirmText = 'Next';\n this.cancelText = 'Cancel';\n this.deferClose = false;\n }\n\n protected getComponentPrefix(): string { return 'drawer-tx'; }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // Light DOM root so tokens cascade without Shadow DOM boundaries\n const root = (this as unknown) as HTMLElement;\n // Preload tokens + styles on host\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css').catch(() => {});\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css').catch(() => {});\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css').catch(() => {});\n return root;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure root token theme is applied immediately on mount\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme) {\n const current = docEl.getAttribute('data-w3a-theme');\n if (!current || current === 'dark' || current === 'light') {\n docEl.setAttribute('data-w3a-theme', this.theme);\n (this as any)._ownsThemeAttr = true;\n }\n }\n } catch {}\n // Also ensure tokens CSS on document root for host-scoped variables\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl) ensureExternalStyles(docEl, 'w3a-components.css', 'data-w3a-components-css').catch(() => {});\n } catch {}\n window.addEventListener('keydown', this._onKeyDown);\n window.addEventListener('message', this._onWindowMessage as EventListener);\n // Ensure immediate keyboard handling (e.g., ESC) by focusing host/iframe\n const hostEl = this as unknown as HTMLElement;\n if (hostEl.tabIndex === undefined || hostEl.tabIndex === null) {\n (hostEl as any).tabIndex = -1;\n }\n hostEl.focus({ preventScroll: true } as FocusOptions);\n if (typeof window.focus === 'function') { window.focus(); }\n }\n\n async firstUpdated(): Promise<void> {\n this._drawerEl = (this as unknown as HTMLElement).querySelector(W3A_DRAWER_ID) as any;\n // Ensure external styles are ready before opening (await Promise-based loader)\n const root = (this.renderRoot as unknown) as ShadowRoot | DocumentFragment | HTMLElement;\n await Promise.all([\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n // Preload drawer.css so fallback <link> is loaded before opening\n ensureExternalStyles(root, 'drawer.css', 'data-w3a-drawer-css'),\n ]);\n // Open after mount with double-rAF to let layout/styles settle\n await new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())));\n this._open = true;\n this.requestUpdate();\n }\n\n disconnectedCallback(): void {\n window.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('message', this._onWindowMessage as EventListener);\n super.disconnectedCallback();\n }\n\n updated(changed: PropertyValues) {\n super.updated(changed);\n // Keep the iframe/root document's theme in sync so :root[data-w3a-theme] tokens apply\n if (changed.has('theme')) {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme && (this as any)._ownsThemeAttr) {\n docEl.setAttribute('data-w3a-theme', this.theme);\n }\n }\n }\n\n private onDrawerCancel = () => {\n if (this.loading) return;\n // Close drawer locally to ensure animation\n this._open = false;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n };\n\n private onContentConfirm = () => {\n if (this.loading) return;\n this.loading = true;\n this.requestUpdate();\n // Bridge semantic event to canonical event\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n bubbles: true,\n composed: true,\n detail: { confirmed: true }\n }));\n };\n\n private onContentCancel = () => {\n if (this.loading) return;\n this._drawerEl?.handleClose();\n this._open = false; this.requestUpdate();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n };\n\n // Public method for two‑phase close from host/bootstrap\n close(_confirmed: boolean) {\n this.remove();\n }\n\n render() {\n return html`\n <w3a-drawer\n .open=${this._open}\n theme=${this.theme}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .height=${'auto'}\n .overpullPx=${160}\n .dragToClose=${true}\n .showCloseButton=${true}\n @lit-cancel=${this.onDrawerCancel}\n >\n <div class=\"drawer-tx-confirmer-root\">\n <div class=\"section responsive-card margin-left1\">\n <div class=\"drawer-header\">\n ${(() => {\n const isRegistration = (this.txSigningRequests?.length || 0) === 0;\n const fallback = isRegistration ? 'Register with Passkey' : 'Confirm with Passkey';\n const titleText = (this.title || '').trim();\n const heading = titleText || fallback;\n return html`<h2 class=\"drawer-title\">${heading}</h2>`;\n })()}\n </div>\n </div>\n\n <div class=\"section responsive-card margin-left1\">\n <div class=\"rpid-wrapper\">\n <div class=\"rpid\">\n <div class=\"secure-indicator\">\n <w3a-padlock-icon class=\"padlock-icon\"></w3a-padlock-icon>\n ${this.vrfChallenge?.rpId\n ? html`<span class=\"domain-text\">${this.vrfChallenge.rpId}</span>`\n : ''}\n </div>\n <span class=\"security-details\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"block-height-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"/>\n <path d=\"m3.3 7 8.7 5 8.7-5\"/>\n <path d=\"M12 22V12\"/>\n </svg>\n ${this.vrfChallenge?.blockHeight\n ? html`block ${this.vrfChallenge.blockHeight}`\n : ''}\n </span>\n </div>\n </div>\n ${\n this.body && this.body.trim()\n ? html`<div class=\"confirmation-body\">${this.body}</div>`\n : ''\n }\n </div>\n <div class=\"section responsive-card responsive-card-center\">\n <w3a-tx-confirm-content\n .nearAccountId=${this.nearAccountId || ''}\n .txSigningRequests=${this.txSigningRequests || []}\n .intentDigest=${this.intentDigest}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .showShadow=${false}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n @lit-confirm=${this.onContentConfirm}\n @lit-cancel=${this.onContentCancel}\n ></w3a-tx-confirm-content>\n </div>\n\n </div>\n </w3a-drawer>\n `;\n }\n}\n\nimport { W3A_DRAWER_TX_CONFIRMER_ID } from '../tags';\n\n// Define canonical tag\nif (!customElements.get(W3A_DRAWER_TX_CONFIRMER_ID)) {\n customElements.define(W3A_DRAWER_TX_CONFIRMER_ID, DrawerTxConfirmerElement);\n}\n\nexport default DrawerTxConfirmerElement;\n","import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport { ensureExternalStyles } from '../css/css-loader';\n\nexport type HaloTheme = 'dark' | 'light';\n\nexport class HaloBorderElement extends LitElementWithProps {\n static properties = {\n animated: { type: Boolean },\n theme: { type: String },\n durationMs: { type: Number, attribute: 'duration-ms' },\n ringGap: { type: Number, attribute: 'ring-gap' },\n ringWidth: { type: Number, attribute: 'ring-width' },\n ringBorderRadius: { type: String, attribute: 'ring-border-radius' },\n ringBorderShadow: { type: String, attribute: 'ring-border-shadow' },\n ringBackground: { type: String, attribute: 'ring-background' },\n padding: { type: String },\n innerPadding: { type: String, attribute: 'inner-padding' },\n innerBackground: { type: String, attribute: 'inner-background' },\n } as const;\n\n declare animated?: boolean;\n declare theme?: HaloTheme;\n declare durationMs?: number;\n declare ringGap?: number;\n declare ringWidth?: number;\n declare ringBorderRadius?: string;\n declare ringBorderShadow?: string;\n declare ringBackground?: string;\n declare padding?: string;\n declare innerPadding?: string;\n declare innerBackground?: string;\n\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n const p = ensureExternalStyles(root as ShadowRoot | DocumentFragment | HTMLElement, 'halo-border.css', 'data-w3a-halo-border-css');\n this._stylePromises.push(p);\n p.catch(() => {});\n return root;\n }\n\n // Defer first render until external styles are adopted to avoid FOUC\n protected shouldUpdate(_changed: Map<string | number | symbol, unknown>): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const settle = Promise.all(this._stylePromises)\n .then(() => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r()))));\n this._stylesAwaiting = settle.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n private _rafId: number | null = null;\n private _startTs: number = 0;\n private _running: boolean = false;\n\n protected updated(changed?: PropertyValues): void {\n // Bridge prop values into CSS variables (no inline style attributes)\n const vars: Record<string, string> = {};\n if (typeof this.ringGap === 'number') vars['--ring-gap'] = `${this.ringGap}px`;\n if (typeof this.ringWidth === 'number') vars['--ring-width'] = `${this.ringWidth}px`;\n if (this.ringBorderRadius) vars['--ring-border-radius'] = this.ringBorderRadius;\n if (this.innerPadding) vars['--inner-padding'] = this.innerPadding;\n if (this.innerBackground) vars['--inner-background'] = this.innerBackground;\n if (this.ringBackground) vars['--ring-stops'] = this.ringBackground;\n if (this.ringBorderShadow) vars['--halo-box-shadow'] = this.ringBorderShadow;\n // Ensure an initial angle is present\n vars['--halo-angle'] = vars['--halo-angle'] || '0deg';\n this.setCssVars(vars);\n\n // Start/stop animation based on \"animated\" or duration changes\n if (!changed) return;\n if (changed.has('animated') || changed.has('durationMs')) {\n if (this.animated) this.start(); else this.stop();\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (this.animated) this.start();\n }\n\n disconnectedCallback(): void {\n this.stop();\n super.disconnectedCallback();\n }\n\n private tick = (ts: number) => {\n if (!this._running) return;\n if (!this._startTs) this._startTs = ts;\n const dur = (typeof this.durationMs === 'number' && this.durationMs > 0) ? this.durationMs : 1150;\n const delta = (ts - this._startTs) % dur;\n const angle = (delta / dur) * 360;\n // Update only the angle var via adoptedStyleSheet (no style attribute writes)\n this.setCssVars({ '--halo-angle': `${angle}deg` });\n this._rafId = requestAnimationFrame(this.tick);\n };\n\n private start() {\n if (this._running) return;\n this._running = true;\n this._startTs = 0;\n this._rafId = requestAnimationFrame(this.tick);\n }\n\n private stop() {\n this._running = false;\n if (this._rafId) {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n // Reset angle\n this.setCssVars({ '--halo-angle': `0deg` });\n }\n\n render() {\n return html`\n <div class=\"halo-root ${this.theme ?? 'light'} ${this.animated ? 'animated' : ''}\">\n <div class=\"halo-inner\">\n <div class=\"halo-outer\">\n ${this.animated ? html`<div class=\"halo-ring\"></div>` : ''}\n <div class=\"halo-content\"><slot></slot></div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nimport { W3A_HALO_BORDER_ID } from '../tags';\n\nif (!customElements.get(W3A_HALO_BORDER_ID)) {\n customElements.define(W3A_HALO_BORDER_ID, HaloBorderElement);\n}\n\nexport default HaloBorderElement;\n","import { html } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport type { HaloTheme } from '../HaloBorder';\nimport '../HaloBorder';\nimport { ensureExternalStyles } from '../css/css-loader';\n\nexport class PasskeyHaloLoadingElement extends LitElementWithProps {\n static properties = {\n // Pass-through HaloBorder props\n animated: { type: Boolean },\n theme: { type: String },\n ringGap: { type: Number, attribute: 'ring-gap' },\n ringWidth: { type: Number, attribute: 'ring-width' },\n ringBorderRadius: { type: String, attribute: 'ring-border-radius' },\n ringBorderShadow: { type: String, attribute: 'ring-border-shadow' },\n ringBackground: { type: String, attribute: 'ring-background' },\n padding: { type: String },\n innerPadding: { type: String, attribute: 'inner-padding' },\n innerBackground: { type: String, attribute: 'inner-background' },\n // Local visual props\n height: { type: Number },\n width: { type: Number },\n // Icon container overrides\n iconContainerBorderRadius: { type: String, attribute: 'icon-container-border-radius' },\n iconContainerBackgroundColor: { type: String, attribute: 'icon-container-background-color' },\n } as const;\n\n declare animated?: boolean;\n declare theme?: HaloTheme;\n declare ringGap?: number;\n declare ringWidth?: number;\n declare ringBorderRadius?: string;\n declare ringBorderShadow?: string;\n declare ringBackground?: string;\n declare padding?: string;\n declare innerPadding?: string;\n declare innerBackground?: string;\n declare height?: number;\n declare width?: number;\n declare iconContainerBorderRadius?: string;\n declare iconContainerBackgroundColor?: string;\n\n // Static styles removed; external stylesheet is adopted for CSP compatibility\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n const p = ensureExternalStyles(root as ShadowRoot | DocumentFragment | HTMLElement, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css');\n this._stylePromises.push(p);\n p.catch(() => {});\n return root;\n }\n\n // Defer first render until external styles are adopted to avoid FOUC\n protected shouldUpdate(_changed: Map<string | number | symbol, unknown>): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const settle = Promise.all(this._stylePromises)\n .then(() => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r()))));\n this._stylesAwaiting = settle.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n\n protected updated(): void {\n // Bridge prop overrides into CSS variables to avoid inline styles\n const vars: Record<string, string> = {};\n if (this.iconContainerBackgroundColor) {\n vars['--w3a-modal__passkey-halo-loading-icon-container__background-color'] = this.iconContainerBackgroundColor;\n }\n if (this.iconContainerBorderRadius) {\n vars['--w3a-modal__passkey-halo-loading-icon-container__border-radius'] = this.iconContainerBorderRadius;\n }\n if (Object.keys(vars).length) this.setCssVars(vars);\n }\n\n render() {\n const theme = this.theme ?? 'light';\n const height = this.height ?? 24;\n const width = this.width ?? 24;\n const animated = this.animated ?? true;\n const ringGap = this.ringGap ?? 4;\n const ringWidth = this.ringWidth ?? 4;\n const ringBorderRadius = this.ringBorderRadius ?? '1.125rem';\n const ringBorderShadow = this.ringBorderShadow;\n const ringBackground = this.ringBackground;\n const padding = this.padding;\n const innerPadding = this.innerPadding ?? '4px';\n const innerBackground = this.innerBackground;\n\n return html`\n <div class=\"w3a-passkey-loading-root ${theme}\">\n <w3a-halo-border\n .theme=${theme}\n .animated=${animated}\n .ringGap=${ringGap}\n .ringWidth=${ringWidth}\n .ringBorderRadius=${ringBorderRadius}\n .ringBorderShadow=${ringBorderShadow}\n .ringBackground=${ringBackground}\n .padding=${padding}\n .innerPadding=${innerPadding}\n .innerBackground=${innerBackground}\n >\n <div class=\"w3a-passkey-loading-touch-icon-container\">\n ${this.renderTouchIcon({ height, width })}\n </div>\n </w3a-halo-border>\n </div>\n `;\n }\n\n private renderTouchIcon({ height, width }: { height: number; width: number; }) {\n const strokeWidth = 'var(--w3a-modal__passkey-halo-loading-touch-icon__stroke-width, 3)';\n\n return html`\n <svg\n class=\"w3a-passkey-loading-touch-icon\"\n width=${width}\n height=${height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.40519 19.0481C6.58912 18.6051 6.75832 18.1545 6.91219 17.6969M14.3433 20.6926C14.6095 19.9418 14.8456 19.1768 15.0502 18.399C15.2359 17.6934 15.3956 16.9772 15.5283 16.2516M19.4477 17.0583C19.8121 15.0944 20.0026 13.0694 20.0026 11C20.0026 6.58172 16.4209 3 12.0026 3C10.7472 3 9.55932 3.28918 8.50195 3.80456M3.52344 15.0245C3.83663 13.7343 4.00262 12.3865 4.00262 11C4.00262 9.25969 4.55832 7.64917 5.50195 6.33621M12.003 11C12.003 13.7604 11.5557 16.4163 10.7295 18.8992C10.5169 19.5381 10.2792 20.1655 10.0176 20.7803M7.71227 14.5C7.90323 13.3618 8.00262 12.1925 8.00262 11C8.00262 8.79086 9.79348 7 12.0026 7C14.2118 7 16.0026 8.79086 16.0026 11C16.0026 11.6166 15.9834 12.2287 15.9455 12.8357\"\n stroke=\"currentColor\"\n stroke-width=${strokeWidth}\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n vector-effect=\"non-scaling-stroke\"\n pathLength=\"1\"\n />\n </svg>\n `;\n }\n}\n\nimport { W3A_PASSKEY_HALO_LOADING_ID } from '../tags';\n\nif (!customElements.get(W3A_PASSKEY_HALO_LOADING_ID)) {\n customElements.define(W3A_PASSKEY_HALO_LOADING_ID, PasskeyHaloLoadingElement);\n}\n\nexport default PasskeyHaloLoadingElement;\n","import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\n\nimport { TransactionInputWasm } from '../../../types';\nimport type { VRFChallenge } from '../../../types/vrf-worker';\n\nimport TxTree from '../TxTree';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport TxConfirmContentElement from './tx-confirm-content';\nimport type { ThemeName } from '../confirm-ui-types';\n// Ensure required custom elements are defined in this bundle (avoid tree-shake drops)\nimport HaloBorderElement from '../HaloBorder';\nimport PasskeyHaloLoadingElement from '../PasskeyHaloLoading';\nimport type { ConfirmUIElement } from '../confirm-ui-types';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\n\nexport interface SecureTxSummary {\n to?: string;\n totalAmount?: string;\n method?: string;\n fingerprint?: string; // short digest for display\n}\n\n// TxAction from wasm-worker\nexport interface TxAction {\n action_type: string;\n method_name?: string;\n args?: string;\n gas?: string;\n deposit?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/**\n * Modal transaction confirmation component with multiple display variants.\n * Built with Lit with strict CSP for XSS protection and reactive updates.\n */\nexport class ModalTxConfirmElement extends LitElementWithProps implements ConfirmUIElement {\n static requiredChildTags = ['w3a-tx-confirm-content'];\n static strictChildDefinitions = true;\n // Prevent bundlers from dropping nested custom element definitions used via templates\n static keepDefinitions = [TxConfirmContentElement];\n // Component properties (automatically reactive)\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n to: { type: String },\n totalAmount: { type: String },\n method: { type: String },\n fingerprint: { type: String },\n body: { type: String },\n title: { type: String },\n cancelText: { type: String },\n confirmText: { type: String },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n loading: { type: Boolean },\n errorMessage: { type: String },\n theme: { type: String, attribute: 'theme', reflect: true },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n };\n\n totalAmount = '';\n method = '';\n fingerprint = '';\n body = '';\n title = '';\n cancelText = 'Cancel';\n confirmText = 'Next';\n txSigningRequests: TransactionInputWasm[] = [];\n vrfChallenge?: Partial<VRFChallenge>;\n loading = false;\n errorMessage: string | undefined = undefined;\n // Theme tokens now come from external CSS (tx-confirmer.css)\n // style injection has been removed to satisfy strict CSP.\n theme: ThemeName = 'dark';\n nearExplorerUrl?: string;\n intentDigest?: string;\n declare nearAccountId: string;\n // When true, this element will NOT remove itself on confirm/cancel.\n // The host is responsible for sending a CLOSE_MODAL instruction.\n deferClose = false;\n // Styles gating to avoid first-paint FOUC\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n\n // Keep essential custom elements from being tree-shaken\n private _ensureTreeDefinition = TxTree;\n private _ensureHaloElements = [HaloBorderElement, PasskeyHaloLoadingElement];\n\n // Removed fixed JS breakpoints; rely on CSS/container sizing for zoom resilience\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n // Only close for modal-style render modes\n e.preventDefault();\n this._handleCancel();\n }\n };\n private _onWindowMessage = (ev: MessageEvent) => {\n const data = (ev && ev.data) || {};\n if (!data || typeof (data as any).type !== 'string') return;\n if ((data as any).type === 'MODAL_TIMEOUT') {\n const msg = typeof (data as any).payload === 'string' && (data as any).payload\n ? (data as any).payload\n : 'Operation timed out';\n this.loading = false;\n this.errorMessage = msg;\n // Emit cancel so the host resolves and removes this element via two‑phase close\n this._handleCancel();\n }\n };\n // Guard to prevent immediate backdrop-cancel due to the click that mounted the modal\n private _backdropArmed = false;\n\n // Render in light DOM to simplify CSS variable flow across nested components\n // (Shadow DOM disabled by returning the host element as the render root)\n\n // No inline static styles; see tx-confirmer.css\n constructor() {\n super();\n // Pre-ensure document-level styles so link loads can complete before first render\n const root = (document?.documentElement || null) as unknown as HTMLElement | null;\n if (root) {\n this._stylePromises.push(\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n // Preload nested visuals to avoid first-paint jank when halo/loader mount\n ensureExternalStyles(root, 'halo-border.css', 'data-w3a-halo-border-css'),\n ensureExternalStyles(root, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css'),\n );\n }\n }\n\n private _ownsThemeAttr = false;\n\n updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n // Keep the iframe/root document's theme in sync so :root[data-w3a-theme] tokens apply\n if (changedProperties.has('theme')) {\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme && this._ownsThemeAttr) {\n docEl.setAttribute('data-w3a-theme', this.theme);\n }\n } catch {}\n }\n }\n\n protected getComponentPrefix(): string {\n return 'modal';\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = (this as unknown) as HTMLElement;\n // tx-tree.css for nested TxTree visuals inside the modal\n this._stylePromises.push(ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'));\n // tx-confirmer.css for modal layout + tokens\n this._stylePromises.push(ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'));\n // Ensure nested loader/halo styles are present before first paint to avoid FOUC\n this._stylePromises.push(ensureExternalStyles(root, 'halo-border.css', 'data-w3a-halo-border-css'));\n this._stylePromises.push(ensureExternalStyles(root, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css'));\n return root;\n }\n\n // Dynamic style application removed; CSS variables come from tx-confirmer.css\n\n disconnectedCallback() {\n window.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('message', this._onWindowMessage as EventListener);\n super.disconnectedCallback();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure root token theme is applied immediately on mount\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme) {\n const current = docEl.getAttribute('data-w3a-theme');\n // If missing or already using built-in values, take ownership and set\n if (!current || current === 'dark' || current === 'light') {\n docEl.setAttribute('data-w3a-theme', this.theme);\n this._ownsThemeAttr = true;\n }\n }\n } catch {}\n // Arm backdrop after the current event loop to avoid capturing the mounting click\n setTimeout(() => { this._backdropArmed = true; }, 0);\n // Listen globally so Escape works regardless of focus target\n window.addEventListener('keydown', this._onKeyDown);\n // Listen for global timeout notification (posted by SignerWorkerManager on operation timeout)\n window.addEventListener('message', this._onWindowMessage as EventListener);\n // Ensure this iframe/host receives keyboard focus so ESC works immediately\n // Make host focusable and focus it without scrolling\n const hostEl = this as unknown as HTMLElement;\n hostEl.tabIndex = hostEl.tabIndex ?? -1;\n hostEl.focus({ preventScroll: true } as FocusOptions);\n // Also attempt to focus the frame window in case we're inside an iframe\n if (typeof window.focus === 'function') {\n window.focus();\n }\n }\n\n protected shouldUpdate(_changed: PropertyValues): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const p = Promise.all(this._stylePromises).then(\n () => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())))\n );\n this._stylesAwaiting = p.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n\n render() {\n return html`\n <!-- Separate backdrop layer for independent animation -->\n <div class=\"modal-backdrop-blur\" @click=${this._handleBackdropClick}></div>\n <!-- Modal content layer -->\n <div class=\"modal-backdrop\" @click=${this._handleContentClick}>\n <div class=\"modal-container-root\">\n\n <div class=\"responsive-card\">\n <div class=\"hero\">\n <w3a-passkey-halo-loading\n .theme=${this.theme}\n .animated=${!this.errorMessage ? true : false}\n .ringGap=${4}\n .ringWidth=${4}\n .ringBorderRadius=${'1.125rem'}\n .ringBackground=${'var(--w3a-modal__passkey-halo-loading__ring-background)'}\n .innerPadding=${'0px'}\n .innerBackground=${'var(--w3a-modal__passkey-halo-loading__inner-background)'}\n .height=${36}\n .width=${36}\n ></w3a-passkey-halo-loading>\n <div class=\"hero-container\">\n <!-- Hero heading -->\n ${(() => {\n const isRegistration = (this.txSigningRequests?.length || 0) === 0;\n const fallback = isRegistration ? 'Register with Passkey' : 'Confirm with Passkey';\n const titleText = (this.title || '').trim();\n const heading = titleText || fallback;\n return html`<h2 class=\"hero-heading\">${heading}</h2>`;\n })()}\n ${this.errorMessage\n ? html`<div class=\"error-banner\">${this.errorMessage}</div>`\n : ''}\n <!-- RpID Section -->\n <div class=\"rpid-wrapper\">\n <div class=\"rpid\">\n <div class=\"secure-indicator\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"padlock-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n ${this.vrfChallenge?.rpId\n ? html`<span class=\"domain-text\">${this.vrfChallenge.rpId}</span>`\n : ''}\n </div>\n <span class=\"security-details\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"block-height-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A 2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"/>\n <path d=\"m3.3 7 8.7 5 8.7-5\"/>\n <path d=\"M12 22V12\"/>\n </svg>\n ${this.vrfChallenge?.blockHeight\n ? html`block ${this.vrfChallenge.blockHeight}`\n : ''}\n </span>\n </div>\n </div>\n </div>\n </div>\n ${\n this.body && this.body.trim()\n ? html`<div class=\"confirmation-body\">${this.body}</div>`\n : ''\n }\n </div>\n\n <div class=\"responsive-card\">\n <w3a-tx-confirm-content\n .nearAccountId=${this['nearAccountId'] || ''}\n .txSigningRequests=${this.txSigningRequests || []}\n .intentDigest=${this.intentDigest}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .showShadow=${false}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n @lit-confirm=${this._handleConfirm}\n @lit-cancel=${this._handleCancel}\n ></w3a-tx-confirm-content>\n </div>\n </div>\n </div>\n `;\n }\n\n private _handleCancel() {\n if (this.loading) return;\n // Canonical event (include a consistent detail payload)\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n if (!this.deferClose) {\n this._resolveAndCleanup(false);\n }\n }\n\n private _handleConfirm() {\n if (this.loading) return;\n this.loading = true;\n this.requestUpdate();\n // Canonical event (include a consistent detail payload)\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n bubbles: true,\n composed: true,\n detail: { confirmed: true }\n }));\n if (!this.deferClose) {\n this._resolveAndCleanup(true);\n }\n }\n\n private _handleBackdropClick() {\n // Ignore the first click that may have triggered mounting the modal\n if (!this._backdropArmed) return;\n this._handleCancel();\n }\n\n private _handleContentClick(e: Event) {\n e.stopPropagation();\n }\n\n private _resolveAndCleanup(confirmed: boolean) {\n this.remove();\n }\n\n // Public method for two-phase close from host/bootstrap\n close(confirmed: boolean) {\n this._resolveAndCleanup(confirmed);\n }\n\n}\n\n// Register the custom element\nimport { W3A_MODAL_TX_CONFIRMER_ID } from '../tags';\n\n// Define canonical tag\nif (!customElements.get(W3A_MODAL_TX_CONFIRMER_ID)) {\n customElements.define(W3A_MODAL_TX_CONFIRMER_ID, ModalTxConfirmElement);\n}\n","import { html, type PropertyValues } from 'lit';\nimport { createRef, Ref, ref } from 'lit/directives/ref.js';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport type { ConfirmUIElement, ThemeName } from '../confirm-ui-types';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\nimport type { TransactionInputWasm, VRFChallenge } from '../../../types';\nimport { computeUiIntentDigestFromTxs, orderActionForDigest } from '../../txDigest';\nimport { isActionArgsWasm, toActionArgsWasm, type ActionArgs, type ActionArgsWasm } from '@/core/types/actions';\nimport { isObject, isString } from '../../../WalletIframe/validation';\nimport { W3A_TX_CONFIRMER_ID } from '../tags';\nimport { DrawerTxConfirmerElement } from './viewer-drawer';\nimport { ModalTxConfirmElement } from './viewer-modal';\n\nconst DEFAULT_VARIANT: Variant = 'modal';\n\nexport type Variant = 'modal' | 'drawer';\n\nexport type TxConfirmerVariantElement = (ConfirmUIElement & HTMLElement) & {\n nearAccountId?: string;\n txSigningRequests?: TransactionInputWasm[];\n vrfChallenge?: Partial<VRFChallenge>;\n theme?: ThemeName;\n loading?: boolean;\n errorMessage?: string;\n body?: string;\n title?: string;\n confirmText?: string;\n cancelText?: string;\n deferClose?: boolean;\n requestUpdate?: () => void;\n close?: (confirmed: boolean) => void;\n};\n\nfunction isTransactionInput(candidate: unknown): candidate is TransactionInputWasm {\n if (!isObject(candidate)) return false;\n const record = candidate as Record<string, unknown>;\n const receiver = record.receiverId;\n const actions = record.actions;\n return isString(receiver) && Array.isArray(actions);\n}\n\n/**\n * Thin wrapper that renders the modal or drawer confirmer inline instead of\n * inside a nested iframe. It forwards props to the active variant element,\n * performs intent digest validation, and re-emits canonical events.\n */\nexport class TxConfirmerWrapperElement extends LitElementWithProps {\n static properties = {\n variant: { type: String, reflect: true },\n nearAccountId: { type: String, attribute: 'near-account-id' },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n theme: { type: String },\n loading: { type: Boolean },\n errorMessage: { type: String, attribute: 'error-message' },\n intentDigest: { type: String, attribute: 'intent-digest' },\n body: { type: String },\n title: { type: String },\n confirmText: { type: String, attribute: 'confirm-text' },\n cancelText: { type: String, attribute: 'cancel-text' },\n deferClose: { type: Boolean, attribute: 'defer-close' },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n } as const;\n\n static keepDefinitions = [ModalTxConfirmElement, DrawerTxConfirmerElement];\n\n declare variant: Variant;\n declare nearAccountId: string;\n declare txSigningRequests: TransactionInputWasm[];\n declare vrfChallenge?: Partial<VRFChallenge>;\n declare theme: ThemeName;\n declare loading: boolean;\n declare errorMessage?: string;\n declare intentDigest?: string;\n declare body: string;\n declare title: string;\n declare confirmText: string;\n declare cancelText: string;\n declare deferClose: boolean;\n declare nearExplorerUrl?: string;\n\n private readonly childRef: Ref<TxConfirmerVariantElement> = createRef();\n private redispatchingEvent = false;\n private currentChild: TxConfirmerVariantElement | null = null;\n private boundConfirmListener = (event: Event) => { void this.handleChildConfirm(event); };\n private boundCancelListener = (_event: Event) => { this.handleChildCancel(); };\n\n constructor() {\n super();\n this.variant = DEFAULT_VARIANT;\n this.nearAccountId = '';\n this.txSigningRequests = [];\n this.theme = 'dark';\n this.loading = false;\n this.deferClose = true;\n this.body = '';\n this.title = '';\n this.confirmText = 'Confirm';\n this.cancelText = 'Cancel';\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // Render into light DOM so the variant element controls stacking/context.\n return this;\n }\n\n protected updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n this.syncChildProps();\n if (changed.has('errorMessage')) {\n this.syncErrorAttribute();\n }\n }\n\n render() {\n const variant = this.variant === 'drawer' ? 'drawer' : 'modal';\n\n if (variant === 'drawer') {\n return html`\n <w3a-drawer-tx-confirmer\n ${ref(this.childRef)}\n .nearAccountId=${this.nearAccountId}\n .txSigningRequests=${this.txSigningRequests}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .body=${this.body}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n .deferClose=${this.deferClose}\n ></w3a-drawer-tx-confirmer>\n `;\n }\n\n return html`\n <w3a-modal-tx-confirmer\n ${ref(this.childRef)}\n .nearAccountId=${this.nearAccountId}\n .txSigningRequests=${this.txSigningRequests}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .body=${this.body}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n .deferClose=${this.deferClose}\n ></w3a-modal-tx-confirmer>\n `;\n }\n\n private syncChildProps(): void {\n const child = this.childRef.value;\n if (!child) return;\n child.nearAccountId = this.nearAccountId;\n child.txSigningRequests = this.txSigningRequests;\n child.vrfChallenge = this.vrfChallenge;\n child.theme = this.theme;\n child.loading = this.loading;\n child.errorMessage = this.errorMessage;\n child.body = this.body;\n child.title = this.title;\n child.confirmText = this.confirmText;\n child.cancelText = this.cancelText;\n child.deferClose = this.deferClose;\n (child as any).nearExplorerUrl = this.nearExplorerUrl;\n child.requestUpdate?.();\n this.attachChildListeners();\n }\n\n private syncErrorAttribute(): void {\n if (this.errorMessage) {\n this.setAttribute('data-error-message', this.errorMessage);\n } else {\n this.removeAttribute('data-error-message');\n }\n }\n\n private attachChildListeners(): void {\n const child = this.childRef.value;\n if (!child || child === this.currentChild) return;\n if (this.currentChild) {\n this.detachChildListeners();\n }\n child.addEventListener(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, this.boundConfirmListener as EventListener);\n child.addEventListener(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, this.boundCancelListener as EventListener);\n this.currentChild = child;\n }\n\n private detachChildListeners(): void {\n if (!this.currentChild) return;\n this.currentChild.removeEventListener(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, this.boundConfirmListener as EventListener);\n this.currentChild.removeEventListener(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, this.boundCancelListener as EventListener);\n this.currentChild = null;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.detachChildListeners();\n // Remove capture-phase fallback listener\n this.removeEventListener(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, this.boundConfirmListener as EventListener, { capture: true } as any);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Capture-phase fallback: ensure we catch early CONFIRM events even if child listeners\n // are not yet attached due to rendering/refs timing.\n this.addEventListener(\n WalletIframeDomEvents.TX_CONFIRMER_CONFIRM,\n this.boundConfirmListener as EventListener,\n { capture: true } as any\n );\n }\n\n private handleChildCancel(): void {\n if (this.loading) {\n this.loading = false;\n this.syncChildProps();\n }\n }\n\n private async handleChildConfirm(event: Event): Promise<void> {\n if (this.redispatchingEvent) return;\n const child = this.childRef.value;\n const detail = (event as CustomEvent<{ confirmed?: boolean; error?: string }> | undefined)?.detail;\n let confirmed = detail?.confirmed !== false;\n let error: string | undefined = typeof detail?.error === 'string' ? detail.error : undefined;\n\n this.redispatchingEvent = true;\n try {\n event.stopImmediatePropagation();\n console.debug('[TxConfirmerWrapper] CONFIRM received', { hasIntent: !!this.intentDigest, txCount: (this.txSigningRequests?.length ?? 0) });\n\n if (confirmed && this.intentDigest && (this.txSigningRequests?.length ?? 0) > 0) {\n try {\n const digest = await this.computeIntentDigest();\n console.debug('[TxConfirmerWrapper] computed digest', { digest, expected: this.intentDigest });\n if (digest !== this.intentDigest) {\n confirmed = false;\n error = 'INTENT_DIGEST_MISMATCH';\n }\n } catch (err) {\n confirmed = false;\n error = 'UI_DIGEST_VALIDATION_FAILED';\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n console.warn('[TxConfirmerWrapper] intent digest validation failed', err);\n }\n }\n }\n\n if (confirmed) {\n if (!this.loading) {\n this.loading = true;\n this.syncChildProps();\n }\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n detail: { confirmed: true },\n bubbles: true,\n composed: true,\n }));\n return;\n }\n\n this.loading = false;\n this.syncChildProps();\n // Close the child element if it exposes a close API; otherwise remove wrapper to avoid stale UI\n if (child?.close) {\n child.close(false);\n } else {\n this.remove();\n }\n\n const detail: { confirmed: false; error?: string } = { confirmed: false };\n if (typeof error === 'string') detail.error = error;\n\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n detail,\n bubbles: true,\n composed: true,\n }));\n } finally {\n this.redispatchingEvent = false;\n }\n }\n\n private async computeIntentDigest(): Promise<string> {\n const raw = Array.isArray(this.txSigningRequests) ? this.txSigningRequests : [];\n // Use the same canonical digest shape as confirmAndPrepareSigningSession:\n // { receiverId, actions: ActionArgsWasm[] } with actions normalized via orderActionForDigest.\n const txs: TransactionInputWasm[] = raw\n .filter(isTransactionInput)\n .map((tx) => ({\n receiverId: tx.receiverId,\n actions: tx.actions\n .map((action) => (isActionArgsWasm(action) ? action : toActionArgsWasm(action as ActionArgs)))\n .map((action) => orderActionForDigest(action) as ActionArgsWasm),\n }));\n\n return computeUiIntentDigestFromTxs(txs);\n }\n}\n\nif (!customElements.get(W3A_TX_CONFIRMER_ID)) {\n customElements.define(W3A_TX_CONFIRMER_ID, TxConfirmerWrapperElement);\n}\n","import { isActionArgsWasm, toActionArgsWasm, type ActionArgs, type ActionArgsWasm } from '@/core/types/actions';\nimport type { VrfWorkerManagerContext } from '../VrfWorkerManager';\nimport type { TransactionSummary } from '../VrfWorkerManager/confirmTxFlow/types';\nimport { WalletIframeDomEvents } from '../../WalletIframe/events';\nimport { TransactionInputWasm, VRFChallenge } from '../../types';\n\nimport { W3A_TX_CONFIRMER_ID, CONFIRM_UI_ELEMENT_SELECTORS, W3A_CONFIRM_PORTAL_ID } from './tags';\nimport type { ConfirmUIHandle, ConfirmUIUpdate, ConfirmationUIMode, ThemeName } from './confirm-ui-types';\nexport type { ConfirmUIHandle, ConfirmUIUpdate, ConfirmationUIMode } from './confirm-ui-types';\nimport { validateTheme } from './confirm-ui-types';\nimport { computeUiIntentDigestFromTxs, orderActionForDigest } from '../txDigest';\n// Ensure the wrapper element is registered when this module loads.\n// Note: this must be a value import (not side-effect-only) so bundlers don't\n// tree-shake it away under `sideEffects: false`.\nimport { TxConfirmerWrapperElement } from './IframeTxConfirmer/tx-confirmer-wrapper';\n\ntry {\n if (typeof customElements !== 'undefined' && !customElements.get(W3A_TX_CONFIRMER_ID)) {\n customElements.define(W3A_TX_CONFIRMER_ID, TxConfirmerWrapperElement);\n }\n} catch {}\n\n// Resolve theme preference from explicit param, user preferences, or DOM attribute\nfunction resolveTheme(ctx: VrfWorkerManagerContext, requested?: ThemeName): ThemeName {\n let resolved = validateTheme(requested);\n if (!resolved) {\n try { resolved = validateTheme((ctx as any)?.userPreferencesManager?.getUserTheme?.()); } catch {}\n }\n if (!resolved) {\n const domAttr = (document?.documentElement?.getAttribute('data-w3a-theme') || '').toLowerCase();\n resolved = validateTheme(domAttr);\n }\n return resolved || 'dark';\n}\n\n// Minimal host element interface for the inline confirmer wrapper.\ninterface HostTxConfirmerElement extends HTMLElement {\n variant?: 'modal' | 'drawer';\n nearAccountId: string;\n txSigningRequests: TransactionInputWasm[];\n intentDigest?: string;\n vrfChallenge?: Partial<VRFChallenge>;\n theme?: ThemeName;\n loading?: boolean; // host elements use `loading` (iframe element uses `showLoading`)\n deferClose?: boolean; // two-phase close coordination\n errorMessage?: string;\n body?: string;\n title: string;\n requestUpdate?: () => void; // Lit element update hook (optional)\n nearExplorerUrl?: string;\n}\n\n////////////////////////////\n// === Public Functions ===\n////////////////////////////\n\nexport async function mountConfirmUI({\n ctx,\n summary,\n txSigningRequests,\n vrfChallenge,\n loading,\n theme,\n uiMode,\n nearAccountIdOverride,\n}: {\n ctx: VrfWorkerManagerContext,\n summary: TransactionSummary,\n txSigningRequests?: TransactionInputWasm[],\n vrfChallenge?: Partial<VRFChallenge>,\n loading?: boolean,\n theme?: ThemeName,\n uiMode: ConfirmationUIMode,\n nearAccountIdOverride?: string,\n}): Promise<ConfirmUIHandle> {\n // 'skip' mode should never request a UI mount; callers handle this.\n const variant = uiModeToVariant(uiMode);\n const { handle } = mountHostElement({\n ctx,\n summary,\n txSigningRequests,\n vrfChallenge,\n loading,\n theme,\n variant,\n nearAccountIdOverride,\n });\n return handle;\n}\n\nexport async function awaitConfirmUIDecision({\n ctx,\n summary,\n txSigningRequests,\n vrfChallenge,\n theme,\n uiMode,\n nearAccountIdOverride,\n}: {\n ctx: VrfWorkerManagerContext,\n summary: TransactionSummary,\n txSigningRequests: TransactionInputWasm[],\n vrfChallenge?: Partial<VRFChallenge>,\n theme: ThemeName,\n uiMode: ConfirmationUIMode,\n nearAccountIdOverride: string,\n}): Promise<{ confirmed: boolean; handle: ConfirmUIHandle; error?: string }> {\n const variant = uiModeToVariant(uiMode);\n const v: 'modal' | 'drawer' = variant || 'modal';\n\n return new Promise((resolve) => {\n const { el, handle } = mountHostElement({\n ctx,\n summary,\n txSigningRequests,\n vrfChallenge,\n theme,\n variant: v,\n nearAccountIdOverride,\n });\n\n const finalize = (result: { confirmed: boolean; error?: string }) => {\n cleanup();\n resolve({ ...result, handle });\n };\n\n const onConfirm = async (event: Event) => {\n const detail = (event as CustomEvent<ConfirmEventDetail> | undefined)?.detail;\n let confirmed = detail?.confirmed !== false;\n let error = typeof detail?.error === 'string' ? detail.error : undefined;\n // Defensive UI digest validation in case wrapper capture-phase did not intercept\n if (confirmed) {\n const guardErr = await checkIntentDigestGuard(summary, txSigningRequests);\n if (guardErr) {\n confirmed = false;\n if (!error) error = guardErr;\n }\n }\n\n if (!confirmed) {\n if (error) {\n handle.update({ errorMessage: error, loading: false });\n } else {\n handle.update({ loading: false, errorMessage: '' });\n }\n finalize({ confirmed: false, error });\n return;\n }\n finalize({ confirmed: true });\n };\n\n const onCancel = (event?: Event) => {\n const detail = (event as CustomEvent<ConfirmEventDetail> | undefined)?.detail;\n const error = typeof detail?.error === 'string' ? detail.error : undefined;\n if (error) {\n handle.update({ errorMessage: error, loading: false });\n } else {\n handle.update({ loading: false });\n }\n finalize({ confirmed: false, error });\n };\n\n const cleanup = () => {\n el.removeEventListener(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, onConfirm as EventListener);\n el.removeEventListener(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, onCancel as EventListener);\n };\n\n // Listen to canonical events only\n el.addEventListener(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, onConfirm as EventListener);\n el.addEventListener(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, onCancel as EventListener);\n });\n}\n\n//////////////////////\n// Internal Functions\n//////////////////////\n\nasync function checkIntentDigestGuard(\n summary: TransactionSummary | undefined,\n txSigningRequests?: TransactionInputWasm[],\n): Promise<string | undefined> {\n const hasTxs = (txSigningRequests?.length || 0) > 0;\n const expected = summary?.intentDigest;\n if (!hasTxs || !expected) return undefined;\n try {\n // UI-side check must mirror the canonical intent digest:\n // { receiverId, actions: ActionArgsWasm[] } with actions normalized\n // via orderActionForDigest, and no nonce included.\n const normalized: TransactionInputWasm[] = (txSigningRequests || []).map((tx) => ({\n receiverId: tx.receiverId,\n actions: (tx.actions || [])\n .map((a) => (isActionArgsWasm(a) ? a : toActionArgsWasm(a as unknown as ActionArgs)))\n .map((a) => orderActionForDigest(a as ActionArgsWasm) as ActionArgsWasm),\n }));\n const uiDigest = await computeUiIntentDigestFromTxs(normalized);\n if (uiDigest !== expected) return 'INTENT_DIGEST_MISMATCH';\n return undefined;\n } catch {\n return 'UI_DIGEST_VALIDATION_FAILED';\n }\n}\n\nfunction createHostConfirmHandle(el: HostTxConfirmerElement): ConfirmUIHandle {\n return {\n close: (_confirmed: boolean) => { el.remove(); },\n update: (props: ConfirmUIUpdate) => applyHostElementProps(el, props),\n };\n}\n\n// Small helper to keep a host element's error attribute in sync\nfunction setErrorAttribute(el: HTMLElement, msg: string): void {\n if (msg) {\n el.setAttribute('data-error-message', msg);\n } else {\n el.removeAttribute('data-error-message');\n }\n}\n\nfunction applyHostElementProps(el: HostTxConfirmerElement, props?: ConfirmUIUpdate): void {\n if (!props) return;\n if (props.nearAccountId != null) el.nearAccountId = props.nearAccountId;\n if (props.txSigningRequests != null) el.txSigningRequests = props.txSigningRequests;\n if (props.vrfChallenge != null) el.vrfChallenge = props.vrfChallenge;\n if (props.theme != null) el.theme = props.theme;\n if (props.loading != null) el.loading = !!props.loading;\n if (props.body != null) el.body = props.body;\n if (props.title != null) el.title = props.title;\n if ('errorMessage' in (props as Record<string, unknown>)) {\n const msg = props.errorMessage ?? '';\n el.errorMessage = msg;\n setErrorAttribute(el, msg);\n }\n if ((props as any).nearExplorerUrl != null) {\n el.nearExplorerUrl = (props as any).nearExplorerUrl;\n }\n el.requestUpdate?.();\n}\n\n// ===== Inline confirmer helpers =====\nfunction cleanupExistingConfirmers(): void {\n const portal = document.getElementById(W3A_CONFIRM_PORTAL_ID);\n if (portal) {\n const existing = Array.from(portal.querySelectorAll('*')) as HTMLElement[];\n for (const el of existing) {\n el.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, { bubbles: true, composed: true }));\n }\n portal.replaceChildren();\n return;\n }\n\n const selectors = CONFIRM_UI_ELEMENT_SELECTORS as readonly string[];\n const els = selectors.flatMap((sel) => Array.from(document.querySelectorAll(sel)) as HTMLElement[]);\n for (const el of els) {\n el.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, { bubbles: true, composed: true }));\n el.remove();\n }\n}\n\nfunction ensureConfirmPortal(): HTMLElement {\n let portal = document.getElementById(W3A_CONFIRM_PORTAL_ID) as HTMLElement | null;\n if (!portal) {\n portal = document.createElement('div');\n portal.id = W3A_CONFIRM_PORTAL_ID;\n // Keep the portal inert except for stacking; children handle their own overlay\n // Class-based only to comply with strict CSP\n portal.classList.add('w3a-portal');\n const root = document.body ?? document.documentElement;\n if (root) {\n root.appendChild(portal);\n }\n }\n return portal;\n}\n\ntype ConfirmEventDetail = {\n confirmed?: boolean;\n error?: string;\n};\n\nfunction uiModeToVariant(uiMode: ConfirmationUIMode): 'modal' | 'drawer' {\n return uiMode === 'drawer' ? 'drawer' : 'modal';\n}\n\n// Create and mount a fresh host element into the tx-confirmer portal\nfunction mountHostElement({\n ctx,\n summary,\n txSigningRequests,\n vrfChallenge,\n loading,\n theme,\n variant,\n nearAccountIdOverride,\n}: {\n ctx: VrfWorkerManagerContext,\n summary: TransactionSummary,\n txSigningRequests?: TransactionInputWasm[],\n vrfChallenge?: Partial<VRFChallenge>,\n loading?: boolean,\n theme?: ThemeName,\n variant?: 'modal' | 'drawer',\n nearAccountIdOverride?: string,\n}): { el: HostTxConfirmerElement; handle: ConfirmUIHandle } {\n const v: 'modal' | 'drawer' = variant || 'modal';\n cleanupExistingConfirmers();\n const el = document.createElement(W3A_TX_CONFIRMER_ID) as HostTxConfirmerElement;\n el.variant = v;\n el.nearAccountId = nearAccountIdOverride || ctx.userPreferencesManager.getCurrentUserAccountId() || '';\n el.txSigningRequests = txSigningRequests || [];\n if (ctx.nearExplorerUrl) {\n el.nearExplorerUrl = ctx.nearExplorerUrl;\n }\n // Only enable UI digest validation for transaction-signing flows where txs exist.\n // Registration/link and other non-tx flows should not set intentDigest to avoid\n // spurious INTENT_DIGEST_MISMATCH on confirm.\n if ((txSigningRequests?.length || 0) > 0) {\n el.intentDigest = summary?.intentDigest;\n }\n if (vrfChallenge) el.vrfChallenge = vrfChallenge;\n // Resolve theme with short-circuiting helper\n el.theme = resolveTheme(ctx, theme);\n if (loading != null) el.loading = !!loading;\n el.removeAttribute('data-error-message');\n // Two-phase close: let caller control removal\n el.deferClose = true;\n // Optional per-request display overrides\n if (summary?.title != null) el.title = summary.title;\n if (summary?.body != null) el.body = summary.body;\n // Default title for delegate signing when not overridden\n if (summary?.delegate && summary?.title == null) {\n el.title = 'Sign Delegate Action';\n }\n const portal = ensureConfirmPortal();\n // Ensure hidden state (idempotent) and mount\n portal.classList.remove('w3a-portal--visible');\n portal.replaceChildren(el);\n // Reveal in the next frame via class toggle\n requestAnimationFrame(() => {\n portal.classList.add('w3a-portal--visible');\n });\n const handle = createHostConfirmHandle(el);\n return { el, handle };\n}\n\n// Types and element export for consumers that need the inline confirmer handle\nexport type { TxConfirmerWrapperElement } from './IframeTxConfirmer/tx-confirmer-wrapper';\nexport { W3A_TX_CONFIRMER_ID };\n","import type { VrfWorkerManagerContext } from '../../';\nimport type { ConfirmationConfig, ConfirmationUIMode } from '../../../../types/signer-worker';\nimport type { SecureConfirmRequest, TransactionSummary } from '../types';\nimport { SecureConfirmationType } from '../types';\nimport type { VRFChallenge } from '../../../../types';\nimport { awaitConfirmUIDecision, mountConfirmUI, type ConfirmUIHandle } from '../../../LitComponents/confirm-ui';\nimport { getNearAccountId, getSignTransactionPayload } from './requestHelpers';\n\nexport function closeModalSafely(confirmed: boolean, handle?: ConfirmUIHandle) {\n handle?.close?.(confirmed);\n}\n\nexport async function renderConfirmUI({\n ctx,\n request,\n confirmationConfig,\n transactionSummary,\n vrfChallenge,\n}: {\n ctx: VrfWorkerManagerContext,\n request: SecureConfirmRequest,\n confirmationConfig: ConfirmationConfig,\n transactionSummary: TransactionSummary,\n vrfChallenge?: Partial<VRFChallenge>;\n}): Promise<{ confirmed: boolean; confirmHandle?: ConfirmUIHandle; error?: string }> {\n const nearAccountIdForUi = getNearAccountId(request);\n\n const uiMode = confirmationConfig.uiMode as ConfirmationUIMode;\n const txSigningRequests = request.type === SecureConfirmationType.SIGN_TRANSACTION\n ? getSignTransactionPayload(request).txSigningRequests\n : [];\n\n const renderDrawerOrModal = async (mode: 'drawer' | 'modal') => {\n if (confirmationConfig.behavior === 'autoProceed') {\n const handle = await mountConfirmUI({\n ctx,\n summary: transactionSummary,\n txSigningRequests,\n vrfChallenge,\n loading: true,\n theme: confirmationConfig.theme,\n uiMode: mode,\n nearAccountIdOverride: nearAccountIdForUi,\n });\n const delay = confirmationConfig.autoProceedDelay ?? 0;\n await new Promise((r) => setTimeout(r, delay));\n return { confirmed: true, confirmHandle: handle } as const;\n }\n\n const { confirmed, handle, error } = await awaitConfirmUIDecision({\n ctx,\n summary: transactionSummary,\n txSigningRequests,\n vrfChallenge,\n theme: confirmationConfig.theme,\n uiMode: mode,\n nearAccountIdOverride: nearAccountIdForUi,\n });\n return { confirmed, confirmHandle: handle, error } as const;\n };\n\n switch (uiMode) {\n case 'skip': {\n return { confirmed: true, confirmHandle: undefined };\n }\n case 'drawer': {\n return await renderDrawerOrModal('drawer');\n }\n case 'modal': {\n return await renderDrawerOrModal('modal');\n }\n default: {\n const handle = await mountConfirmUI({\n ctx,\n summary: transactionSummary,\n txSigningRequests,\n vrfChallenge,\n loading: true,\n theme: confirmationConfig.theme,\n uiMode: 'modal',\n nearAccountIdOverride: nearAccountIdForUi,\n });\n return { confirmed: true, confirmHandle: handle };\n }\n }\n}\n\n","import type { VrfWorkerManagerContext } from '../../';\nimport type { VRFChallenge } from '../../../../types';\nimport type { SerializableCredential } from '../types';\nimport { serializeAuthenticationCredentialWithPRF } from '../../../credentialsHelpers';\nimport { toAccountId } from '../../../../types/accountIds';\nimport { authenticatorsToAllowCredentials } from '../../../touchIdPrompt';\nimport type { ClientAuthenticatorData } from '../../../../IndexedDBManager';\n\nexport async function collectAuthenticationCredentialWithPRF({\n ctx,\n nearAccountId,\n vrfChallenge,\n onBeforePrompt,\n includeSecondPrfOutput = false,\n}: {\n ctx: VrfWorkerManagerContext;\n nearAccountId: string;\n vrfChallenge: VRFChallenge;\n onBeforePrompt?: (info: {\n authenticators: ClientAuthenticatorData[];\n authenticatorsForPrompt: ClientAuthenticatorData[];\n vrfChallenge: VRFChallenge;\n }) => void;\n /**\n * When true, include PRF.second in the serialized credential.\n * Use only for explicit recovery/export flows (higher-friction paths).\n */\n includeSecondPrfOutput?: boolean;\n}): Promise<SerializableCredential> {\n\n const authenticators = await ctx.indexedDB.clientDB.getAuthenticatorsByUser(toAccountId(nearAccountId));\n const { authenticatorsForPrompt, wrongPasskeyError } = await ctx.indexedDB.clientDB.ensureCurrentPasskey(\n toAccountId(nearAccountId),\n authenticators,\n );\n if (wrongPasskeyError) {\n throw new Error(wrongPasskeyError);\n }\n\n // If we know which device we're targeting (single authenticator), ensure the VRF worker\n // challenge was generated with the same device's VRF keypair. Otherwise contract verification\n // will deterministically fail later with \"Contract verification failed\".\n if (authenticatorsForPrompt.length === 1) {\n const expectedVrfPublicKey = authenticatorsForPrompt[0]?.vrfPublicKey;\n if (expectedVrfPublicKey && expectedVrfPublicKey !== vrfChallenge.vrfPublicKey) {\n throw new Error('Signing session is using a different passkey/VRF session than the current device. Please log in again and retry.');\n }\n }\n\n onBeforePrompt?.({ authenticators, authenticatorsForPrompt, vrfChallenge });\n\n const credential = await ctx.touchIdPrompt.getAuthenticationCredentialsInternal({\n nearAccountId,\n challenge: vrfChallenge,\n allowCredentials: authenticatorsToAllowCredentials(authenticatorsForPrompt),\n });\n\n const serialized = serializeAuthenticationCredentialWithPRF({\n credential,\n firstPrfOutput: true,\n secondPrfOutput: includeSecondPrfOutput,\n });\n\n // Verify that the chosen credential matches the \"current\" passkey device, when applicable.\n const { wrongPasskeyError: wrongSelectedCredentialError } = await ctx.indexedDB.clientDB.ensureCurrentPasskey(\n toAccountId(nearAccountId),\n authenticators,\n serialized.rawId,\n );\n if (wrongSelectedCredentialError) {\n throw new Error(wrongSelectedCredentialError);\n }\n\n return serialized;\n}\n","import type { ConfirmationConfig } from '../../../../types/signer-worker';\nimport type { ConfirmUIHandle, ConfirmUIUpdate } from '../../../LitComponents/confirm-ui';\nimport type { SecureConfirmDecision, SecureConfirmRequest, TransactionSummary } from '../types';\nimport type { VRFChallenge } from '../../../../types';\nimport { sendConfirmResponse } from './common';\nimport type { ConfirmTxFlowAdapters } from './interfaces';\n\nexport function createConfirmSession({\n adapters,\n worker,\n request,\n confirmationConfig,\n transactionSummary,\n}: {\n adapters: ConfirmTxFlowAdapters;\n worker: Worker;\n request: SecureConfirmRequest;\n confirmationConfig: ConfirmationConfig;\n transactionSummary: TransactionSummary;\n}): {\n setReservedNonces: (nonces?: string[]) => void;\n updateUI: (props: ConfirmUIUpdate) => void;\n promptUser: (args: { vrfChallenge?: Partial<VRFChallenge> }) => Promise<{ confirmed: boolean; error?: string }>;\n /**\n * Send decision back to worker and perform standard cleanup.\n * - On `confirmed: false`, releases any reserved nonces.\n * - Always closes the confirm UI handle when present.\n */\n confirmAndCloseModal: (decision: SecureConfirmDecision) => void;\n /**\n * Cleanup + rethrow helper for invariant failures (e.g. missing PRF outputs),\n * where tests/logic expect no worker response envelope.\n */\n cleanupAndRethrow: (err: unknown) => never;\n} {\n let reservedNonces: string[] | undefined;\n let confirmHandle: ConfirmUIHandle | undefined;\n\n const setReservedNonces = (nonces?: string[]) => {\n reservedNonces = nonces;\n };\n\n const updateUI = (props: ConfirmUIUpdate) => {\n confirmHandle?.update?.(props);\n };\n\n const promptUser = async ({ vrfChallenge }: { vrfChallenge?: Partial<VRFChallenge> }) => {\n const { confirmed, confirmHandle: handle, error } = await adapters.ui.renderConfirmUI({\n request,\n confirmationConfig,\n transactionSummary,\n vrfChallenge,\n });\n confirmHandle = handle;\n return { confirmed, error };\n };\n\n const confirmAndCloseModal = (decision: SecureConfirmDecision) => {\n try {\n sendConfirmResponse(worker, decision);\n } finally {\n if (!decision.confirmed) {\n adapters.near.releaseReservedNonces(reservedNonces);\n }\n adapters.ui.closeModalSafely(!!decision.confirmed, confirmHandle);\n }\n };\n\n const cleanupAndRethrow = (err: unknown): never => {\n try {\n adapters.near.releaseReservedNonces(reservedNonces);\n adapters.ui.closeModalSafely(false, confirmHandle);\n } finally {\n throw err;\n }\n };\n\n return {\n setReservedNonces,\n updateUI,\n promptUser,\n confirmAndCloseModal,\n cleanupAndRethrow,\n };\n}\n","import type { VrfWorkerManagerContext } from '../../';\nimport type { ConfirmTxFlowAdapters } from './interfaces';\nimport { fetchNearContext, releaseReservedNonces } from './near';\nimport { maybeRefreshVrfChallenge } from './vrf';\nimport { collectAuthenticationCredentialWithPRF } from './webauthn';\nimport { closeModalSafely, renderConfirmUI } from './ui';\n\nfunction getVrfWorkerManager(ctx: VrfWorkerManagerContext) {\n const vrfWorkerManager = ctx.vrfWorkerManager;\n if (!vrfWorkerManager) {\n throw new Error('VrfWorkerManager not available');\n }\n return vrfWorkerManager;\n}\n\nexport function createConfirmTxFlowAdapters(ctx: VrfWorkerManagerContext): ConfirmTxFlowAdapters {\n return {\n near: {\n fetchNearContext: (opts) => fetchNearContext(ctx, opts),\n releaseReservedNonces: (nonces) => releaseReservedNonces(ctx, nonces),\n },\n vrf: {\n getRpId: () => ctx.touchIdPrompt.getRpId(),\n maybeRefreshVrfChallenge: (request, nearAccountId) => maybeRefreshVrfChallenge(ctx, request, nearAccountId),\n generateVrfKeypairBootstrap: (args) => getVrfWorkerManager(ctx).generateVrfKeypairBootstrap(args),\n generateVrfChallengeForSession: (inputData, sessionId) => getVrfWorkerManager(ctx).generateVrfChallengeForSession(inputData, sessionId),\n mintSessionKeysAndSendToSigner: (args) => getVrfWorkerManager(ctx).mintSessionKeysAndSendToSigner(args),\n dispenseSessionKey: (args) => getVrfWorkerManager(ctx).dispenseSessionKey(args),\n prepareDecryptSession: (args) => getVrfWorkerManager(ctx).prepareDecryptSession(args),\n requestRegistrationCredentialConfirmation: (args) => getVrfWorkerManager(ctx).requestRegistrationCredentialConfirmation(args),\n confirmAndDeriveDevice2RegistrationSession: (args) => getVrfWorkerManager(ctx).confirmAndDeriveDevice2RegistrationSession(args),\n checkVrfStatus: () => getVrfWorkerManager(ctx).checkVrfStatus(),\n },\n webauthn: {\n collectAuthenticationCredentialWithPRF: (args) => collectAuthenticationCredentialWithPRF({ ctx, ...args }),\n createRegistrationCredential: (args) => ctx.touchIdPrompt.generateRegistrationCredentialsInternal(args),\n },\n ui: {\n renderConfirmUI: (args) => renderConfirmUI({ ctx, ...args }),\n closeModalSafely,\n },\n };\n}\n\n"],"x_google_ignoreList":[5],"mappings":"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"}