@tempoxyz/id 0.0.0-stage → 0.0.1

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 (1096) hide show
  1. package/README.md +121 -2
  2. package/dist/App.d.ts +121 -0
  3. package/dist/App.d.ts.map +1 -0
  4. package/dist/App.js +132 -0
  5. package/dist/App.js.map +1 -0
  6. package/dist/app/client/.assetsignore +2 -0
  7. package/dist/app/client/_headers +4 -0
  8. package/dist/app/client/assets/Account-BYLpNFf3.css +1 -0
  9. package/dist/app/client/assets/Account-BllJah07.js +1 -0
  10. package/dist/app/client/assets/Amount-E_7snI0-.js +1 -0
  11. package/dist/app/client/assets/Amount-ZdtluGf-.css +1 -0
  12. package/dist/app/client/assets/Approval-CgV5JHlb.css +1 -0
  13. package/dist/app/client/assets/Approval-yKflypU2.js +1 -0
  14. package/dist/app/client/assets/ArrowUp-CRvqfMNU.js +1 -0
  15. package/dist/app/client/assets/Authentication-BAXhOh_4.js +2 -0
  16. package/dist/app/client/assets/BRLA-CZvVDNYr.png +0 -0
  17. package/dist/app/client/assets/BRZ-Cn3jEi9t.svg +1 -0
  18. package/dist/app/client/assets/CHFAU-DCedc4aH.png +0 -0
  19. package/dist/app/client/assets/Callout-B736759d.js +1 -0
  20. package/dist/app/client/assets/Callout-DBfEmP7q.css +1 -0
  21. package/dist/app/client/assets/Check-DVgD8tDG.js +1 -0
  22. package/dist/app/client/assets/ChevronRight-CsXtIZCB.js +1 -0
  23. package/dist/app/client/assets/ChooseAccount-BjxfQjPK.js +1 -0
  24. package/dist/app/client/assets/ChooseAccount-DL3wgJhE.css +1 -0
  25. package/dist/app/client/assets/Client-JrABNovb.js +1 -0
  26. package/dist/app/client/assets/Close-CRvWlhqc.js +1 -0
  27. package/dist/app/client/assets/Cloud-DgJsrqpQ.js +1 -0
  28. package/dist/app/client/assets/CodeInput-79Ctx8ZA.js +1 -0
  29. package/dist/app/client/assets/CodeInput-BqRteSwD.css +1 -0
  30. package/dist/app/client/assets/DLUSD-BnRXm3EI.png +0 -0
  31. package/dist/app/client/assets/Deposit-CclrAoXL.css +1 -0
  32. package/dist/app/client/assets/Deposit-c7uYn2Eb.js +1 -0
  33. package/dist/app/client/assets/DevTools-BYkmtuV5.css +1 -0
  34. package/dist/app/client/assets/DevTools-BgnzDGo2.js +1 -0
  35. package/dist/app/client/assets/DeviceApproval-BBUVv58e.js +1 -0
  36. package/dist/app/client/assets/DeviceApproval-BffFLD8F.css +1 -0
  37. package/dist/app/client/assets/EURAU-sjieTTB9.svg +1 -0
  38. package/dist/app/client/assets/EURC.e-CxYiiwkz.svg +1 -0
  39. package/dist/app/client/assets/Fingerprint-BNCA6qOJ.js +1 -0
  40. package/dist/app/client/assets/GBPA-DI_25xSG.svg +4 -0
  41. package/dist/app/client/assets/GUSD-BDEP2Qb-.svg +1 -0
  42. package/dist/app/client/assets/GeistMono-Variable-BRXCGrxA.woff2 +0 -0
  43. package/dist/app/client/assets/Globe-f0eWzcEI.js +1 -0
  44. package/dist/app/client/assets/Grant-5a-n1gJH.css +1 -0
  45. package/dist/app/client/assets/Grant-Dp7mpcEi.js +1 -0
  46. package/dist/app/client/assets/Hex-C9KeV7_9.css +1 -0
  47. package/dist/app/client/assets/Hex-CSp2U46W.js +10 -0
  48. package/dist/app/client/assets/IconChip-DpZHa1JW.js +1 -0
  49. package/dist/app/client/assets/IconChip-yqaQ2y_d.css +1 -0
  50. package/dist/app/client/assets/InputGroup-BlZvt9In.css +1 -0
  51. package/dist/app/client/assets/InputGroup-CsOeBnpB.js +1 -0
  52. package/dist/app/client/assets/Inter-cyrillic-e3OmmzmJ.woff2 +0 -0
  53. package/dist/app/client/assets/Inter-cyrillic-ext-DOWZeO4Q.woff2 +0 -0
  54. package/dist/app/client/assets/Inter-greek-BD3ujQlX.woff2 +0 -0
  55. package/dist/app/client/assets/Inter-greek-ext-CXEwbus4.woff2 +0 -0
  56. package/dist/app/client/assets/Inter-latin-BDFm4vTb.woff2 +0 -0
  57. package/dist/app/client/assets/Inter-latin-ext-E7a9JEPe.woff2 +0 -0
  58. package/dist/app/client/assets/Inter-symbols-DEch7Rxr.woff2 +0 -0
  59. package/dist/app/client/assets/Inter-vietnamese-Bg9723vR.woff2 +0 -0
  60. package/dist/app/client/assets/Loader-Cm9YJNNJ.js +1 -0
  61. package/dist/app/client/assets/MACH-sK0r79kQ.svg +4 -0
  62. package/dist/app/client/assets/OUSD-BFXgVo-Z.svg +5 -0
  63. package/dist/app/client/assets/OUSD.dark-BbbjMvA1.svg +17 -0
  64. package/dist/app/client/assets/OUSD.light-B_zpSz_c.svg +17 -0
  65. package/dist/app/client/assets/PRIME-CiFp2-3e.svg +14 -0
  66. package/dist/app/client/assets/PopoverPopup-DprRXRQe.js +1 -0
  67. package/dist/app/client/assets/Rows-DPGTUdA8.css +1 -0
  68. package/dist/app/client/assets/Rows-Qqo3evtk.js +1 -0
  69. package/dist/app/client/assets/SBC-BTYkbkiD.svg +1 -0
  70. package/dist/app/client/assets/SEKAU-CB5Fc6o8.svg +5 -0
  71. package/dist/app/client/assets/Separator-CZUjVQOL.js +1 -0
  72. package/dist/app/client/assets/SignIn-HdaDzFmq.js +1 -0
  73. package/dist/app/client/assets/SignIn-mlBTwUq4.css +1 -0
  74. package/dist/app/client/assets/Stack-CkkvkOzj.js +1 -0
  75. package/dist/app/client/assets/Stack-D7Yt22Ed.css +1 -0
  76. package/dist/app/client/assets/Tag-BMh6ajrW.css +1 -0
  77. package/dist/app/client/assets/Tag-CLOVANTX.js +1 -0
  78. package/dist/app/client/assets/ToolbarRootContext-Zty_Dh3J.js +1 -0
  79. package/dist/app/client/assets/Tooltip-CLATV6YU.js +1 -0
  80. package/dist/app/client/assets/Tooltip-d3y9ESUJ.css +1 -0
  81. package/dist/app/client/assets/USD1-COVcO_PB.svg +30 -0
  82. package/dist/app/client/assets/USDB-Ckwb6UQw.svg +11 -0
  83. package/dist/app/client/assets/USDC.e-3nMsKAMC.svg +1 -0
  84. package/dist/app/client/assets/USDT0-ia60Dw0e.svg +1 -0
  85. package/dist/app/client/assets/USDY-CB4iet2q.svg +16 -0
  86. package/dist/app/client/assets/USDe-BXHQCd92.svg +1 -0
  87. package/dist/app/client/assets/Upgrade-D0_aO5AP.js +1 -0
  88. package/dist/app/client/assets/WalletUpgrade-BPsPNQsd.js +1 -0
  89. package/dist/app/client/assets/WalletUpgrade-C04kW0Jl.css +1 -0
  90. package/dist/app/client/assets/YLDS-CRh8Zw0g.svg +3 -0
  91. package/dist/app/client/assets/___-I98bns4o.css +1 -0
  92. package/dist/app/client/assets/___.flows-XOlLwMIy.js +5 -0
  93. package/dist/app/client/assets/alphaUSD-CpCFoVuh.svg +1 -0
  94. package/dist/app/client/assets/authorize-C-MlCyaM.js +1 -0
  95. package/dist/app/client/assets/betaUSD-9A8AjgYg.svg +1 -0
  96. package/dist/app/client/assets/cUSD-WsQfa-iC.svg +1 -0
  97. package/dist/app/client/assets/cbBTC-DvUDqrDi.svg +1 -0
  98. package/dist/app/client/assets/choose-account-nXR-SKa2.js +1 -0
  99. package/dist/app/client/assets/deposit-G8tiLPN4.js +1 -0
  100. package/dist/app/client/assets/device-BojBF7hZ.js +1 -0
  101. package/dist/app/client/assets/error-KiOpX7GD.js +1 -0
  102. package/dist/app/client/assets/frxUSD-n9pTpinR.svg +1 -0
  103. package/dist/app/client/assets/getPseudoElementBounds-BsLy4zf_.js +1 -0
  104. package/dist/app/client/assets/goUSD-D9kUvHsF.svg +5 -0
  105. package/dist/app/client/assets/iUSD-CWCJAq9X.svg +1 -0
  106. package/dist/app/client/assets/index-BZH0M7Nf.js +13 -0
  107. package/dist/app/client/assets/index-CIYxHmYA.css +1 -0
  108. package/dist/app/client/assets/login-DUjpk60p.js +1 -0
  109. package/dist/app/client/assets/pathUSD-BvaO6ooS.svg +25 -0
  110. package/dist/app/client/assets/preload-helper-Bs9KvdYl.js +1 -0
  111. package/dist/app/client/assets/rUSD-B-xuFS7T.svg +1 -0
  112. package/dist/app/client/assets/reUSD-CkIUs0Lx.svg +1 -0
  113. package/dist/app/client/assets/removable-DMiA3t_o.js +1 -0
  114. package/dist/app/client/assets/reset-co-CHrff.css +1 -0
  115. package/dist/app/client/assets/rolldown-runtime-WkwZ5CU-.js +1 -0
  116. package/dist/app/client/assets/routes-CK8cthzA.js +1 -0
  117. package/dist/app/client/assets/sUSDe-j9GOnH7I.svg +1 -0
  118. package/dist/app/client/assets/siUSD-C10QUNYS.svg +1 -0
  119. package/dist/app/client/assets/stcUSD-DIntDJeh.svg +1 -0
  120. package/dist/app/client/assets/syrupUSDC-DhYwZqdM.svg +5 -0
  121. package/dist/app/client/assets/thetaUSD-Dgmksf6G.svg +1 -0
  122. package/dist/app/client/assets/useNavigate-CB6S2u4J.js +1 -0
  123. package/dist/app/client/assets/useQuery-BpHfPhTT.js +1 -0
  124. package/dist/app/client/assets/useRegisterFieldControl-DsslqY-V.js +1 -0
  125. package/dist/app/client/assets/wYLDS-CaCKDrO-.svg +10 -0
  126. package/dist/app/client/assets/wsrUSD-B2Ey0bDQ.svg +1 -0
  127. package/dist/app/client/assets/zyzz-DYC-X0_B.css +1 -0
  128. package/dist/app/client/assets/zyzz.config-DX_D_7j3.js +2 -0
  129. package/dist/app/db/auth.d.ts +3412 -0
  130. package/dist/app/db/auth.d.ts.map +1 -0
  131. package/dist/app/db/auth.js +349 -0
  132. package/dist/app/db/auth.js.map +1 -0
  133. package/dist/app/db/schema.d.ts +1091 -0
  134. package/dist/app/db/schema.d.ts.map +1 -0
  135. package/dist/app/db/schema.js +183 -0
  136. package/dist/app/db/schema.js.map +1 -0
  137. package/dist/app/db/table.d.ts +8 -0
  138. package/dist/app/db/table.d.ts.map +1 -0
  139. package/dist/app/db/table.js +28 -0
  140. package/dist/app/db/table.js.map +1 -0
  141. package/dist/app/server/.vite/manifest.json +2093 -0
  142. package/dist/app/server/assets/Account-BYLpNFf3.css +1 -0
  143. package/dist/app/server/assets/Account-G_SUeRU3.js +2 -0
  144. package/dist/app/server/assets/Account-G_SUeRU3.js.map +1 -0
  145. package/dist/app/server/assets/Amount-Cgwdr3Xt.js +2 -0
  146. package/dist/app/server/assets/Amount-Cgwdr3Xt.js.map +1 -0
  147. package/dist/app/server/assets/Amount-ZdtluGf-.css +1 -0
  148. package/dist/app/server/assets/Approval-CgV5JHlb.css +1 -0
  149. package/dist/app/server/assets/Approval-DvkB9tWA.js +2 -0
  150. package/dist/app/server/assets/Approval-DvkB9tWA.js.map +1 -0
  151. package/dist/app/server/assets/ArrowUp-DpK_zNgZ.js +2 -0
  152. package/dist/app/server/assets/ArrowUp-DpK_zNgZ.js.map +1 -0
  153. package/dist/app/server/assets/Authentication-BOkhlNQu.js +2 -0
  154. package/dist/app/server/assets/Authentication-BOkhlNQu.js.map +1 -0
  155. package/dist/app/server/assets/Authentication-C3oNZAVX.js +2 -0
  156. package/dist/app/server/assets/Authentication-C3oNZAVX.js.map +1 -0
  157. package/dist/app/server/assets/BRLA-CZvVDNYr.png +0 -0
  158. package/dist/app/server/assets/BRZ-Cn3jEi9t.svg +1 -0
  159. package/dist/app/server/assets/Bytes-C7CRVS3J.js +4 -0
  160. package/dist/app/server/assets/Bytes-C7CRVS3J.js.map +1 -0
  161. package/dist/app/server/assets/CHFAU-DCedc4aH.png +0 -0
  162. package/dist/app/server/assets/Callout-DBfEmP7q.css +1 -0
  163. package/dist/app/server/assets/Callout-tQoAitWq.js +2 -0
  164. package/dist/app/server/assets/Callout-tQoAitWq.js.map +1 -0
  165. package/dist/app/server/assets/ChainList-C4A_7e-9.js +6 -0
  166. package/dist/app/server/assets/ChainList-C4A_7e-9.js.map +1 -0
  167. package/dist/app/server/assets/ChainName-BMnJyJrd.js +2 -0
  168. package/dist/app/server/assets/ChainName-BMnJyJrd.js.map +1 -0
  169. package/dist/app/server/assets/Check-DU_oR3Ev.js +2 -0
  170. package/dist/app/server/assets/Check-DU_oR3Ev.js.map +1 -0
  171. package/dist/app/server/assets/ChevronRight-DTBnw-W6.js +2 -0
  172. package/dist/app/server/assets/ChevronRight-DTBnw-W6.js.map +1 -0
  173. package/dist/app/server/assets/ChooseAccount-BizJvMrY.js +2 -0
  174. package/dist/app/server/assets/ChooseAccount-BizJvMrY.js.map +1 -0
  175. package/dist/app/server/assets/ChooseAccount-DL3wgJhE.css +1 -0
  176. package/dist/app/server/assets/Client-Dx3KrpJZ.js +2 -0
  177. package/dist/app/server/assets/Client-Dx3KrpJZ.js.map +1 -0
  178. package/dist/app/server/assets/ClientOnly-CKLiu67O.js +2 -0
  179. package/dist/app/server/assets/ClientOnly-CKLiu67O.js.map +1 -0
  180. package/dist/app/server/assets/Close-DUeE37ev.js +2 -0
  181. package/dist/app/server/assets/Close-DUeE37ev.js.map +1 -0
  182. package/dist/app/server/assets/Cloud-CLB3rTTy.js +2 -0
  183. package/dist/app/server/assets/Cloud-CLB3rTTy.js.map +1 -0
  184. package/dist/app/server/assets/CodeInput-BqRteSwD.css +1 -0
  185. package/dist/app/server/assets/CodeInput-FsPzVuLU.js +2 -0
  186. package/dist/app/server/assets/CodeInput-FsPzVuLU.js.map +1 -0
  187. package/dist/app/server/assets/Credential-DFjcrdyI.js +2 -0
  188. package/dist/app/server/assets/Credential-DFjcrdyI.js.map +1 -0
  189. package/dist/app/server/assets/DLUSD-BnRXm3EI.png +0 -0
  190. package/dist/app/server/assets/Deposit-CclrAoXL.css +1 -0
  191. package/dist/app/server/assets/Deposit-ChYGRfW2.js +2 -0
  192. package/dist/app/server/assets/Deposit-ChYGRfW2.js.map +1 -0
  193. package/dist/app/server/assets/DevTools-BYkmtuV5.css +1 -0
  194. package/dist/app/server/assets/DevTools-ZJVXqrIK.js +2 -0
  195. package/dist/app/server/assets/DevTools-ZJVXqrIK.js.map +1 -0
  196. package/dist/app/server/assets/DeviceApproval-BffFLD8F.css +1 -0
  197. package/dist/app/server/assets/DeviceApproval-Bqe3Mi78.js +2 -0
  198. package/dist/app/server/assets/DeviceApproval-Bqe3Mi78.js.map +1 -0
  199. package/dist/app/server/assets/EURAU-sjieTTB9.svg +1 -0
  200. package/dist/app/server/assets/EURC.e-CxYiiwkz.svg +1 -0
  201. package/dist/app/server/assets/ExecutionError-CDszGSF1.js +9 -0
  202. package/dist/app/server/assets/ExecutionError-CDszGSF1.js.map +1 -0
  203. package/dist/app/server/assets/Fingerprint-DhOPOdRr.js +2 -0
  204. package/dist/app/server/assets/Fingerprint-DhOPOdRr.js.map +1 -0
  205. package/dist/app/server/assets/GBPA-DI_25xSG.svg +4 -0
  206. package/dist/app/server/assets/GUSD-BDEP2Qb-.svg +1 -0
  207. package/dist/app/server/assets/GeistMono-Variable-BRXCGrxA.woff2 +0 -0
  208. package/dist/app/server/assets/Globe-2CxqxU-7.js +2 -0
  209. package/dist/app/server/assets/Globe-2CxqxU-7.js.map +1 -0
  210. package/dist/app/server/assets/Grant-5a-n1gJH.css +1 -0
  211. package/dist/app/server/assets/Grant-D_tun0mF.js +2 -0
  212. package/dist/app/server/assets/Grant-D_tun0mF.js.map +1 -0
  213. package/dist/app/server/assets/Hex-C9KeV7_9.css +1 -0
  214. package/dist/app/server/assets/Hex-Z6m_0Y0m.js +11 -0
  215. package/dist/app/server/assets/Hex-Z6m_0Y0m.js.map +1 -0
  216. package/dist/app/server/assets/IconChip-C9ZrmGB5.js +2 -0
  217. package/dist/app/server/assets/IconChip-C9ZrmGB5.js.map +1 -0
  218. package/dist/app/server/assets/IconChip-yqaQ2y_d.css +1 -0
  219. package/dist/app/server/assets/InputGroup-BlZvt9In.css +1 -0
  220. package/dist/app/server/assets/InputGroup-hpjuLuR7.js +2 -0
  221. package/dist/app/server/assets/InputGroup-hpjuLuR7.js.map +1 -0
  222. package/dist/app/server/assets/Inter-cyrillic-e3OmmzmJ.woff2 +0 -0
  223. package/dist/app/server/assets/Inter-cyrillic-ext-DOWZeO4Q.woff2 +0 -0
  224. package/dist/app/server/assets/Inter-greek-BD3ujQlX.woff2 +0 -0
  225. package/dist/app/server/assets/Inter-greek-ext-CXEwbus4.woff2 +0 -0
  226. package/dist/app/server/assets/Inter-latin-BDFm4vTb.woff2 +0 -0
  227. package/dist/app/server/assets/Inter-latin-ext-E7a9JEPe.woff2 +0 -0
  228. package/dist/app/server/assets/Inter-symbols-DEch7Rxr.woff2 +0 -0
  229. package/dist/app/server/assets/Inter-vietnamese-Bg9723vR.woff2 +0 -0
  230. package/dist/app/server/assets/Loader-DnKC9P5p.js +2 -0
  231. package/dist/app/server/assets/Loader-DnKC9P5p.js.map +1 -0
  232. package/dist/app/server/assets/MACH-sK0r79kQ.svg +4 -0
  233. package/dist/app/server/assets/Match-CyVdYcSf.js +2 -0
  234. package/dist/app/server/assets/Match-CyVdYcSf.js.map +1 -0
  235. package/dist/app/server/assets/OUSD-BFXgVo-Z.svg +5 -0
  236. package/dist/app/server/assets/OUSD.dark-BbbjMvA1.svg +17 -0
  237. package/dist/app/server/assets/OUSD.light-B_zpSz_c.svg +17 -0
  238. package/dist/app/server/assets/PRIME-CiFp2-3e.svg +14 -0
  239. package/dist/app/server/assets/PopoverPopup-CwqeQelI.js +2 -0
  240. package/dist/app/server/assets/PopoverPopup-CwqeQelI.js.map +1 -0
  241. package/dist/app/server/assets/Rows-CQKQwTI1.js +2 -0
  242. package/dist/app/server/assets/Rows-CQKQwTI1.js.map +1 -0
  243. package/dist/app/server/assets/Rows-DPGTUdA8.css +1 -0
  244. package/dist/app/server/assets/SBC-BTYkbkiD.svg +1 -0
  245. package/dist/app/server/assets/SEKAU-CB5Fc6o8.svg +5 -0
  246. package/dist/app/server/assets/Separator-DrI7KRAs.js +2 -0
  247. package/dist/app/server/assets/Separator-DrI7KRAs.js.map +1 -0
  248. package/dist/app/server/assets/SignIn-DfeeLEmN.js +2 -0
  249. package/dist/app/server/assets/SignIn-DfeeLEmN.js.map +1 -0
  250. package/dist/app/server/assets/SignIn-mlBTwUq4.css +1 -0
  251. package/dist/app/server/assets/Stack-D7Yt22Ed.css +1 -0
  252. package/dist/app/server/assets/Stack-DGktaLZc.js +2 -0
  253. package/dist/app/server/assets/Stack-DGktaLZc.js.map +1 -0
  254. package/dist/app/server/assets/Tag-9vSRBpph.js +2 -0
  255. package/dist/app/server/assets/Tag-9vSRBpph.js.map +1 -0
  256. package/dist/app/server/assets/Tag-BMh6ajrW.css +1 -0
  257. package/dist/app/server/assets/ToolbarRootContext-BH_CFSWd.js +2 -0
  258. package/dist/app/server/assets/ToolbarRootContext-BH_CFSWd.js.map +1 -0
  259. package/dist/app/server/assets/Tooltip-DLX41peb.js +2 -0
  260. package/dist/app/server/assets/Tooltip-DLX41peb.js.map +1 -0
  261. package/dist/app/server/assets/Tooltip-d3y9ESUJ.css +1 -0
  262. package/dist/app/server/assets/USD1-COVcO_PB.svg +30 -0
  263. package/dist/app/server/assets/USDB-Ckwb6UQw.svg +11 -0
  264. package/dist/app/server/assets/USDC.e-3nMsKAMC.svg +1 -0
  265. package/dist/app/server/assets/USDT0-ia60Dw0e.svg +1 -0
  266. package/dist/app/server/assets/USDY-CB4iet2q.svg +16 -0
  267. package/dist/app/server/assets/USDe-BXHQCd92.svg +1 -0
  268. package/dist/app/server/assets/Upgrade-Dbfm2nm0.js +2 -0
  269. package/dist/app/server/assets/Upgrade-Dbfm2nm0.js.map +1 -0
  270. package/dist/app/server/assets/WalletUpgrade-C04kW0Jl.css +1 -0
  271. package/dist/app/server/assets/WalletUpgrade-CWKc5fYt.js +2 -0
  272. package/dist/app/server/assets/WalletUpgrade-CWKc5fYt.js.map +1 -0
  273. package/dist/app/server/assets/YLDS-CRh8Zw0g.svg +3 -0
  274. package/dist/app/server/assets/___-I98bns4o.css +1 -0
  275. package/dist/app/server/assets/___.flows-Cc-awUoC.js +6 -0
  276. package/dist/app/server/assets/___.flows-Cc-awUoC.js.map +1 -0
  277. package/dist/app/server/assets/_tanstack-start-manifest_v-U7TrtUSA.js +1 -0
  278. package/dist/app/server/assets/_zyzz__2Fhome_2Frunner_2Fwork_2Fid_2Fid_2Fsrc_2Fapp_2Froutes_2F_5B__5D.flows-B1pPOqsM.css +1 -0
  279. package/dist/app/server/assets/_zyzz__2Fhome_2Frunner_2Fwork_2Fid_2Fid_2Fsrc_2Fapp_2Froutes_2F_5B__5D.flows.tsx-CKALi9oD.js +2 -0
  280. package/dist/app/server/assets/_zyzz__2Fhome_2Frunner_2Fwork_2Fid_2Fid_2Fsrc_2Fapp_2Froutes_2F_5B__5D.flows.tsx-CKALi9oD.js.map +1 -0
  281. package/dist/app/server/assets/_zyzz_shared-BbDIEd_j.css +1 -0
  282. package/dist/app/server/assets/alphaUSD-CpCFoVuh.svg +1 -0
  283. package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js +2 -0
  284. package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js.map +1 -0
  285. package/dist/app/server/assets/async-local-storage-DlOvwxXd.js +2 -0
  286. package/dist/app/server/assets/async-local-storage-DlOvwxXd.js.map +1 -0
  287. package/dist/app/server/assets/authorize-BXzTo2Pb.js +2 -0
  288. package/dist/app/server/assets/authorize-BXzTo2Pb.js.map +1 -0
  289. package/dist/app/server/assets/authorize-BzoUqOdA.js +2 -0
  290. package/dist/app/server/assets/authorize-BzoUqOdA.js.map +1 -0
  291. package/dist/app/server/assets/authorize-DXYo-K2n-rmQQ42x1.js +56 -0
  292. package/dist/app/server/assets/authorize-DXYo-K2n-rmQQ42x1.js.map +1 -0
  293. package/dist/app/server/assets/authorize-DfjPYJqS.css +1 -0
  294. package/dist/app/server/assets/betaUSD-9A8AjgYg.svg +1 -0
  295. package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js +2 -0
  296. package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js.map +1 -0
  297. package/dist/app/server/assets/cUSD-WsQfa-iC.svg +1 -0
  298. package/dist/app/server/assets/call-dzi0xjZd.js +31 -0
  299. package/dist/app/server/assets/call-dzi0xjZd.js.map +1 -0
  300. package/dist/app/server/assets/cbBTC-DvUDqrDi.svg +1 -0
  301. package/dist/app/server/assets/ccip-DjD8z_3B.js +2 -0
  302. package/dist/app/server/assets/ccip-DjD8z_3B.js.map +1 -0
  303. package/dist/app/server/assets/choose-account-_X7xq5am.js +2 -0
  304. package/dist/app/server/assets/choose-account-_X7xq5am.js.map +1 -0
  305. package/dist/app/server/assets/choose-account-lqA5SLx9.css +1 -0
  306. package/dist/app/server/assets/choose-account-zm-5Qs3e.js +2 -0
  307. package/dist/app/server/assets/choose-account-zm-5Qs3e.js.map +1 -0
  308. package/dist/app/server/assets/compiled-query-Ds2NVcFT.js +2 -0
  309. package/dist/app/server/assets/compiled-query-Ds2NVcFT.js.map +1 -0
  310. package/dist/app/server/assets/convert-BIC8n32x.js +2 -0
  311. package/dist/app/server/assets/convert-BIC8n32x.js.map +1 -0
  312. package/dist/app/server/assets/cookie-DxViaO10.js +2 -0
  313. package/dist/app/server/assets/cookie-DxViaO10.js.map +1 -0
  314. package/dist/app/server/assets/core-BBrZXfrB.js +56 -0
  315. package/dist/app/server/assets/core-BBrZXfrB.js.map +1 -0
  316. package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js +2 -0
  317. package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js.map +1 -0
  318. package/dist/app/server/assets/decodeFunctionData-bP6V2ai4.js +2 -0
  319. package/dist/app/server/assets/decodeFunctionData-bP6V2ai4.js.map +1 -0
  320. package/dist/app/server/assets/default-u_dwuiYb-DOrMMcg9.js +2 -0
  321. package/dist/app/server/assets/default-u_dwuiYb-DOrMMcg9.js.map +1 -0
  322. package/dist/app/server/assets/deposit-BBaNI01u.js +2 -0
  323. package/dist/app/server/assets/deposit-BBaNI01u.js.map +1 -0
  324. package/dist/app/server/assets/deposit-LWS6ZTuf.js +2 -0
  325. package/dist/app/server/assets/deposit-LWS6ZTuf.js.map +1 -0
  326. package/dist/app/server/assets/deposit-oFx15XCA.css +1 -0
  327. package/dist/app/server/assets/device-CrXlusjr.js +2 -0
  328. package/dist/app/server/assets/device-CrXlusjr.js.map +1 -0
  329. package/dist/app/server/assets/device-DdFMgYe2.js +2 -0
  330. package/dist/app/server/assets/device-DdFMgYe2.js.map +1 -0
  331. package/dist/app/server/assets/device-tMCpu5zk.css +1 -0
  332. package/dist/app/server/assets/dist-CR6FW-yS.js +1 -0
  333. package/dist/app/server/assets/dist-CoH0hD1s.js +15 -0
  334. package/dist/app/server/assets/dist-CoH0hD1s.js.map +1 -0
  335. package/dist/app/server/assets/dist-DcICI3fd.js +2 -0
  336. package/dist/app/server/assets/dist-DcICI3fd.js.map +1 -0
  337. package/dist/app/server/assets/effect-QlVUlMFu-mXPkuQTb.js +2 -0
  338. package/dist/app/server/assets/effect-QlVUlMFu-mXPkuQTb.js.map +1 -0
  339. package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js +2 -0
  340. package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js.map +1 -0
  341. package/dist/app/server/assets/error-CXy8gqdE.css +1 -0
  342. package/dist/app/server/assets/error-DXDT2AHy.js +2 -0
  343. package/dist/app/server/assets/error-DXDT2AHy.js.map +1 -0
  344. package/dist/app/server/assets/error-bnVzy9tx.js +2 -0
  345. package/dist/app/server/assets/error-bnVzy9tx.js.map +1 -0
  346. package/dist/app/server/assets/esm-C6SW--yt.js +4 -0
  347. package/dist/app/server/assets/esm-C6SW--yt.js.map +1 -0
  348. package/dist/app/server/assets/factory-dvoOlKer.js +5 -0
  349. package/dist/app/server/assets/factory-dvoOlKer.js.map +1 -0
  350. package/dist/app/server/assets/frxUSD-n9pTpinR.svg +1 -0
  351. package/dist/app/server/assets/get-id-field-OwLpfjj2.js +6 -0
  352. package/dist/app/server/assets/get-id-field-OwLpfjj2.js.map +1 -0
  353. package/dist/app/server/assets/getPseudoElementBounds-PkWU72kn.js +2 -0
  354. package/dist/app/server/assets/getPseudoElementBounds-PkWU72kn.js.map +1 -0
  355. package/dist/app/server/assets/goUSD-D9kUvHsF.svg +5 -0
  356. package/dist/app/server/assets/iUSD-CWCJAq9X.svg +1 -0
  357. package/dist/app/server/assets/index-CLddUTqr-CC33CMvS.js +2 -0
  358. package/dist/app/server/assets/index-CLddUTqr-CC33CMvS.js.map +1 -0
  359. package/dist/app/server/assets/index-DZEfthgZ-Ec2MMQ_e.js +2 -0
  360. package/dist/app/server/assets/index-DZEfthgZ-Ec2MMQ_e.js.map +1 -0
  361. package/dist/app/server/assets/kysely-adapter-B8tQwTcu.js +1 -0
  362. package/dist/app/server/assets/lazyRouteComponent-DPOOPZw_.js +2 -0
  363. package/dist/app/server/assets/lazyRouteComponent-DPOOPZw_.js.map +1 -0
  364. package/dist/app/server/assets/load-server-Dr0IlySo.js +3 -0
  365. package/dist/app/server/assets/load-server-Dr0IlySo.js.map +1 -0
  366. package/dist/app/server/assets/login-BLq3tEEr.js +2 -0
  367. package/dist/app/server/assets/login-BLq3tEEr.js.map +1 -0
  368. package/dist/app/server/assets/login-DCIrAbED.js +2 -0
  369. package/dist/app/server/assets/login-DCIrAbED.js.map +1 -0
  370. package/dist/app/server/assets/login-msDnt3yT.css +1 -0
  371. package/dist/app/server/assets/matchContext-ByrIUj4L.js +2 -0
  372. package/dist/app/server/assets/matchContext-ByrIUj4L.js.map +1 -0
  373. package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js +2 -0
  374. package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js.map +1 -0
  375. package/dist/app/server/assets/pathUSD-BvaO6ooS.svg +25 -0
  376. package/dist/app/server/assets/rUSD-B-xuFS7T.svg +1 -0
  377. package/dist/app/server/assets/reUSD-CkIUs0Lx.svg +1 -0
  378. package/dist/app/server/assets/react-dom-DYzj0HXX.js +2 -0
  379. package/dist/app/server/assets/react-dom-DYzj0HXX.js.map +1 -0
  380. package/dist/app/server/assets/removable-BCLTvPOx.js +2 -0
  381. package/dist/app/server/assets/removable-BCLTvPOx.js.map +1 -0
  382. package/dist/app/server/assets/reset-DZWeTZeQ.js +2 -0
  383. package/dist/app/server/assets/reset-DZWeTZeQ.js.map +1 -0
  384. package/dist/app/server/assets/reset-co-CHrff.css +1 -0
  385. package/dist/app/server/assets/resolveError-CZXXvCJR.js +2 -0
  386. package/dist/app/server/assets/resolveError-CZXXvCJR.js.map +1 -0
  387. package/dist/app/server/assets/rolldown-runtime-BWaJ3C7D.js +1 -0
  388. package/dist/app/server/assets/router-Bqz5X4Qw.js +2 -0
  389. package/dist/app/server/assets/router-Bqz5X4Qw.js.map +1 -0
  390. package/dist/app/server/assets/router-CclzitkY.css +1 -0
  391. package/dist/app/server/assets/routes-BLQdKqcZ.js +2 -0
  392. package/dist/app/server/assets/routes-BLQdKqcZ.js.map +1 -0
  393. package/dist/app/server/assets/routes-BgiIzrOt.css +1 -0
  394. package/dist/app/server/assets/routes-Bv6WzsSR.js +2 -0
  395. package/dist/app/server/assets/routes-Bv6WzsSR.js.map +1 -0
  396. package/dist/app/server/assets/sUSDe-j9GOnH7I.svg +1 -0
  397. package/dist/app/server/assets/schema-check-oLqvHR8y.js +9 -0
  398. package/dist/app/server/assets/schema-check-oLqvHR8y.js.map +1 -0
  399. package/dist/app/server/assets/secp256k1-yg8eeIYU.js +2 -0
  400. package/dist/app/server/assets/secp256k1-yg8eeIYU.js.map +1 -0
  401. package/dist/app/server/assets/server-RRUiOef2.js +76 -0
  402. package/dist/app/server/assets/server-RRUiOef2.js.map +1 -0
  403. package/dist/app/server/assets/siUSD-C10QUNYS.svg +1 -0
  404. package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js +2 -0
  405. package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js.map +1 -0
  406. package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js +6 -0
  407. package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js.map +1 -0
  408. package/dist/app/server/assets/standard-json-DY77efq0.js +2 -0
  409. package/dist/app/server/assets/standard-json-DY77efq0.js.map +1 -0
  410. package/dist/app/server/assets/standard-json-ig2t0wRt.js +2 -0
  411. package/dist/app/server/assets/standard-json-ig2t0wRt.js.map +1 -0
  412. package/dist/app/server/assets/standard-json-t-LNckA6.js +2 -0
  413. package/dist/app/server/assets/standard-json-t-LNckA6.js.map +1 -0
  414. package/dist/app/server/assets/standard-openapi-CONmVRl8.js +2 -0
  415. package/dist/app/server/assets/standard-openapi-CONmVRl8.js.map +1 -0
  416. package/dist/app/server/assets/start-C63VetBp.js +2 -0
  417. package/dist/app/server/assets/start-C63VetBp.js.map +1 -0
  418. package/dist/app/server/assets/stcUSD-DIntDJeh.svg +1 -0
  419. package/dist/app/server/assets/sury-CWZTCd75-CDaOS2oM.js +2 -0
  420. package/dist/app/server/assets/sury-CWZTCd75-CDaOS2oM.js.map +1 -0
  421. package/dist/app/server/assets/syrupUSDC-DhYwZqdM.svg +5 -0
  422. package/dist/app/server/assets/thetaUSD-Dgmksf6G.svg +1 -0
  423. package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js +2 -0
  424. package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js.map +1 -0
  425. package/dist/app/server/assets/useNavigate-D6d1w7KE.js +2 -0
  426. package/dist/app/server/assets/useNavigate-D6d1w7KE.js.map +1 -0
  427. package/dist/app/server/assets/useQuery-BRpCr5vj.js +2 -0
  428. package/dist/app/server/assets/useQuery-BRpCr5vj.js.map +1 -0
  429. package/dist/app/server/assets/useRegisterFieldControl-cJesrOWK.js +2 -0
  430. package/dist/app/server/assets/useRegisterFieldControl-cJesrOWK.js.map +1 -0
  431. package/dist/app/server/assets/utils-C4ZXZIZW.js +2 -0
  432. package/dist/app/server/assets/utils-C4ZXZIZW.js.map +1 -0
  433. package/dist/app/server/assets/utils-D57zfcg-.js +2 -0
  434. package/dist/app/server/assets/utils-D57zfcg-.js.map +1 -0
  435. package/dist/app/server/assets/valibot--1zFm7rT-CIKoH3MS.js +2 -0
  436. package/dist/app/server/assets/valibot--1zFm7rT-CIKoH3MS.js.map +1 -0
  437. package/dist/app/server/assets/valibot-D_HTw1Gn-BdPyLkXt.js +2 -0
  438. package/dist/app/server/assets/valibot-D_HTw1Gn-BdPyLkXt.js.map +1 -0
  439. package/dist/app/server/assets/wYLDS-CaCKDrO-.svg +10 -0
  440. package/dist/app/server/assets/wsrUSD-B2Ey0bDQ.svg +1 -0
  441. package/dist/app/server/assets/zod-Bwrt9trS-BezI5Gi1.js +2 -0
  442. package/dist/app/server/assets/zod-Bwrt9trS-BezI5Gi1.js.map +1 -0
  443. package/dist/app/server/assets/zod-DSgpEGAE-DZ7M_Q33.js +2 -0
  444. package/dist/app/server/assets/zod-DSgpEGAE-DZ7M_Q33.js.map +1 -0
  445. package/dist/app/server/assets/zyzz-6R2K52xP.css +1 -0
  446. package/dist/app/server/assets/zyzz.config-CJRpjn0E.js +3 -0
  447. package/dist/app/server/assets/zyzz.config-CJRpjn0E.js.map +1 -0
  448. package/dist/app/server/index.js +532 -0
  449. package/dist/app/server/index.js.map +1 -0
  450. package/dist/app/server/wrangler.json +1 -0
  451. package/dist/cli/Admin.d.ts +34 -0
  452. package/dist/cli/Admin.d.ts.map +1 -0
  453. package/dist/cli/Admin.js +61 -0
  454. package/dist/cli/Admin.js.map +1 -0
  455. package/dist/cli/Apps.d.ts +9 -0
  456. package/dist/cli/Apps.d.ts.map +1 -0
  457. package/dist/cli/Apps.js +34 -0
  458. package/dist/cli/Apps.js.map +1 -0
  459. package/dist/cli/Cli.d.ts +13 -0
  460. package/dist/cli/Cli.d.ts.map +1 -0
  461. package/dist/cli/Cli.js +26 -0
  462. package/dist/cli/Cli.js.map +1 -0
  463. package/dist/cli/Project.d.ts +17 -0
  464. package/dist/cli/Project.d.ts.map +1 -0
  465. package/dist/cli/Project.js +90 -0
  466. package/dist/cli/Project.js.map +1 -0
  467. package/dist/cli/Realms.d.ts +24 -0
  468. package/dist/cli/Realms.d.ts.map +1 -0
  469. package/dist/cli/Realms.js +48 -0
  470. package/dist/cli/Realms.js.map +1 -0
  471. package/dist/cli/Session.d.ts +79 -0
  472. package/dist/cli/Session.d.ts.map +1 -0
  473. package/dist/cli/Session.js +229 -0
  474. package/dist/cli/Session.js.map +1 -0
  475. package/dist/cli/User.d.ts +24 -0
  476. package/dist/cli/User.d.ts.map +1 -0
  477. package/dist/cli/User.js +34 -0
  478. package/dist/cli/User.js.map +1 -0
  479. package/dist/cli/V1.d.ts +32 -0
  480. package/dist/cli/V1.d.ts.map +1 -0
  481. package/dist/cli/V1.js +38 -0
  482. package/dist/cli/V1.js.map +1 -0
  483. package/dist/cli/bin.d.ts +3 -0
  484. package/dist/cli/bin.d.ts.map +1 -0
  485. package/dist/cli/bin.js +46 -0
  486. package/dist/cli/bin.js.map +1 -0
  487. package/dist/cli/commands/admin/apps/create.d.ts +23 -0
  488. package/dist/cli/commands/admin/apps/create.d.ts.map +1 -0
  489. package/dist/cli/commands/admin/apps/create.js +84 -0
  490. package/dist/cli/commands/admin/apps/create.js.map +1 -0
  491. package/dist/cli/commands/admin/apps/delete.d.ts +15 -0
  492. package/dist/cli/commands/admin/apps/delete.d.ts.map +1 -0
  493. package/dist/cli/commands/admin/apps/delete.js +41 -0
  494. package/dist/cli/commands/admin/apps/delete.js.map +1 -0
  495. package/dist/cli/commands/admin/apps/index.d.ts +5 -0
  496. package/dist/cli/commands/admin/apps/index.d.ts.map +1 -0
  497. package/dist/cli/commands/admin/apps/index.js +14 -0
  498. package/dist/cli/commands/admin/apps/index.js.map +1 -0
  499. package/dist/cli/commands/admin/apps/list.d.ts +10 -0
  500. package/dist/cli/commands/admin/apps/list.d.ts.map +1 -0
  501. package/dist/cli/commands/admin/apps/list.js +26 -0
  502. package/dist/cli/commands/admin/apps/list.js.map +1 -0
  503. package/dist/cli/commands/admin/apps/rotate-secret.d.ts +17 -0
  504. package/dist/cli/commands/admin/apps/rotate-secret.d.ts.map +1 -0
  505. package/dist/cli/commands/admin/apps/rotate-secret.js +47 -0
  506. package/dist/cli/commands/admin/apps/rotate-secret.js.map +1 -0
  507. package/dist/cli/commands/admin/apps/update.d.ts +20 -0
  508. package/dist/cli/commands/admin/apps/update.d.ts.map +1 -0
  509. package/dist/cli/commands/admin/apps/update.js +71 -0
  510. package/dist/cli/commands/admin/apps/update.js.map +1 -0
  511. package/dist/cli/commands/admin/index.d.ts +5 -0
  512. package/dist/cli/commands/admin/index.d.ts.map +1 -0
  513. package/dist/cli/commands/admin/index.js +13 -0
  514. package/dist/cli/commands/admin/index.js.map +1 -0
  515. package/dist/cli/commands/admin/migrate.d.ts +10 -0
  516. package/dist/cli/commands/admin/migrate.d.ts.map +1 -0
  517. package/dist/cli/commands/admin/migrate.js +20 -0
  518. package/dist/cli/commands/admin/migrate.js.map +1 -0
  519. package/dist/cli/commands/admin/realms/add.d.ts +13 -0
  520. package/dist/cli/commands/admin/realms/add.d.ts.map +1 -0
  521. package/dist/cli/commands/admin/realms/add.js +42 -0
  522. package/dist/cli/commands/admin/realms/add.js.map +1 -0
  523. package/dist/cli/commands/admin/realms/index.d.ts +5 -0
  524. package/dist/cli/commands/admin/realms/index.d.ts.map +1 -0
  525. package/dist/cli/commands/admin/realms/index.js +13 -0
  526. package/dist/cli/commands/admin/realms/index.js.map +1 -0
  527. package/dist/cli/commands/admin/realms/list.d.ts +14 -0
  528. package/dist/cli/commands/admin/realms/list.d.ts.map +1 -0
  529. package/dist/cli/commands/admin/realms/list.js +36 -0
  530. package/dist/cli/commands/admin/realms/list.js.map +1 -0
  531. package/dist/cli/commands/admin/realms/passkeys/index.d.ts +5 -0
  532. package/dist/cli/commands/admin/realms/passkeys/index.d.ts.map +1 -0
  533. package/dist/cli/commands/admin/realms/passkeys/index.js +13 -0
  534. package/dist/cli/commands/admin/realms/passkeys/index.js.map +1 -0
  535. package/dist/cli/commands/admin/realms/passkeys/set.d.ts +17 -0
  536. package/dist/cli/commands/admin/realms/passkeys/set.d.ts.map +1 -0
  537. package/dist/cli/commands/admin/realms/passkeys/set.js +46 -0
  538. package/dist/cli/commands/admin/realms/passkeys/set.js.map +1 -0
  539. package/dist/cli/commands/admin/realms/privy/index.d.ts +5 -0
  540. package/dist/cli/commands/admin/realms/privy/index.d.ts.map +1 -0
  541. package/dist/cli/commands/admin/realms/privy/index.js +13 -0
  542. package/dist/cli/commands/admin/realms/privy/index.js.map +1 -0
  543. package/dist/cli/commands/admin/realms/privy/set.d.ts +19 -0
  544. package/dist/cli/commands/admin/realms/privy/set.d.ts.map +1 -0
  545. package/dist/cli/commands/admin/realms/privy/set.js +66 -0
  546. package/dist/cli/commands/admin/realms/privy/set.js.map +1 -0
  547. package/dist/cli/commands/admin/realms/remove.d.ts +12 -0
  548. package/dist/cli/commands/admin/realms/remove.d.ts.map +1 -0
  549. package/dist/cli/commands/admin/realms/remove.js +35 -0
  550. package/dist/cli/commands/admin/realms/remove.js.map +1 -0
  551. package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts +16 -0
  552. package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts.map +1 -0
  553. package/dist/cli/commands/admin/realms/secp256k1/disable.js +42 -0
  554. package/dist/cli/commands/admin/realms/secp256k1/disable.js.map +1 -0
  555. package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts +16 -0
  556. package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts.map +1 -0
  557. package/dist/cli/commands/admin/realms/secp256k1/enable.js +42 -0
  558. package/dist/cli/commands/admin/realms/secp256k1/enable.js.map +1 -0
  559. package/dist/cli/commands/admin/realms/secp256k1/index.d.ts +9 -0
  560. package/dist/cli/commands/admin/realms/secp256k1/index.d.ts.map +1 -0
  561. package/dist/cli/commands/admin/realms/secp256k1/index.js +17 -0
  562. package/dist/cli/commands/admin/realms/secp256k1/index.js.map +1 -0
  563. package/dist/cli/commands/admin/realms/set.d.ts +17 -0
  564. package/dist/cli/commands/admin/realms/set.d.ts.map +1 -0
  565. package/dist/cli/commands/admin/realms/set.js +46 -0
  566. package/dist/cli/commands/admin/realms/set.js.map +1 -0
  567. package/dist/cli/commands/admin/rotate-key.d.ts +16 -0
  568. package/dist/cli/commands/admin/rotate-key.d.ts.map +1 -0
  569. package/dist/cli/commands/admin/rotate-key.js +46 -0
  570. package/dist/cli/commands/admin/rotate-key.js.map +1 -0
  571. package/dist/cli/commands/init.d.ts +11 -0
  572. package/dist/cli/commands/init.d.ts.map +1 -0
  573. package/dist/cli/commands/init.js +34 -0
  574. package/dist/cli/commands/init.js.map +1 -0
  575. package/dist/cli/commands/login.d.ts +12 -0
  576. package/dist/cli/commands/login.d.ts.map +1 -0
  577. package/dist/cli/commands/login.js +29 -0
  578. package/dist/cli/commands/login.js.map +1 -0
  579. package/dist/cli/commands/logout.d.ts +8 -0
  580. package/dist/cli/commands/logout.d.ts.map +1 -0
  581. package/dist/cli/commands/logout.js +19 -0
  582. package/dist/cli/commands/logout.js.map +1 -0
  583. package/dist/cli/commands/whoami.d.ts +12 -0
  584. package/dist/cli/commands/whoami.d.ts.map +1 -0
  585. package/dist/cli/commands/whoami.js +24 -0
  586. package/dist/cli/commands/whoami.js.map +1 -0
  587. package/dist/client/Actions.d.ts +108 -0
  588. package/dist/client/Actions.d.ts.map +1 -0
  589. package/dist/client/Actions.js +94 -0
  590. package/dist/client/Actions.js.map +1 -0
  591. package/dist/client/Auth.d.ts +143 -0
  592. package/dist/client/Auth.d.ts.map +1 -0
  593. package/dist/client/Auth.js +106 -0
  594. package/dist/client/Auth.js.map +1 -0
  595. package/dist/client/Authorization.d.ts +29 -0
  596. package/dist/client/Authorization.d.ts.map +1 -0
  597. package/dist/client/Authorization.js +12 -0
  598. package/dist/client/Authorization.js.map +1 -0
  599. package/dist/client/Decorator.d.ts +172 -0
  600. package/dist/client/Decorator.d.ts.map +1 -0
  601. package/dist/client/Decorator.js +241 -0
  602. package/dist/client/Decorator.js.map +1 -0
  603. package/dist/client/Key.d.ts +82 -0
  604. package/dist/client/Key.d.ts.map +1 -0
  605. package/dist/client/Key.js +81 -0
  606. package/dist/client/Key.js.map +1 -0
  607. package/dist/client/Pending.d.ts +38 -0
  608. package/dist/client/Pending.d.ts.map +1 -0
  609. package/dist/client/Pending.js +12 -0
  610. package/dist/client/Pending.js.map +1 -0
  611. package/dist/client/Permissions.d.ts +36 -0
  612. package/dist/client/Permissions.d.ts.map +1 -0
  613. package/dist/client/Permissions.js +16 -0
  614. package/dist/client/Permissions.js.map +1 -0
  615. package/dist/client/Storage.d.ts +27 -0
  616. package/dist/client/Storage.d.ts.map +1 -0
  617. package/dist/client/Storage.js +16 -0
  618. package/dist/client/Storage.js.map +1 -0
  619. package/dist/client/TempoAccount.d.ts +52 -0
  620. package/dist/client/TempoAccount.d.ts.map +1 -0
  621. package/dist/client/TempoAccount.js +17 -0
  622. package/dist/client/TempoAccount.js.map +1 -0
  623. package/dist/client/Tokens.d.ts +25 -0
  624. package/dist/client/Tokens.d.ts.map +1 -0
  625. package/dist/client/Tokens.js +12 -0
  626. package/dist/client/Tokens.js.map +1 -0
  627. package/dist/client/User.d.ts +21 -0
  628. package/dist/client/User.d.ts.map +1 -0
  629. package/dist/client/User.js +12 -0
  630. package/dist/client/User.js.map +1 -0
  631. package/dist/client/actions/account.d.ts +75 -0
  632. package/dist/client/actions/account.d.ts.map +1 -0
  633. package/dist/client/actions/account.js +102 -0
  634. package/dist/client/actions/account.js.map +1 -0
  635. package/dist/client/actions/device.d.ts +52 -0
  636. package/dist/client/actions/device.d.ts.map +1 -0
  637. package/dist/client/actions/device.js +103 -0
  638. package/dist/client/actions/device.js.map +1 -0
  639. package/dist/client/actions/email.d.ts +89 -0
  640. package/dist/client/actions/email.d.ts.map +1 -0
  641. package/dist/client/actions/email.js +86 -0
  642. package/dist/client/actions/email.js.map +1 -0
  643. package/dist/client/actions/oauth.d.ts +112 -0
  644. package/dist/client/actions/oauth.d.ts.map +1 -0
  645. package/dist/client/actions/oauth.js +103 -0
  646. package/dist/client/actions/oauth.js.map +1 -0
  647. package/dist/client/actions/passkey.d.ts +140 -0
  648. package/dist/client/actions/passkey.d.ts.map +1 -0
  649. package/dist/client/actions/passkey.js +170 -0
  650. package/dist/client/actions/passkey.js.map +1 -0
  651. package/dist/client/actions/realm.d.ts +25 -0
  652. package/dist/client/actions/realm.d.ts.map +1 -0
  653. package/dist/client/actions/realm.js +16 -0
  654. package/dist/client/actions/realm.js.map +1 -0
  655. package/dist/client/actions/redirect.d.ts +152 -0
  656. package/dist/client/actions/redirect.d.ts.map +1 -0
  657. package/dist/client/actions/redirect.js +311 -0
  658. package/dist/client/actions/redirect.js.map +1 -0
  659. package/dist/client/internal/accessKey.d.ts +21 -0
  660. package/dist/client/internal/accessKey.d.ts.map +1 -0
  661. package/dist/client/internal/accessKey.js +38 -0
  662. package/dist/client/internal/accessKey.js.map +1 -0
  663. package/dist/client/internal/account.d.ts +17 -0
  664. package/dist/client/internal/account.d.ts.map +1 -0
  665. package/dist/client/internal/account.js +3 -0
  666. package/dist/client/internal/account.js.map +1 -0
  667. package/dist/client/internal/api.d.ts +110 -0
  668. package/dist/client/internal/api.d.ts.map +1 -0
  669. package/dist/client/internal/api.js +136 -0
  670. package/dist/client/internal/api.js.map +1 -0
  671. package/dist/client/internal/headless.d.ts +159 -0
  672. package/dist/client/internal/headless.d.ts.map +1 -0
  673. package/dist/client/internal/headless.js +196 -0
  674. package/dist/client/internal/headless.js.map +1 -0
  675. package/dist/client/internal/indexedDb.d.ts +8 -0
  676. package/dist/client/internal/indexedDb.d.ts.map +1 -0
  677. package/dist/client/internal/indexedDb.js +32 -0
  678. package/dist/client/internal/indexedDb.js.map +1 -0
  679. package/dist/client/internal/request.d.ts +56 -0
  680. package/dist/client/internal/request.d.ts.map +1 -0
  681. package/dist/client/internal/request.js +44 -0
  682. package/dist/client/internal/request.js.map +1 -0
  683. package/dist/client/internal/store.d.ts +12 -0
  684. package/dist/client/internal/store.d.ts.map +1 -0
  685. package/dist/client/internal/store.js +15 -0
  686. package/dist/client/internal/store.js.map +1 -0
  687. package/dist/client/internal/verifier.d.ts +25 -0
  688. package/dist/client/internal/verifier.d.ts.map +1 -0
  689. package/dist/client/internal/verifier.js +52 -0
  690. package/dist/client/internal/verifier.js.map +1 -0
  691. package/dist/client.d.ts +18 -0
  692. package/dist/client.d.ts.map +1 -0
  693. package/dist/client.js +18 -0
  694. package/dist/client.js.map +1 -0
  695. package/dist/index.d.ts +6 -0
  696. package/dist/index.d.ts.map +1 -0
  697. package/dist/index.js +6 -0
  698. package/dist/index.js.map +1 -0
  699. package/dist/internal/Apps.d.ts +3169 -0
  700. package/dist/internal/Apps.d.ts.map +1 -0
  701. package/dist/internal/Apps.js +948 -0
  702. package/dist/internal/Apps.js.map +1 -0
  703. package/dist/internal/Auth.d.ts +4287 -0
  704. package/dist/internal/Auth.d.ts.map +1 -0
  705. package/dist/internal/Auth.js +185 -0
  706. package/dist/internal/Auth.js.map +1 -0
  707. package/dist/internal/Authorize.d.ts +526 -0
  708. package/dist/internal/Authorize.d.ts.map +1 -0
  709. package/dist/internal/Authorize.js +330 -0
  710. package/dist/internal/Authorize.js.map +1 -0
  711. package/dist/internal/Cache.d.ts +56 -0
  712. package/dist/internal/Cache.d.ts.map +1 -0
  713. package/dist/internal/Cache.js +65 -0
  714. package/dist/internal/Cache.js.map +1 -0
  715. package/dist/internal/Chain.d.ts +738 -0
  716. package/dist/internal/Chain.d.ts.map +1 -0
  717. package/dist/internal/Chain.js +65 -0
  718. package/dist/internal/Chain.js.map +1 -0
  719. package/dist/internal/ChainList.d.ts +117 -0
  720. package/dist/internal/ChainList.d.ts.map +1 -0
  721. package/dist/internal/ChainList.js +148 -0
  722. package/dist/internal/ChainList.js.map +1 -0
  723. package/dist/internal/ChainName.d.ts +11 -0
  724. package/dist/internal/ChainName.d.ts.map +1 -0
  725. package/dist/internal/ChainName.js +13 -0
  726. package/dist/internal/ChainName.js.map +1 -0
  727. package/dist/internal/CodeEmail.d.ts +38 -0
  728. package/dist/internal/CodeEmail.d.ts.map +1 -0
  729. package/dist/internal/CodeEmail.js +85 -0
  730. package/dist/internal/CodeEmail.js.map +1 -0
  731. package/dist/internal/ConfigurableAccount.d.ts +600 -0
  732. package/dist/internal/ConfigurableAccount.d.ts.map +1 -0
  733. package/dist/internal/ConfigurableAccount.js +795 -0
  734. package/dist/internal/ConfigurableAccount.js.map +1 -0
  735. package/dist/internal/Device.d.ts +246 -0
  736. package/dist/internal/Device.d.ts.map +1 -0
  737. package/dist/internal/Device.js +257 -0
  738. package/dist/internal/Device.js.map +1 -0
  739. package/dist/internal/Env.d.ts +97 -0
  740. package/dist/internal/Env.d.ts.map +1 -0
  741. package/dist/internal/Env.js +2 -0
  742. package/dist/internal/Env.js.map +1 -0
  743. package/dist/internal/ErrorResponse.d.ts +608 -0
  744. package/dist/internal/ErrorResponse.d.ts.map +1 -0
  745. package/dist/internal/ErrorResponse.js +701 -0
  746. package/dist/internal/ErrorResponse.js.map +1 -0
  747. package/dist/internal/Id.d.ts +10 -0
  748. package/dist/internal/Id.d.ts.map +1 -0
  749. package/dist/internal/Id.js +34 -0
  750. package/dist/internal/Id.js.map +1 -0
  751. package/dist/internal/KeyAuthorization.d.ts +1650 -0
  752. package/dist/internal/KeyAuthorization.d.ts.map +1 -0
  753. package/dist/internal/KeyAuthorization.js +1187 -0
  754. package/dist/internal/KeyAuthorization.js.map +1 -0
  755. package/dist/internal/Limits.d.ts +70 -0
  756. package/dist/internal/Limits.d.ts.map +1 -0
  757. package/dist/internal/Limits.js +36 -0
  758. package/dist/internal/Limits.js.map +1 -0
  759. package/dist/internal/Log.d.ts +34 -0
  760. package/dist/internal/Log.d.ts.map +1 -0
  761. package/dist/internal/Log.js +99 -0
  762. package/dist/internal/Log.js.map +1 -0
  763. package/dist/internal/LogLine.d.ts +29 -0
  764. package/dist/internal/LogLine.d.ts.map +1 -0
  765. package/dist/internal/LogLine.js +50 -0
  766. package/dist/internal/LogLine.js.map +1 -0
  767. package/dist/internal/Migrations.d.ts +28 -0
  768. package/dist/internal/Migrations.d.ts.map +1 -0
  769. package/dist/internal/Migrations.js +82 -0
  770. package/dist/internal/Migrations.js.map +1 -0
  771. package/dist/internal/Owner.d.ts +230 -0
  772. package/dist/internal/Owner.d.ts.map +1 -0
  773. package/dist/internal/Owner.js +101 -0
  774. package/dist/internal/Owner.js.map +1 -0
  775. package/dist/internal/Passkey.d.ts +901 -0
  776. package/dist/internal/Passkey.d.ts.map +1 -0
  777. package/dist/internal/Passkey.js +1185 -0
  778. package/dist/internal/Passkey.js.map +1 -0
  779. package/dist/internal/PendingKey.d.ts +49 -0
  780. package/dist/internal/PendingKey.d.ts.map +1 -0
  781. package/dist/internal/PendingKey.js +58 -0
  782. package/dist/internal/PendingKey.js.map +1 -0
  783. package/dist/internal/Privy.d.ts +138 -0
  784. package/dist/internal/Privy.d.ts.map +1 -0
  785. package/dist/internal/Privy.js +285 -0
  786. package/dist/internal/Privy.js.map +1 -0
  787. package/dist/internal/RateLimit.d.ts +218 -0
  788. package/dist/internal/RateLimit.d.ts.map +1 -0
  789. package/dist/internal/RateLimit.js +209 -0
  790. package/dist/internal/RateLimit.js.map +1 -0
  791. package/dist/internal/Realm.d.ts +290 -0
  792. package/dist/internal/Realm.d.ts.map +1 -0
  793. package/dist/internal/Realm.js +502 -0
  794. package/dist/internal/Realm.js.map +1 -0
  795. package/dist/internal/RequestId.d.ts +16 -0
  796. package/dist/internal/RequestId.d.ts.map +1 -0
  797. package/dist/internal/RequestId.js +78 -0
  798. package/dist/internal/RequestId.js.map +1 -0
  799. package/dist/internal/SigningKey.d.ts +126 -0
  800. package/dist/internal/SigningKey.d.ts.map +1 -0
  801. package/dist/internal/SigningKey.js +221 -0
  802. package/dist/internal/SigningKey.js.map +1 -0
  803. package/dist/internal/TempoAccount.d.ts +181 -0
  804. package/dist/internal/TempoAccount.d.ts.map +1 -0
  805. package/dist/internal/TempoAccount.js +369 -0
  806. package/dist/internal/TempoAccount.js.map +1 -0
  807. package/dist/internal/TestInbox.d.ts +42 -0
  808. package/dist/internal/TestInbox.d.ts.map +1 -0
  809. package/dist/internal/TestInbox.js +20 -0
  810. package/dist/internal/TestInbox.js.map +1 -0
  811. package/dist/internal/Timing.d.ts +52 -0
  812. package/dist/internal/Timing.d.ts.map +1 -0
  813. package/dist/internal/Timing.js +116 -0
  814. package/dist/internal/Timing.js.map +1 -0
  815. package/dist/internal/Validation.d.ts +52 -0
  816. package/dist/internal/Validation.d.ts.map +1 -0
  817. package/dist/internal/Validation.js +22 -0
  818. package/dist/internal/Validation.js.map +1 -0
  819. package/dist/internal/Verification.d.ts +24 -0
  820. package/dist/internal/Verification.d.ts.map +1 -0
  821. package/dist/internal/Verification.js +37 -0
  822. package/dist/internal/Verification.js.map +1 -0
  823. package/dist/internal/Wallet.d.ts +66 -0
  824. package/dist/internal/Wallet.d.ts.map +1 -0
  825. package/dist/internal/Wallet.js +59 -0
  826. package/dist/internal/Wallet.js.map +1 -0
  827. package/dist/internal/owners/Passkey.d.ts +9 -0
  828. package/dist/internal/owners/Passkey.d.ts.map +1 -0
  829. package/dist/internal/owners/Passkey.js +58 -0
  830. package/dist/internal/owners/Passkey.js.map +1 -0
  831. package/dist/internal/owners/Privy.d.ts +13 -0
  832. package/dist/internal/owners/Privy.d.ts.map +1 -0
  833. package/dist/internal/owners/Privy.js +59 -0
  834. package/dist/internal/owners/Privy.js.map +1 -0
  835. package/dist/internal/owners/Secp256k1.d.ts +12 -0
  836. package/dist/internal/owners/Secp256k1.d.ts.map +1 -0
  837. package/dist/internal/owners/Secp256k1.js +99 -0
  838. package/dist/internal/owners/Secp256k1.js.map +1 -0
  839. package/dist/worker.d.ts +18 -0
  840. package/dist/worker.d.ts.map +1 -0
  841. package/dist/worker.js +18 -0
  842. package/dist/worker.js.map +1 -0
  843. package/package.json +83 -3
  844. package/src/Api.ts +157 -0
  845. package/src/App.ts +316 -0
  846. package/src/api/account.ts +2266 -0
  847. package/src/api/authenticate.ts +1662 -0
  848. package/src/api/authorize.ts +1086 -0
  849. package/src/api/device.ts +516 -0
  850. package/src/api/health.ts +72 -0
  851. package/src/api/lib/AccountStep.ts +485 -0
  852. package/src/api/lib/Auth.ts +164 -0
  853. package/src/api/lib/Configure.ts +921 -0
  854. package/src/api/lib/Consent.ts +388 -0
  855. package/src/api/lib/Cors.ts +160 -0
  856. package/src/api/lib/Database.ts +10 -0
  857. package/src/api/lib/DeviceRequest.ts +244 -0
  858. package/src/api/lib/FirstAccount.ts +136 -0
  859. package/src/api/lib/Headless.ts +616 -0
  860. package/src/api/lib/IsolateCache.ts +28 -0
  861. package/src/api/lib/KeySigner.ts +690 -0
  862. package/src/api/lib/PasskeyLink.ts +162 -0
  863. package/src/api/lib/Session.ts +64 -0
  864. package/src/api/lib/SignInConsent.ts +393 -0
  865. package/src/api/oauth.ts +1796 -0
  866. package/src/app/components/CodeInput.tsx +153 -0
  867. package/src/app/components/DevTools.tsx +1071 -0
  868. package/src/app/components/Grant.tsx +476 -0
  869. package/src/app/components/icons/BRLA.png +0 -0
  870. package/src/app/components/icons/BRZ.svg +1 -0
  871. package/src/app/components/icons/CHFAU.png +0 -0
  872. package/src/app/components/icons/DLUSD.png +0 -0
  873. package/src/app/components/icons/EURAU.svg +1 -0
  874. package/src/app/components/icons/EURC.e.svg +1 -0
  875. package/src/app/components/icons/GBPA.svg +4 -0
  876. package/src/app/components/icons/GUSD.svg +1 -0
  877. package/src/app/components/icons/MACH.svg +4 -0
  878. package/src/app/components/icons/OUSD.svg +5 -0
  879. package/src/app/components/icons/PRIME.svg +14 -0
  880. package/src/app/components/icons/SBC.svg +1 -0
  881. package/src/app/components/icons/SEKAU.svg +5 -0
  882. package/src/app/components/icons/USD1.svg +30 -0
  883. package/src/app/components/icons/USDB.svg +11 -0
  884. package/src/app/components/icons/USDC.e.svg +1 -0
  885. package/src/app/components/icons/USDT0.svg +1 -0
  886. package/src/app/components/icons/USDY.svg +16 -0
  887. package/src/app/components/icons/USDe.svg +1 -0
  888. package/src/app/components/icons/YLDS.svg +3 -0
  889. package/src/app/components/icons/alphaUSD.svg +1 -0
  890. package/src/app/components/icons/betaUSD.svg +1 -0
  891. package/src/app/components/icons/cUSD.svg +1 -0
  892. package/src/app/components/icons/cbBTC.svg +1 -0
  893. package/src/app/components/icons/frxUSD.svg +1 -0
  894. package/src/app/components/icons/goUSD.svg +5 -0
  895. package/src/app/components/icons/iUSD.svg +1 -0
  896. package/src/app/components/icons/pathUSD.svg +25 -0
  897. package/src/app/components/icons/rUSD.svg +1 -0
  898. package/src/app/components/icons/reUSD.svg +1 -0
  899. package/src/app/components/icons/sUSDe.svg +1 -0
  900. package/src/app/components/icons/siUSD.svg +1 -0
  901. package/src/app/components/icons/stcUSD.svg +1 -0
  902. package/src/app/components/icons/syrupUSDC.svg +5 -0
  903. package/src/app/components/icons/thetaUSD.svg +1 -0
  904. package/src/app/components/icons/wYLDS.svg +10 -0
  905. package/src/app/components/icons/wsrUSD.svg +1 -0
  906. package/src/app/components/logos/OUSD.dark.svg +17 -0
  907. package/src/app/components/logos/OUSD.light.svg +17 -0
  908. package/src/app/coverage.server.ts +73 -0
  909. package/src/app/coverage.ts +69 -0
  910. package/src/app/crons/cleanup.ts +104 -0
  911. package/src/app/db/auth.ts +440 -0
  912. package/src/app/db/migrations/0000_better_auth.sql +53 -0
  913. package/src/app/db/migrations/0001_oauth_provider.sql +162 -0
  914. package/src/app/db/migrations/0002_device_code.sql +17 -0
  915. package/src/app/db/migrations/0003_realms.sql +27 -0
  916. package/src/app/db/migrations/0004_default_realm.sql +2 -0
  917. package/src/app/db/migrations/0005_passkeys.sql +30 -0
  918. package/src/app/db/migrations/0006_first_accounts.sql +9 -0
  919. package/src/app/db/migrations/0007_pending_keys.sql +13 -0
  920. package/src/app/db/migrations/0008_secp256k1_owners.sql +18 -0
  921. package/src/app/db/migrations/0009_device_requests.sql +8 -0
  922. package/src/app/db/migrations/0010_device_keys.sql +4 -0
  923. package/src/app/db/migrations/0011_registered_passkeys.sql +2 -0
  924. package/src/app/db/migrations/0012_passkey_accounts.sql +7 -0
  925. package/src/app/db/migrations/0013_first_party_apps.sql +4 -0
  926. package/src/app/db/migrations/0014_logout_revokes_tokens.sql +17 -0
  927. package/src/app/db/migrations/0015_expiry_indexes.sql +9 -0
  928. package/src/app/db/migrations/0016_configurable_accounts.sql +15 -0
  929. package/src/app/db/migrations/0017_account_config_keys.sql +3 -0
  930. package/src/app/db/migrations/0018_better_auth_1_8.sql +9 -0
  931. package/src/app/db/migrations/0019_drop_provider_account_index.sql +1 -0
  932. package/src/app/db/migrations/meta/0000_snapshot.json +362 -0
  933. package/src/app/db/migrations/meta/0001_snapshot.json +1487 -0
  934. package/src/app/db/migrations/meta/0002_snapshot.json +1603 -0
  935. package/src/app/db/migrations/meta/0003_snapshot.json +1760 -0
  936. package/src/app/db/migrations/meta/0004_snapshot.json +1760 -0
  937. package/src/app/db/migrations/meta/0005_snapshot.json +1911 -0
  938. package/src/app/db/migrations/meta/0006_snapshot.json +1967 -0
  939. package/src/app/db/migrations/meta/0007_snapshot.json +2047 -0
  940. package/src/app/db/migrations/meta/0008_snapshot.json +2157 -0
  941. package/src/app/db/migrations/meta/0009_snapshot.json +2207 -0
  942. package/src/app/db/migrations/meta/0010_snapshot.json +2231 -0
  943. package/src/app/db/migrations/meta/0011_snapshot.json +2231 -0
  944. package/src/app/db/migrations/meta/0012_snapshot.json +2231 -0
  945. package/src/app/db/migrations/meta/0013_snapshot.json +2231 -0
  946. package/src/app/db/migrations/meta/0014_snapshot.json +2231 -0
  947. package/src/app/db/migrations/meta/0015_snapshot.json +2375 -0
  948. package/src/app/db/migrations/meta/0016_snapshot.json +2475 -0
  949. package/src/app/db/migrations/meta/0017_snapshot.json +2481 -0
  950. package/src/app/db/migrations/meta/0018_snapshot.json +2535 -0
  951. package/src/app/db/migrations/meta/0019_snapshot.json +2514 -0
  952. package/src/app/db/migrations/meta/_journal.json +146 -0
  953. package/src/app/db/schema.ts +241 -0
  954. package/src/app/db/table.ts +31 -0
  955. package/src/app/env.ts +57 -0
  956. package/src/app/inbox.ts +190 -0
  957. package/src/app/lib/Client.ts +82 -0
  958. package/src/app/lib/Inbox.ts +11 -0
  959. package/src/app/lib/Loader.ts +21 -0
  960. package/src/app/lib/Upgrade.ts +221 -0
  961. package/src/app/package.json +8 -0
  962. package/src/app/public/_headers +4 -0
  963. package/src/app/routeTree.gen.ts +219 -0
  964. package/src/app/router.tsx +47 -0
  965. package/src/app/routes/[_].flows.tsx +4254 -0
  966. package/src/app/routes/__root.tsx +172 -0
  967. package/src/app/routes/authorize.tsx +379 -0
  968. package/src/app/routes/choose-account.tsx +144 -0
  969. package/src/app/routes/deposit.tsx +107 -0
  970. package/src/app/routes/device.tsx +273 -0
  971. package/src/app/routes/error.tsx +62 -0
  972. package/src/app/routes/index.tsx +511 -0
  973. package/src/app/routes/login.tsx +577 -0
  974. package/src/app/screens/Account.tsx +559 -0
  975. package/src/app/screens/Approval.tsx +444 -0
  976. package/src/app/screens/ChooseAccount.tsx +206 -0
  977. package/src/app/screens/Deposit.tsx +523 -0
  978. package/src/app/screens/DeviceApproval.tsx +500 -0
  979. package/src/app/screens/NotFound.tsx +62 -0
  980. package/src/app/screens/SignIn.tsx +372 -0
  981. package/src/app/screens/WalletUpgrade.tsx +121 -0
  982. package/src/app/screens/chains/base.svg +3 -0
  983. package/src/app/screens/chains/ethereum.svg +11 -0
  984. package/src/app/screens/chains/solana.svg +4 -0
  985. package/src/app/screens/chains/tempo.svg +4 -0
  986. package/src/app/server.ts +342 -0
  987. package/src/app/vite.config.ts +128 -0
  988. package/src/app/void.config.ts +36 -0
  989. package/src/app/wallet.ts +69 -0
  990. package/src/app/zyzz.config.ts +52 -0
  991. package/src/cli/Admin.ts +74 -0
  992. package/src/cli/Apps.ts +27 -0
  993. package/src/cli/Cli.ts +41 -0
  994. package/src/cli/Project.ts +119 -0
  995. package/src/cli/Realms.ts +49 -0
  996. package/src/cli/Session.ts +290 -0
  997. package/src/cli/User.ts +40 -0
  998. package/src/cli/V1.ts +54 -0
  999. package/src/cli/bin.ts +44 -0
  1000. package/src/cli/commands/admin/apps/create.ts +96 -0
  1001. package/src/cli/commands/admin/apps/delete.ts +38 -0
  1002. package/src/cli/commands/admin/apps/index.ts +15 -0
  1003. package/src/cli/commands/admin/apps/list.ts +25 -0
  1004. package/src/cli/commands/admin/apps/rotate-secret.ts +47 -0
  1005. package/src/cli/commands/admin/apps/update.ts +79 -0
  1006. package/src/cli/commands/admin/index.ts +14 -0
  1007. package/src/cli/commands/admin/migrate.ts +19 -0
  1008. package/src/cli/commands/admin/realms/add.ts +40 -0
  1009. package/src/cli/commands/admin/realms/index.ts +14 -0
  1010. package/src/cli/commands/admin/realms/list.ts +38 -0
  1011. package/src/cli/commands/admin/realms/passkeys/index.ts +15 -0
  1012. package/src/cli/commands/admin/realms/passkeys/set.ts +44 -0
  1013. package/src/cli/commands/admin/realms/privy/index.ts +14 -0
  1014. package/src/cli/commands/admin/realms/privy/set.ts +69 -0
  1015. package/src/cli/commands/admin/realms/remove.ts +33 -0
  1016. package/src/cli/commands/admin/realms/secp256k1/disable.ts +40 -0
  1017. package/src/cli/commands/admin/realms/secp256k1/enable.ts +40 -0
  1018. package/src/cli/commands/admin/realms/secp256k1/index.ts +19 -0
  1019. package/src/cli/commands/admin/realms/set.ts +46 -0
  1020. package/src/cli/commands/admin/rotate-key.ts +47 -0
  1021. package/src/cli/commands/init.ts +42 -0
  1022. package/src/cli/commands/login.ts +32 -0
  1023. package/src/cli/commands/logout.ts +19 -0
  1024. package/src/cli/commands/whoami.ts +23 -0
  1025. package/src/client/Actions.ts +180 -0
  1026. package/src/client/Auth.ts +267 -0
  1027. package/src/client/Authorization.ts +34 -0
  1028. package/src/client/Decorator.ts +444 -0
  1029. package/src/client/Key.ts +137 -0
  1030. package/src/client/Pending.ts +45 -0
  1031. package/src/client/Permissions.ts +41 -0
  1032. package/src/client/Storage.ts +29 -0
  1033. package/src/client/TempoAccount.ts +55 -0
  1034. package/src/client/Tokens.ts +27 -0
  1035. package/src/client/User.ts +23 -0
  1036. package/src/client/actions/account.ts +171 -0
  1037. package/src/client/actions/device.ts +166 -0
  1038. package/src/client/actions/email.ts +164 -0
  1039. package/src/client/actions/oauth.ts +179 -0
  1040. package/src/client/actions/passkey.ts +333 -0
  1041. package/src/client/actions/realm.ts +37 -0
  1042. package/src/client/actions/redirect.ts +502 -0
  1043. package/src/client/internal/accessKey.ts +54 -0
  1044. package/src/client/internal/account.ts +18 -0
  1045. package/src/client/internal/api.ts +242 -0
  1046. package/src/client/internal/headless.ts +308 -0
  1047. package/src/client/internal/indexedDb.ts +44 -0
  1048. package/src/client/internal/request.ts +70 -0
  1049. package/src/client/internal/store.ts +20 -0
  1050. package/src/client/internal/verifier.ts +75 -0
  1051. package/src/client.ts +17 -0
  1052. package/src/index.ts +5 -0
  1053. package/src/internal/Apps.ts +1283 -0
  1054. package/src/internal/Auth.ts +273 -0
  1055. package/src/internal/Authorize.ts +433 -0
  1056. package/src/internal/Balance.ts +144 -0
  1057. package/src/internal/BodyLimit.ts +31 -0
  1058. package/src/internal/Cache.ts +119 -0
  1059. package/src/internal/Chain.ts +99 -0
  1060. package/src/internal/ChainList.ts +270 -0
  1061. package/src/internal/ChainName.ts +14 -0
  1062. package/src/internal/ChainStatus.ts +65 -0
  1063. package/src/internal/CodeEmail.ts +138 -0
  1064. package/src/internal/ConfigurableAccount.ts +1315 -0
  1065. package/src/internal/Device.ts +471 -0
  1066. package/src/internal/Env.ts +92 -0
  1067. package/src/internal/ErrorResponse.ts +896 -0
  1068. package/src/internal/Faucet.ts +43 -0
  1069. package/src/internal/Id.ts +41 -0
  1070. package/src/internal/KeyAuthorization.ts +1536 -0
  1071. package/src/internal/Limits.ts +40 -0
  1072. package/src/internal/Log.ts +166 -0
  1073. package/src/internal/LogLine.ts +81 -0
  1074. package/src/internal/Logout.ts +356 -0
  1075. package/src/internal/Migrations.ts +120 -0
  1076. package/src/internal/OpenApi.ts +300 -0
  1077. package/src/internal/Owner.ts +310 -0
  1078. package/src/internal/Passkey.ts +1904 -0
  1079. package/src/internal/PendingKey.ts +104 -0
  1080. package/src/internal/Privy.ts +536 -0
  1081. package/src/internal/RateLimit.ts +346 -0
  1082. package/src/internal/Realm.ts +814 -0
  1083. package/src/internal/RequestId.ts +118 -0
  1084. package/src/internal/SignInGrant.ts +175 -0
  1085. package/src/internal/SigningKey.ts +319 -0
  1086. package/src/internal/TempoAccount.ts +545 -0
  1087. package/src/internal/TestInbox.ts +51 -0
  1088. package/src/internal/Timing.ts +172 -0
  1089. package/src/internal/Validation.ts +52 -0
  1090. package/src/internal/Verification.ts +58 -0
  1091. package/src/internal/Wallet.ts +101 -0
  1092. package/src/internal/owners/Passkey.ts +76 -0
  1093. package/src/internal/owners/Privy.ts +82 -0
  1094. package/src/internal/owners/Secp256k1.ts +139 -0
  1095. package/src/types/app.d.ts +39 -0
  1096. package/src/worker.ts +17 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-Bqz5X4Qw.js","names":["Fragment","Fragment","__zyzzSelection.create","Route","reset","ChainName.read","lazy","useState","Client.create","Client.Context","Suspense","styles","ds","vars","Props","__zyzzProps","createFileRoute","style","variants","Node","detail","edge","name","owner","screen","ReactNode","Flow","description","nodes","title","Anchor","canvas","x","y","viewport","Section","flows","Route","component","lazyRouteComponent","$$splitComponentImporter","ssr","styles","app","ReturnType","appAddress","appButton","input","Record","Options","external","className","vars","inline","result","value","Object","hasOwn","String","appDescription","appDivider","appField","appHeader","appInput","appLabel","appTitle","arrow","artboard","code","externalName","flow","flowDescription","flowHeader","flowTitle","frame","frameLabel","head","hidden","intro","kind","legend","legendFlow","legendFlows","legendList","legendSection","legendItem","legendTrigger","lede","line","panels","placeholder","create","probe","row","rowBox","section","sectionTitle","shaft","step","world","zoom","zoomIcon","zoomLevel","IndexRouteImport","rootRouteImport","AuthorizeRouteImport","ChooseAccountRouteImport","DepositRouteImport","DeviceRouteImport","ErrorRouteImport","LoginRouteImport","Char91_Char93FlowsRouteImport","__toESM","require_react","useRouter","deepEqual","escapeHtml","hasOwn","createNonReactiveMutableStore","RouterCore","createNonReactiveReadonlyStore","_getAssetMatches","useHydrated","appendUniqueUserTags","getAssetCrossOrigin","resolveManifestCssLink","getScriptPreloadAttrs","Outlet","createFileRoute","createRootRoute","lazyRouteComponent","create","Context","create$1","create$2","vars$1","QueryClientProvider","skipToken","onlineManager","noop","Subscribable","hashQueryKeyByOptions","hashKey","functionalUpdate","notifyManager","focusManager","matchMutation","resolveQueryValue","partialMatchKey","matchQuery","Query","Mutation","Toast","Route$2","NotFound","Route$3","Route$4","Route$5","Route$6","Route$7","Route$8","getSsrBodyScriptParts","assetMatches","matches","routeScripts","manifestScripts","match","script","attrs","routeScriptAttrs","manifest","asset","composeSsrBodyScripts","initialHydrationScripts","retainSearchParams","resultSearch","next","search","keys","copy","removed","meta","explicit","key","stringKey","createReactiveSystem","link","prevDep","sub","dep","nextDep","version","prevSub","newLink","unlink","nextSub","unwatched","propagate","stack","flags","isValidLink","notify","subSubs","checkDirty","checkDepth","dirty","update","subs","shallowPropagate","firstSub","hasMultipleSubs","checkLink","queuedEffects","atom","effect","purgeDeps","queuedEffectsLength","depsTail","getStoreFactory","fn","createRouter","Router","options","import_react","import_jsx_runtime","require_jsx_runtime","noopScriptHandler","setScriptAttrs","value","Asset","innerHTML","children","Script","dataScript","normSrc","el","typeAttr","nonceAttr","sType","sNonce","preventScriptHoist","buildTagsFromMatches","routeMeta","resultMeta","metaByAttribute","title","i","metas","j","m","json","attribute","nonce","constructedLinks","router","manifestCssTags","resolvedLink","assetCrossOrigin","preloadLinks","preload","styles","style","headScripts","tags","useTags","HeadContent","props","tag","Scripts","renderScripts","parts","scriptWithHoist","scripts","MutationCache","config","#mutations","#scopes","#mutationId","mutation","client","scope","scopeFor","scopedMutations","index","firstPendingMutation","defaultedFilters","filters","listener","event","pausedMutations","x","QueryCache","#queries","queryKey","queryHash","query","queries","QueryClient","#queryCache","#mutationCache","#defaultOptions","#queryDefaults","#mutationDefaults","#mountCount","#unsubscribeFocus","focused","#unsubscribeOnline","online","defaultedOptions","cachedData","state","prevData","data","updater","queryCache","matched","queriesToRefetch","defaultedCancelOptions","cancelOptions","promises","fetchOptions","promise","queryData","select","defaults","result","queryDefault","mutationKey","favicon","Route$1","Root","reset_default","NotFoundPage","Document","read","DevTools","devToolsKey","queryClient","devTools","useDevTools","enabled","setEnabled","off","styles$1","hydrated","setHydrated","vars","Route","external","input","inline","className","\"tone\"","\"kind\"","rootRouteChildren","routeTree","getRouter","parseSearch","params","values","stringifySearch","entry"],"sources":["../../../../../node_modules/.pnpm/@tanstack+router-core@1.171.34/node_modules/@tanstack/router-core/dist/esm/ssr/bodyScripts.js","../../../../../node_modules/.pnpm/@tanstack+router-core@1.171.34/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.js","../../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/alien.js","../../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/atom.js","../../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/routerStores.js","../../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/router.js","../../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/Asset.js","../../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/headContentUtils.js","../../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/HeadContent.js","../../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/Scripts.js","../../../../../node_modules/.pnpm/@tanstack+query-core@5.104.1/node_modules/@tanstack/query-core/build/modern/mutationCache.js","../../../../../node_modules/.pnpm/@tanstack+query-core@5.104.1/node_modules/@tanstack/query-core/build/modern/queryCache.js","../../../../../node_modules/.pnpm/@tanstack+query-core@5.104.1/node_modules/@tanstack/query-core/build/modern/queryClient.js","../../../../../node_modules/.pnpm/@tempoxyz+ds@0.2.6_@types+react@19.3.0_react-dom@19.3.0_react@19.3.0__react-native@0.86_f564df10a26f3190a3aaf6288ad1f3d1/node_modules/@tempoxyz/ds/dist/web/zyzz.config.js","../../../routes/__root.tsx","../../../routes/[_].flows.tsx","../../../routeTree.gen.ts","../../../router.tsx"],"sourcesContent":["import { _getAssetMatches } from \"../load-client.js\";\n//#region src/ssr/bodyScripts.ts\nfunction getSsrBodyScriptParts(matches, manifest, nonce, routeScriptAttrs) {\n\tconst assetMatches = _getAssetMatches(matches);\n\tconst routeScripts = [];\n\tconst manifestScripts = [];\n\tfor (const match of assetMatches) for (const script of Array.isArray(match.scripts) ? match.scripts : []) {\n\t\tif (!script) continue;\n\t\tconst { children, ...attrs } = script;\n\t\trouteScripts.push({\n\t\t\ttag: \"script\",\n\t\t\tattrs: {\n\t\t\t\t...attrs,\n\t\t\t\t...routeScriptAttrs,\n\t\t\t\tnonce\n\t\t\t},\n\t\t\tchildren\n\t\t});\n\t}\n\tif (manifest) for (const match of assetMatches) for (const asset of manifest.routes[match.routeId]?.scripts ?? []) manifestScripts.push({\n\t\ttag: \"script\",\n\t\tattrs: {\n\t\t\t...asset.attrs,\n\t\t\tnonce\n\t\t},\n\t\tchildren: asset.children\n\t});\n\treturn [routeScripts, manifestScripts];\n}\nfunction composeSsrBodyScripts([routeScripts, manifestScripts], initialHydrationScripts) {\n\tif (!initialHydrationScripts) return [...routeScripts, ...manifestScripts];\n\treturn [\n\t\t...initialHydrationScripts.before,\n\t\t...routeScripts,\n\t\t...manifestScripts,\n\t\tinitialHydrationScripts.boundary\n\t];\n}\n//#endregion\nexport { composeSsrBodyScripts, getSsrBodyScriptParts };\n\n//# sourceMappingURL=bodyScripts.js.map","import { deepEqual, hasOwn } from \"./utils.js\";\n//#region src/searchMiddleware.ts\n/**\n* Retain specified search params across navigations.\n*\n* If `keys` is `true`, retain all current params. Otherwise, copy only the\n* listed keys from the current search into the next search.\n*\n* @param keys `true` to retain all, or a list of keys to retain.\n* @returns A search middleware suitable for route `search.middlewares`.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/retainSearchParamsFunction\n*/\nfunction retainSearchParams(keys) {\n\treturn ({ search, next }) => {\n\t\tconst { search: resultSearch, meta } = next(search, true);\n\t\tif (keys === true) {\n\t\t\tconst copy = {\n\t\t\t\t...search,\n\t\t\t\t...resultSearch\n\t\t\t};\n\t\t\tconst removed = meta.removed;\n\t\t\tconst explicit = meta.explicit;\n\t\t\tfor (const key of removed?.keys() || []) if (explicit && hasOwn.call(explicit, key) || deepEqual(search[key], removed.get(key))) delete copy[key];\n\t\t\tfor (const key of meta.removedAny || []) delete copy[key];\n\t\t\tfor (const key of meta.defaulted?.keys() || []) if (key in search && !meta.removedAny?.has(key) && !(meta.removed?.has(key) && (explicit && hasOwn.call(explicit, key) || deepEqual(search[key], meta.removed.get(key))))) copy[key] = search[key];\n\t\t\treturn copy;\n\t\t}\n\t\tconst copy = { ...resultSearch };\n\t\tconst explicit = meta.explicit;\n\t\tfor (const key of keys) {\n\t\t\tconst stringKey = key;\n\t\t\tif (!(meta.removedAny?.has(stringKey) || meta.removed?.has(stringKey) && (explicit && hasOwn.call(explicit, stringKey) || deepEqual(search[key], meta.removed.get(stringKey)))) && (!(key in copy) || key in search && meta.defaulted?.has(stringKey) && deepEqual(copy[key], meta.defaulted.get(stringKey)))) copy[key] = search[key];\n\t\t}\n\t\treturn copy;\n\t};\n}\n/**\n* Remove optional or default-valued search params from navigations.\n*\n* - Pass `true` (only if there are no required search params) to strip all.\n* - Pass an array to always remove those optional keys.\n* - Pass an object of default values; keys equal (deeply) to the defaults are removed.\n*\n* @returns A search middleware suitable for route `search.middlewares`.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/stripSearchParamsFunction\n*/\nfunction stripSearchParams(input) {\n\treturn (({ search, next, meta }) => {\n\t\tif (input === true) {\n\t\t\tObject.keys(search).forEach((key) => {\n\t\t\t\tif (meta) (meta.removedAny ||= /* @__PURE__ */ new Set()).add(key);\n\t\t\t});\n\t\t\treturn {};\n\t\t}\n\t\tconst result = { ...next(search) };\n\t\tif (Array.isArray(input)) input.forEach((key) => {\n\t\t\tdelete result[key];\n\t\t\tif (meta) (meta.removedAny ||= /* @__PURE__ */ new Set()).add(key);\n\t\t});\n\t\telse Object.entries(input).forEach(([key, value]) => {\n\t\t\tif (deepEqual(result[key], value)) {\n\t\t\t\tdelete result[key];\n\t\t\t\tif (meta) (meta.removed ||= /* @__PURE__ */ new Map()).set(key, value);\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t});\n}\n//#endregion\nexport { retainSearchParams, stripSearchParams };\n\n//# sourceMappingURL=searchMiddleware.js.map","//#region src/alien.ts\nconst NONE = 0;\nconst MUTABLE = 1;\nconst WATCHING = 2;\nconst RECURSED_CHECK = 4;\nconst RECURSED = 8;\nconst DIRTY = 16;\nconst PENDING = 32;\n/* @__NO_SIDE_EFFECTS__ */\nfunction createReactiveSystem({ update, notify, unwatched }) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate\n\t};\n\tfunction link(dep, sub, version) {\n\t\tconst prevDep = sub.depsTail;\n\t\tif (prevDep !== void 0 && prevDep.dep === dep) return;\n\t\tconst nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;\n\t\tif (nextDep !== void 0 && nextDep.dep === dep) {\n\t\t\tnextDep.version = version;\n\t\t\tsub.depsTail = nextDep;\n\t\t\treturn;\n\t\t}\n\t\tconst prevSub = dep.subsTail;\n\t\tif (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) return;\n\t\tconst newLink = sub.depsTail = dep.subsTail = {\n\t\t\tversion,\n\t\t\tdep,\n\t\t\tsub,\n\t\t\tprevDep,\n\t\t\tnextDep,\n\t\t\tprevSub,\n\t\t\tnextSub: void 0\n\t\t};\n\t\tif (nextDep !== void 0) nextDep.prevDep = newLink;\n\t\tif (prevDep !== void 0) prevDep.nextDep = newLink;\n\t\telse sub.deps = newLink;\n\t\tif (prevSub !== void 0) prevSub.nextSub = newLink;\n\t\telse dep.subs = newLink;\n\t}\n\tfunction unlink(link, sub = link.sub) {\n\t\tconst dep = link.dep;\n\t\tconst prevDep = link.prevDep;\n\t\tconst nextDep = link.nextDep;\n\t\tconst nextSub = link.nextSub;\n\t\tconst prevSub = link.prevSub;\n\t\tif (nextDep !== void 0) nextDep.prevDep = prevDep;\n\t\telse sub.depsTail = prevDep;\n\t\tif (prevDep !== void 0) prevDep.nextDep = nextDep;\n\t\telse sub.deps = nextDep;\n\t\tif (nextSub !== void 0) nextSub.prevSub = prevSub;\n\t\telse dep.subsTail = prevSub;\n\t\tif (prevSub !== void 0) prevSub.nextSub = nextSub;\n\t\telse if ((dep.subs = nextSub) === void 0) unwatched(dep);\n\t\treturn nextDep;\n\t}\n\tfunction propagate(link) {\n\t\tlet next = link.nextSub;\n\t\tlet stack;\n\t\ttop: do {\n\t\t\tconst sub = link.sub;\n\t\t\tlet flags = sub.flags;\n\t\t\tif (!(flags & 60)) sub.flags = flags | 32;\n\t\t\telse if (!(flags & (4 | 8))) flags = 0;\n\t\t\telse if (!(flags & 4)) sub.flags = flags & ~8 | 32;\n\t\t\telse if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (8 | 32);\n\t\t\t\tflags &= 1;\n\t\t\t} else flags = 0;\n\t\t\tif (flags & 2) notify(sub);\n\t\t\tif (flags & 1) {\n\t\t\t\tconst subSubs = sub.subs;\n\t\t\t\tif (subSubs !== void 0) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub;\n\t\t\t\t\tif (nextSub !== void 0) {\n\t\t\t\t\t\tstack = {\n\t\t\t\t\t\t\tvalue: next,\n\t\t\t\t\t\t\tprev: stack\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnext = nextSub;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((link = next) !== void 0) {\n\t\t\t\tnext = link.nextSub;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twhile (stack !== void 0) {\n\t\t\t\tlink = stack.value;\n\t\t\t\tstack = stack.prev;\n\t\t\t\tif (link !== void 0) {\n\t\t\t\t\tnext = link.nextSub;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t} while (true);\n\t}\n\tfunction checkDirty(link, sub) {\n\t\tlet stack;\n\t\tlet checkDepth = 0;\n\t\tlet dirty = false;\n\t\ttop: do {\n\t\t\tconst dep = link.dep;\n\t\t\tconst flags = dep.flags;\n\t\t\tif (sub.flags & 16) dirty = true;\n\t\t\telse if ((flags & (1 | 16)) === (1 | 16)) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs;\n\t\t\t\t\tif (subs.nextSub !== void 0) shallowPropagate(subs);\n\t\t\t\t\tdirty = true;\n\t\t\t\t}\n\t\t\t} else if ((flags & (1 | 32)) === (1 | 32)) {\n\t\t\t\tif (link.nextSub !== void 0 || link.prevSub !== void 0) stack = {\n\t\t\t\t\tvalue: link,\n\t\t\t\t\tprev: stack\n\t\t\t\t};\n\t\t\t\tlink = dep.deps;\n\t\t\t\tsub = dep;\n\t\t\t\t++checkDepth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs;\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== void 0;\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack.value;\n\t\t\t\t\tstack = stack.prev;\n\t\t\t\t} else link = firstSub;\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) shallowPropagate(firstSub);\n\t\t\t\t\t\tsub = link.sub;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false;\n\t\t\t\t} else sub.flags &= ~32;\n\t\t\t\tsub = link.sub;\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dirty;\n\t\t} while (true);\n\t}\n\tfunction shallowPropagate(link) {\n\t\tdo {\n\t\t\tconst sub = link.sub;\n\t\t\tconst flags = sub.flags;\n\t\t\tif ((flags & (32 | 16)) === 32) {\n\t\t\t\tsub.flags = flags | 16;\n\t\t\t\tif ((flags & (2 | 4)) === 2) notify(sub);\n\t\t\t}\n\t\t} while ((link = link.nextSub) !== void 0);\n\t}\n\tfunction isValidLink(checkLink, sub) {\n\t\tlet link = sub.depsTail;\n\t\twhile (link !== void 0) {\n\t\t\tif (link === checkLink) return true;\n\t\t\tlink = link.prevDep;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n//#endregion\nexport { createReactiveSystem };\n//# sourceMappingURL=alien.js.map","import { createReactiveSystem } from \"./alien.js\";\n\n//#region src/atom.ts\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n\tconst isObserver = typeof nextHandler === \"object\";\n\tconst self = isObserver ? nextHandler : void 0;\n\treturn {\n\t\tnext: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n\t\terror: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n\t\tcomplete: (isObserver ? nextHandler.complete : completionHandler)?.bind(self)\n\t};\n}\nconst queuedEffects = [];\nlet cycle = 0;\nconst { link, unlink, propagate, checkDirty, shallowPropagate } = /* @__PURE__ */ createReactiveSystem({\n\tupdate(atom) {\n\t\treturn atom._update();\n\t},\n\tnotify(effect) {\n\t\tqueuedEffects[queuedEffectsLength++] = effect;\n\t\teffect.flags &= ~2;\n\t},\n\tunwatched(atom) {\n\t\tif (atom.depsTail !== void 0) {\n\t\t\tatom.depsTail = void 0;\n\t\t\tatom.flags = 1 | 16;\n\t\t\tpurgeDeps(atom);\n\t\t}\n\t}\n});\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub;\nlet batchDepth = 0;\nfunction batch(fn) {\n\ttry {\n\t\t++batchDepth;\n\t\tfn();\n\t} finally {\n\t\tif (!--batchDepth) flush();\n\t}\n}\nfunction purgeDeps(sub) {\n\tconst depsTail = sub.depsTail;\n\tlet dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;\n\twhile (dep !== void 0) dep = unlink(dep, sub);\n}\nfunction flush() {\n\tif (batchDepth > 0) return;\n\twhile (notifyIndex < queuedEffectsLength) {\n\t\tconst effect = queuedEffects[notifyIndex];\n\t\tqueuedEffects[notifyIndex++] = void 0;\n\t\teffect.notify();\n\t}\n\tnotifyIndex = 0;\n\tqueuedEffectsLength = 0;\n}\nfunction createAsyncAtom(getValue, options) {\n\tconst ref = {};\n\tconst atom = createAtom(() => {\n\t\tgetValue().then((data) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"done\",\n\t\t\t\tdata\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn { status: \"pending\" };\n\t}, options);\n\tref.current = atom;\n\treturn atom;\n}\nfunction createAtom(valueOrFn, options) {\n\tconst isComputed = typeof valueOrFn === \"function\";\n\tconst getter = valueOrFn;\n\tconst atom = {\n\t\t_snapshot: isComputed ? void 0 : valueOrFn,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tflags: isComputed ? 0 : 1,\n\t\tget() {\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t},\n\t\tsubscribe(observerOrFn) {\n\t\t\tconst obs = toObserver(observerOrFn);\n\t\t\tconst observed = { current: false };\n\t\t\tconst e = effect(() => {\n\t\t\t\tatom.get();\n\t\t\t\tif (!observed.current) observed.current = true;\n\t\t\t\telse {\n\t\t\t\t\tactiveSub = void 0;\n\t\t\t\t\tobs.next?.(atom._snapshot);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn { unsubscribe: () => {\n\t\t\t\te.stop();\n\t\t\t} };\n\t\t},\n\t\t_update(getValue) {\n\t\t\tconst prevSub = activeSub;\n\t\t\tconst compare = options?.compare ?? Object.is;\n\t\t\tif (isComputed) {\n\t\t\t\tactiveSub = atom;\n\t\t\t\t++cycle;\n\t\t\t\tatom.depsTail = void 0;\n\t\t\t} else if (getValue === void 0) return false;\n\t\t\tif (isComputed) atom.flags = 1 | 4;\n\t\t\ttry {\n\t\t\t\tconst oldValue = atom._snapshot;\n\t\t\t\tconst newValue = typeof getValue === \"function\" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;\n\t\t\t\tif (oldValue === void 0 || !compare(oldValue, newValue)) {\n\t\t\t\t\tatom._snapshot = newValue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tactiveSub = prevSub;\n\t\t\t\tif (isComputed) atom.flags &= ~4;\n\t\t\t\tpurgeDeps(atom);\n\t\t\t}\n\t\t}\n\t};\n\tif (isComputed) {\n\t\tatom.flags = 1 | 16;\n\t\tatom.get = function() {\n\t\t\tconst flags = atom.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) {\n\t\t\t\tif (atom._update()) {\n\t\t\t\t\tconst subs = atom.subs;\n\t\t\t\t\tif (subs !== void 0) shallowPropagate(subs);\n\t\t\t\t}\n\t\t\t} else if (flags & 32) atom.flags = flags & ~32;\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t};\n\t} else atom.set = function(valueOrFn) {\n\t\tif (atom._update(valueOrFn)) {\n\t\t\tconst subs = atom.subs;\n\t\t\tif (subs !== void 0) {\n\t\t\t\tpropagate(subs);\n\t\t\t\tshallowPropagate(subs);\n\t\t\t\tflush();\n\t\t\t}\n\t\t}\n\t};\n\treturn atom;\n}\nfunction effect(fn) {\n\tconst run = () => {\n\t\tconst prevSub = activeSub;\n\t\tactiveSub = effectObj;\n\t\t++cycle;\n\t\teffectObj.depsTail = void 0;\n\t\teffectObj.flags = 2 | 4;\n\t\ttry {\n\t\t\treturn fn();\n\t\t} finally {\n\t\t\tactiveSub = prevSub;\n\t\t\teffectObj.flags &= ~4;\n\t\t\tpurgeDeps(effectObj);\n\t\t}\n\t};\n\tconst effectObj = {\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tflags: 2 | 4,\n\t\tnotify() {\n\t\t\tconst flags = this.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run();\n\t\t\telse this.flags = 2;\n\t\t},\n\t\tstop() {\n\t\t\tthis.flags = 0;\n\t\t\tthis.depsTail = void 0;\n\t\t\tpurgeDeps(this);\n\t\t}\n\t};\n\trun();\n\treturn effectObj;\n}\n\n//#endregion\nexport { batch, createAsyncAtom, createAtom, flush, toObserver };\n//# sourceMappingURL=atom.js.map","import { createNonReactiveMutableStore, createNonReactiveReadonlyStore } from \"@tanstack/router-core\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\nimport { batch, createAtom } from \"@tanstack/react-store\";\n//#region src/routerStores.ts\nvar getStoreFactory = (opts) => {\n\tif (isServer ?? opts.isServer) return {\n\t\tcreateMutableStore: createNonReactiveMutableStore,\n\t\tcreateReadonlyStore: createNonReactiveReadonlyStore,\n\t\tbatch: (fn) => fn()\n\t};\n\treturn {\n\t\tcreateMutableStore: createAtom,\n\t\tcreateReadonlyStore: createAtom,\n\t\tbatch\n\t};\n};\n//#endregion\nexport { getStoreFactory };\n\n//# sourceMappingURL=routerStores.js.map","import { getStoreFactory } from \"./routerStores.js\";\nimport { RouterCore } from \"@tanstack/router-core\";\n//#region src/router.ts\n/**\n* Creates a new Router instance for React.\n*\n* Pass the returned router to `RouterProvider` to enable routing.\n* Notable options: `routeTree` (your route definitions) and `context`\n* (required if the root route was created with `createRootRouteWithContext`).\n*\n* @param options Router options used to configure the router.\n* @returns A Router instance to be provided to `RouterProvider`.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/createRouterFunction\n*/\nvar createRouter = (options) => {\n\treturn new Router(options);\n};\nvar Router = class extends RouterCore {\n\tconstructor(options) {\n\t\tsuper(options, getStoreFactory);\n\t}\n};\n//#endregion\nexport { Router, createRouter };\n\n//# sourceMappingURL=router.js.map","\"use client\";\nimport { useHydrated } from \"./ClientOnly.js\";\nimport { useRouter } from \"./useRouter.js\";\nimport * as React$1 from \"react\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/Asset.tsx\nvar INLINE_CSS_HYDRATION_ATTR = \"data-tsr-inline-css\";\nvar noopScriptHandler = () => {};\nfunction setScriptAttrs(script, attrs) {\n\tif (!attrs) return;\n\tfor (const [key, value] of Object.entries(attrs)) if (key !== \"suppressHydrationWarning\" && value !== void 0 && value !== false) script.setAttribute(key, typeof value === \"boolean\" ? \"\" : String(value));\n}\nfunction Asset(asset) {\n\tconst { attrs, children, nonce, preventScriptHoist } = asset;\n\tconst innerHTML = React$1.useMemo(() => children === void 0 ? void 0 : { __html: children }, [children]);\n\tswitch (asset.tag) {\n\t\tcase \"title\": return /* @__PURE__ */ jsx(\"title\", {\n\t\t\t...attrs,\n\t\t\tsuppressHydrationWarning: true,\n\t\t\tchildren\n\t\t});\n\t\tcase \"meta\": return /* @__PURE__ */ jsx(\"meta\", {\n\t\t\t...attrs,\n\t\t\tsuppressHydrationWarning: true\n\t\t});\n\t\tcase \"link\": return /* @__PURE__ */ jsx(\"link\", {\n\t\t\t...attrs,\n\t\t\tprecedence: attrs?.precedence ?? (attrs?.rel === \"stylesheet\" ? \"default\" : void 0),\n\t\t\tnonce,\n\t\t\tsuppressHydrationWarning: true\n\t\t});\n\t\tcase \"style\":\n\t\t\tif (asset.inlineCss && (process.env.TSS_INLINE_CSS_ENABLED === \"true\" || process.env.TSS_INLINE_CSS_ENABLED === void 0 && isServer)) return /* @__PURE__ */ jsx(InlineCssStyle, {\n\t\t\t\tattrs,\n\t\t\t\tnonce,\n\t\t\t\tchildren\n\t\t\t});\n\t\t\treturn /* @__PURE__ */ jsx(\"style\", {\n\t\t\t\t...attrs,\n\t\t\t\tdangerouslySetInnerHTML: innerHTML,\n\t\t\t\tnonce\n\t\t\t});\n\t\tcase \"script\": return /* @__PURE__ */ jsx(Script, {\n\t\t\tattrs,\n\t\t\tpreventScriptHoist,\n\t\t\tchildren\n\t\t});\n\t\tdefault: return null;\n\t}\n}\nfunction InlineCssStyle({ attrs, children, nonce }) {\n\tconst isInlineCssPlaceholder = children === void 0;\n\tconst [hydratedInlineCss] = React$1.useState(() => {\n\t\tif (!isInlineCssPlaceholder || typeof document === \"undefined\") return;\n\t\treturn document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? void 0;\n\t});\n\tconst html = isInlineCssPlaceholder ? hydratedInlineCss ?? \"\" : children ?? \"\";\n\tconst innerHTML = React$1.useMemo(() => ({ __html: html }), [html]);\n\treturn /* @__PURE__ */ jsx(\"style\", {\n\t\t...attrs,\n\t\t[INLINE_CSS_HYDRATION_ATTR]: \"\",\n\t\tdangerouslySetInnerHTML: innerHTML,\n\t\tnonce,\n\t\tsuppressHydrationWarning: true\n\t});\n}\nfunction Script({ attrs, children, preventScriptHoist }) {\n\tconst router = useRouter();\n\tconst hydrated = useHydrated();\n\tconst innerHTML = React$1.useMemo(() => children === void 0 ? void 0 : { __html: children }, [children]);\n\tconst dataScript = typeof attrs?.type === \"string\" && attrs.type !== \"\" && attrs.type !== \"text/javascript\" && attrs.type !== \"module\";\n\tif (process.env.NODE_ENV !== \"production\" && attrs?.src && typeof children === \"string\" && children.trim().length) console.warn(\"[TanStack Router] <Script> received both `src` and `children`. The `children` content will be ignored. Remove `children` or remove `src`.\");\n\tReact$1.useEffect(() => {\n\t\tif (dataScript) return;\n\t\tif (attrs?.src) {\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = attrs.src;\n\t\t\tconst normSrc = link.href;\n\t\t\tfor (const el of document.scripts) if (el.src === normSrc) return;\n\t\t\tconst script = document.createElement(\"script\");\n\t\t\tsetScriptAttrs(script, attrs);\n\t\t\tdocument.head.appendChild(script);\n\t\t\treturn () => script.remove();\n\t\t}\n\t\tif (typeof children === \"string\") {\n\t\t\tconst typeAttr = typeof attrs?.type === \"string\" ? attrs.type : \"text/javascript\";\n\t\t\tconst nonceAttr = typeof attrs?.nonce === \"string\" ? attrs.nonce : void 0;\n\t\t\tfor (const el of document.scripts) {\n\t\t\t\tif (el.hasAttribute(\"src\")) continue;\n\t\t\t\tconst sType = el.getAttribute(\"type\") ?? \"text/javascript\";\n\t\t\t\tconst sNonce = el.getAttribute(\"nonce\") ?? void 0;\n\t\t\t\tif (el.textContent === children && sType === typeAttr && sNonce === nonceAttr) return;\n\t\t\t}\n\t\t\tconst script = document.createElement(\"script\");\n\t\t\tscript.textContent = children;\n\t\t\tsetScriptAttrs(script, attrs);\n\t\t\tdocument.head.appendChild(script);\n\t\t\treturn () => script.remove();\n\t\t}\n\t}, [\n\t\tattrs,\n\t\tchildren,\n\t\tdataScript\n\t]);\n\tif (isServer ?? router.isServer) {\n\t\tif (attrs?.src) {\n\t\t\tif (!preventScriptHoist) return /* @__PURE__ */ jsx(\"script\", {\n\t\t\t\t...attrs,\n\t\t\t\tsuppressHydrationWarning: true\n\t\t\t});\n\t\t\treturn /* @__PURE__ */ jsx(\"script\", {\n\t\t\t\t...attrs,\n\t\t\t\tonLoad: noopScriptHandler,\n\t\t\t\tsuppressHydrationWarning: true\n\t\t\t});\n\t\t}\n\t\tif (typeof children === \"string\") return /* @__PURE__ */ jsx(\"script\", {\n\t\t\t...attrs,\n\t\t\tdangerouslySetInnerHTML: innerHTML,\n\t\t\tsuppressHydrationWarning: true\n\t\t});\n\t\treturn null;\n\t}\n\tif (dataScript && typeof children === \"string\") return /* @__PURE__ */ jsx(\"script\", {\n\t\t...attrs,\n\t\tsuppressHydrationWarning: true,\n\t\tdangerouslySetInnerHTML: innerHTML\n\t});\n\tif (!hydrated) {\n\t\tif (attrs?.src) return /* @__PURE__ */ jsx(\"script\", {\n\t\t\t...attrs,\n\t\t\tsuppressHydrationWarning: true\n\t\t});\n\t\tif (typeof children === \"string\") return /* @__PURE__ */ jsx(\"script\", {\n\t\t\t...attrs,\n\t\t\tdangerouslySetInnerHTML: innerHTML,\n\t\t\tsuppressHydrationWarning: true\n\t\t});\n\t}\n\treturn null;\n}\n//#endregion\nexport { Asset };\n\n//# sourceMappingURL=Asset.js.map","import { useRouter } from \"./useRouter.js\";\nimport { _getAssetMatches, appendUniqueUserTags, deepEqual, escapeHtml, getAssetCrossOrigin, getScriptPreloadAttrs, resolveManifestCssLink } from \"@tanstack/router-core\";\nimport * as React$1 from \"react\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\nimport { useSelector } from \"@tanstack/react-store\";\n//#region src/headContentUtils.tsx\nfunction buildTagsFromMatches(router, nonce, matches, assetCrossOrigin) {\n\tmatches = _getAssetMatches(matches);\n\tconst routeMeta = matches.map((match) => match.meta).filter((meta) => meta !== void 0);\n\tconst resultMeta = [];\n\tconst metaByAttribute = {};\n\tlet title;\n\tfor (let i = routeMeta.length - 1; i >= 0; i--) {\n\t\tconst metas = routeMeta[i];\n\t\tfor (let j = metas.length - 1; j >= 0; j--) {\n\t\t\tconst m = metas[j];\n\t\t\tif (!m) continue;\n\t\t\tif (m.title) {\n\t\t\t\tif (!title) title = {\n\t\t\t\t\ttag: \"title\",\n\t\t\t\t\tchildren: m.title\n\t\t\t\t};\n\t\t\t} else if (\"script:ld+json\" in m) try {\n\t\t\t\tconst json = JSON.stringify(m[\"script:ld+json\"]);\n\t\t\t\tresultMeta.push({\n\t\t\t\t\ttag: \"script\",\n\t\t\t\t\tattrs: { type: \"application/ld+json\" },\n\t\t\t\t\tchildren: escapeHtml(json)\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\telse {\n\t\t\t\tconst attribute = m.name ?? m.property;\n\t\t\t\tif (attribute) if (metaByAttribute[attribute]) continue;\n\t\t\t\telse metaByAttribute[attribute] = true;\n\t\t\t\tresultMeta.push({\n\t\t\t\t\ttag: \"meta\",\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\t...m,\n\t\t\t\t\t\tnonce\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tif (title) resultMeta.push(title);\n\tif (nonce) resultMeta.push({\n\t\ttag: \"meta\",\n\t\tattrs: {\n\t\t\tproperty: \"csp-nonce\",\n\t\t\tcontent: nonce\n\t\t}\n\t});\n\tresultMeta.reverse();\n\tconst constructedLinks = matches.flatMap((match) => match.links ?? []).filter((link) => link !== void 0).map((link) => ({\n\t\ttag: \"link\",\n\t\tattrs: {\n\t\t\t...link,\n\t\t\tnonce\n\t\t}\n\t}));\n\tconst manifest = router.ssr?.manifest;\n\tconst manifestCssTags = [];\n\tif (manifest) {\n\t\tmatches.forEach((match) => {\n\t\t\t(manifest.routes[match.routeId]?.css)?.forEach((link) => {\n\t\t\t\tconst resolvedLink = resolveManifestCssLink(link);\n\t\t\t\tmanifestCssTags.push({\n\t\t\t\t\ttag: \"link\",\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\trel: \"stylesheet\",\n\t\t\t\t\t\t...resolvedLink,\n\t\t\t\t\t\tcrossOrigin: getAssetCrossOrigin(assetCrossOrigin, \"stylesheet\") ?? resolvedLink.crossOrigin,\n\t\t\t\t\t\tsuppressHydrationWarning: true,\n\t\t\t\t\t\tnonce\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\tif (manifest.inlineStyle) manifestCssTags.push({\n\t\t\ttag: \"style\",\n\t\t\tattrs: {\n\t\t\t\t...manifest.inlineStyle.attrs,\n\t\t\t\tnonce\n\t\t\t},\n\t\t\tchildren: manifest.inlineStyle.children,\n\t\t\tinlineCss: true\n\t\t});\n\t}\n\tconst preloadLinks = [];\n\tif (manifest) matches.forEach((match) => {\n\t\tmanifest.routes[match.routeId]?.preloads?.forEach((preload) => {\n\t\t\tpreloadLinks.push({\n\t\t\t\ttag: \"link\",\n\t\t\t\tattrs: {\n\t\t\t\t\t...getScriptPreloadAttrs(manifest, preload, assetCrossOrigin),\n\t\t\t\t\tnonce\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\tconst styles = matches.flatMap((match) => match.styles ?? []).filter((style) => style !== void 0).map(({ children, ...attrs }) => ({\n\t\ttag: \"style\",\n\t\tattrs: {\n\t\t\t...attrs,\n\t\t\tnonce\n\t\t},\n\t\tchildren\n\t}));\n\tconst headScripts = matches.flatMap((match) => match.headScripts ?? []).filter((script) => script !== void 0).map(({ children, ...script }) => ({\n\t\ttag: \"script\",\n\t\tattrs: {\n\t\t\t...script,\n\t\t\tnonce\n\t\t},\n\t\tchildren\n\t}));\n\tconst tags = [];\n\tappendUniqueUserTags(tags, resultMeta);\n\ttags.push(...preloadLinks);\n\tappendUniqueUserTags(tags, constructedLinks);\n\ttags.push(...manifestCssTags);\n\tappendUniqueUserTags(tags, styles);\n\tappendUniqueUserTags(tags, headScripts);\n\treturn tags;\n}\n/**\n* Build the head/link/meta/script tags from the renderable presented prefix.\n* Used internally by `HeadContent`.\n*/\nvar useTags = (assetCrossOrigin) => {\n\tconst router = useRouter();\n\tconst nonce = router.options.ssr?.nonce;\n\tif (isServer ?? router.isServer) return buildTagsFromMatches(router, nonce, router.stores.matches.get(), assetCrossOrigin);\n\tconst selectTags = React$1.useCallback((matches) => buildTagsFromMatches(router, nonce, matches, assetCrossOrigin), [\n\t\tassetCrossOrigin,\n\t\tnonce,\n\t\trouter\n\t]);\n\treturn useSelector(router.stores.matches, selectTags, { compare: deepEqual });\n};\n//#endregion\nexport { useTags };\n\n//# sourceMappingURL=headContentUtils.js.map","\"use client\";\nimport { useRouter } from \"./useRouter.js\";\nimport { Asset } from \"./Asset.js\";\nimport { useTags } from \"./headContentUtils.js\";\nimport { createElement } from \"react\";\nimport { Fragment, jsx } from \"react/jsx-runtime\";\n//#region src/HeadContent.tsx\n/**\n* Render route-managed head tags (title, meta, links, styles, head scripts).\n* Place inside the document head of your app shell.\n* @link https://tanstack.com/router/latest/docs/framework/react/guide/document-head-management\n*/\nfunction HeadContent(props) {\n\tconst tags = useTags(props.assetCrossOrigin);\n\tconst nonce = useRouter().options.ssr?.nonce;\n\treturn /* @__PURE__ */ jsx(Fragment, { children: tags.map((tag) => /* @__PURE__ */ createElement(Asset, {\n\t\t...tag,\n\t\tkey: `tsr-meta-${JSON.stringify(tag)}`,\n\t\tnonce\n\t})) });\n}\n//#endregion\nexport { HeadContent };\n\n//# sourceMappingURL=HeadContent.js.map","import { useRouter } from \"./useRouter.js\";\nimport { Asset } from \"./Asset.js\";\nimport { composeSsrBodyScripts, deepEqual, getSsrBodyScriptParts } from \"@tanstack/router-core\";\nimport { createElement } from \"react\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\nimport { Fragment, jsx } from \"react/jsx-runtime\";\nimport { useSelector } from \"@tanstack/react-store\";\n//#region src/Scripts.tsx\nvar routeScriptAttrs = { suppressHydrationWarning: true };\n/**\n* Render body script tags collected from route matches and SSR manifests.\n* During streaming SSR, `<Scripts>` marks where late hydration scripts may\n* begin to be inserted.\n*/\nvar Scripts = () => {\n\tconst router = useRouter();\n\tconst nonce = router.options.ssr?.nonce;\n\tconst getParts = (matches) => {\n\t\tconst parts = getSsrBodyScriptParts(matches, router.ssr?.manifest, nonce, routeScriptAttrs);\n\t\tfor (const script of parts[1]) if (typeof script.attrs?.src === \"string\") {\n\t\t\tconst scriptWithHoist = script;\n\t\t\tscriptWithHoist.preventScriptHoist = true;\n\t\t}\n\t\treturn parts;\n\t};\n\tconst getScripts = (matches) => {\n\t\treturn composeSsrBodyScripts(getParts(matches));\n\t};\n\tif (isServer ?? router.isServer) return renderScripts(composeSsrBodyScripts(getParts(router.stores.matches.get()), router.serverSsr?.takeInitialHydrationScriptTags()));\n\treturn renderScripts(useSelector(router.stores.matches, getScripts, { compare: deepEqual }));\n};\nfunction renderScripts(scripts) {\n\treturn /* @__PURE__ */ jsx(Fragment, { children: scripts.map((asset, i) => /* @__PURE__ */ createElement(Asset, {\n\t\t...asset,\n\t\tkey: `tsr-scripts-${asset.tag}-${i}`\n\t})) });\n}\n//#endregion\nexport { Scripts };\n\n//# sourceMappingURL=Scripts.js.map","import { matchMutation, noop } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Mutation } from \"./mutation.js\";\n//#region src/mutationCache.ts\n/**\n* The `MutationCache` is the storage for mutations.\n*\n* Normally, you will not interact with the `MutationCache` directly and instead use a\n* `QueryClient`. You can subscribe to it (inherited from `Subscribable`) to be informed of\n* safe/known updates to the cache, such as mutations being added, removed, or updated.\n*\n* @example\n* ```ts\n* const unsubscribe = mutationCache.subscribe((event) => {\n* console.log(event.type, event.mutation)\n* })\n* ```\n*/\nvar MutationCache = class extends Subscribable {\n\t#mutations;\n\t#scopes;\n\t#mutationId;\n\tconstructor(config = {}) {\n\t\tsuper();\n\t\tthis.config = config;\n\t\tthis.#mutations = /* @__PURE__ */ new Set();\n\t\tthis.#scopes = /* @__PURE__ */ new Map();\n\t\tthis.#mutationId = 0;\n\t}\n\t/** @internal */\n\tbuild(client, options, state) {\n\t\tconst mutation = new Mutation({\n\t\t\tclient,\n\t\t\tmutationCache: this,\n\t\t\tmutationId: ++this.#mutationId,\n\t\t\toptions: client.defaultMutationOptions(options),\n\t\t\tstate\n\t\t});\n\t\tthis.add(mutation);\n\t\treturn mutation;\n\t}\n\t/** @internal */\n\tadd(mutation) {\n\t\tthis.#mutations.add(mutation);\n\t\tconst scope = scopeFor(mutation);\n\t\tif (typeof scope === \"string\") {\n\t\t\tconst scopedMutations = this.#scopes.get(scope);\n\t\t\tif (scopedMutations) scopedMutations.push(mutation);\n\t\t\telse this.#scopes.set(scope, [mutation]);\n\t\t}\n\t\tthis.notify({\n\t\t\ttype: \"added\",\n\t\t\tmutation\n\t\t});\n\t}\n\t/** @internal */\n\tremove(mutation) {\n\t\tif (this.#mutations.delete(mutation)) {\n\t\t\tconst scope = scopeFor(mutation);\n\t\t\tif (typeof scope === \"string\") {\n\t\t\t\tconst scopedMutations = this.#scopes.get(scope);\n\t\t\t\tif (scopedMutations) {\n\t\t\t\t\tif (scopedMutations.length > 1) {\n\t\t\t\t\t\tconst index = scopedMutations.indexOf(mutation);\n\t\t\t\t\t\tif (index !== -1) scopedMutations.splice(index, 1);\n\t\t\t\t\t} else if (scopedMutations[0] === mutation) this.#scopes.delete(scope);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.notify({\n\t\t\ttype: \"removed\",\n\t\t\tmutation\n\t\t});\n\t}\n\t/** @internal */\n\tcanRun(mutation) {\n\t\tconst scope = scopeFor(mutation);\n\t\tif (typeof scope === \"string\") {\n\t\t\tconst firstPendingMutation = this.#scopes.get(scope)?.find((m) => m.state.status === \"pending\");\n\t\t\treturn !firstPendingMutation || firstPendingMutation === mutation;\n\t\t} else return true;\n\t}\n\t/** @internal */\n\trunNext(mutation) {\n\t\tconst scope = scopeFor(mutation);\n\t\tif (typeof scope === \"string\") return (this.#scopes.get(scope)?.find((m) => m !== mutation && m.state.isPaused))?.continue() ?? Promise.resolve();\n\t\telse return Promise.resolve();\n\t}\n\t/**\n\t* Removes all mutations from the cache.\n\t*\n\t* @example\n\t* ```ts\n\t* const mutationCache = queryClient.getMutationCache()\n\t*\n\t* mutationCache.clear()\n\t* ```\n\t*/\n\tclear() {\n\t\tnotifyManager.batch(() => {\n\t\t\tthis.#mutations.forEach((mutation) => {\n\t\t\t\tthis.notify({\n\t\t\t\t\ttype: \"removed\",\n\t\t\t\t\tmutation\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis.#mutations.clear();\n\t\t\tthis.#scopes.clear();\n\t\t});\n\t}\n\t/**\n\t* Returns all mutations within the cache.\n\t*\n\t* This is not typically needed for most applications, but can come in handy when needing more\n\t* information about a mutation in rare scenarios.\n\t*\n\t* @example\n\t* ```ts\n\t* const mutationCache = queryClient.getMutationCache()\n\t*\n\t* const mutations = mutationCache.getAll()\n\t* ```\n\t*/\n\tgetAll() {\n\t\treturn Array.from(this.#mutations);\n\t}\n\t/**\n\t* A slightly more advanced method that can be used to get an existing mutation instance from\n\t* the cache. If the mutation does not exist, `undefined` is returned.\n\t*\n\t* This is not typically needed for most applications, but can come in handy when needing more\n\t* information about a mutation in rare scenarios.\n\t*\n\t* @see {@link MutationCache#findAll}\n\t* @example\n\t* ```ts\n\t* const mutationCache = queryClient.getMutationCache()\n\t*\n\t* const mutation = mutationCache.find({ mutationKey: ['addPost'] })\n\t* ```\n\t*/\n\tfind(filters) {\n\t\tconst defaultedFilters = {\n\t\t\texact: true,\n\t\t\t...filters\n\t\t};\n\t\treturn this.getAll().find((mutation) => matchMutation(defaultedFilters, mutation));\n\t}\n\t/**\n\t* An even more advanced method that can be used to get existing mutation instances from the\n\t* cache that match the given filters. If no mutations match, an empty array is returned.\n\t*\n\t* This is not typically needed for most applications, but can come in handy when needing more\n\t* information about mutations in rare scenarios.\n\t*\n\t* @see {@link MutationCache#find}\n\t* @example\n\t* ```ts\n\t* const mutationCache = queryClient.getMutationCache()\n\t*\n\t* const mutations = mutationCache.findAll({ mutationKey: ['addPost'] })\n\t* ```\n\t*/\n\tfindAll(filters = {}) {\n\t\treturn this.getAll().filter((mutation) => matchMutation(filters, mutation));\n\t}\n\t/** @internal */\n\tnotify(event) {\n\t\tnotifyManager.batch(() => {\n\t\t\tthis.listeners.forEach((listener) => {\n\t\t\t\tlistener(event);\n\t\t\t});\n\t\t});\n\t}\n\t/** @internal */\n\tresumePausedMutations() {\n\t\tconst pausedMutations = this.getAll().filter((x) => x.state.isPaused);\n\t\treturn notifyManager.batch(() => Promise.all(pausedMutations.map((mutation) => mutation.continue().catch(noop))));\n\t}\n};\nfunction scopeFor(mutation) {\n\treturn mutation.options.scope?.id;\n}\n//#endregion\nexport { MutationCache };\n\n//# sourceMappingURL=mutationCache.js.map","import { hashQueryKeyByOptions, matchQuery } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Query } from \"./query.js\";\n//#region src/queryCache.ts\n/**\n* The `QueryCache` is the storage mechanism for TanStack Query. It stores all the data, meta\n* information, and state of the queries it contains.\n*\n* Normally, you will not interact with the `QueryCache` directly and instead use a `QueryClient`\n* for a specific cache. You can subscribe to it (inherited from `Subscribable`) to be informed of\n* safe/known updates to the cache, such as queries being added, removed, or updated — updates made\n* outside of the cache's own tracked mechanisms (e.g. mutating a query's state object directly) do\n* not notify subscribers.\n*\n* @example\n* ```ts\n* const unsubscribe = queryCache.subscribe((event) => {\n* console.log(event.type, event.query)\n* })\n* ```\n*/\nvar QueryCache = class extends Subscribable {\n\t#queries;\n\tconstructor(config = {}) {\n\t\tsuper();\n\t\tthis.config = config;\n\t\tthis.#queries = /* @__PURE__ */ new Map();\n\t}\n\t/**\n\t* Returns the existing `Query` instance for the given options' `queryKey`/`queryHash`, or\n\t* builds and adds a new one to the cache if none exists yet. Used by framework adapters and\n\t* plugins (e.g. broadcast/persistence) that need to get-or-create a `Query` directly, bypassing\n\t* the reactive `QueryObserver` machinery.\n\t*\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t*\n\t* const query = queryCache.build(queryClient, {\n\t* queryKey: ['posts'],\n\t* queryFn: fetchPosts,\n\t* })\n\t* ```\n\t*/\n\tbuild(client, options, state) {\n\t\tconst queryKey = options.queryKey;\n\t\tconst queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);\n\t\tlet query = this.get(queryHash);\n\t\tif (!query) {\n\t\t\tquery = new Query({\n\t\t\t\tclient,\n\t\t\t\tqueryKey,\n\t\t\t\tqueryHash,\n\t\t\t\toptions: client.defaultQueryOptions(options),\n\t\t\t\tstate,\n\t\t\t\tdefaultOptions: client.getQueryDefaults(queryKey)\n\t\t\t});\n\t\t\tthis.add(query);\n\t\t}\n\t\treturn query;\n\t}\n\t/** @internal */\n\tadd(query) {\n\t\tif (!this.#queries.has(query.queryHash)) {\n\t\t\tthis.#queries.set(query.queryHash, query);\n\t\t\tthis.notify({\n\t\t\t\ttype: \"added\",\n\t\t\t\tquery\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Destroys the given `Query` and removes it from the cache, notifying subscribers with a\n\t* `'removed'` event. A no-op if the query is no longer the one currently stored under its hash\n\t* (e.g. it was already replaced). Used by plugins (e.g. the broadcast client) that mirror\n\t* removals across `QueryCache` instances.\n\t*\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t* const query = queryCache.find({ queryKey: ['posts'] })\n\t*\n\t* if (query) {\n\t* queryCache.remove(query)\n\t* }\n\t* ```\n\t*/\n\tremove(query) {\n\t\tif (this.#queries.get(query.queryHash) === query) {\n\t\t\tquery.destroy();\n\t\t\tthis.#queries.delete(query.queryHash);\n\t\t\tthis.notify({\n\t\t\t\ttype: \"removed\",\n\t\t\t\tquery\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Removes all queries from the cache.\n\t*\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t*\n\t* queryCache.clear()\n\t* ```\n\t*/\n\tclear() {\n\t\tnotifyManager.batch(() => {\n\t\t\tthis.getAll().forEach((query) => {\n\t\t\t\tthis.remove(query);\n\t\t\t});\n\t\t});\n\t}\n\t/**\n\t* Returns the `Query` instance stored under the given `queryHash`, or `undefined` if none\n\t* exists. Unlike {@link QueryCache#find}, this looks up by the already-computed hash rather\n\t* than by `QueryFilters`. Used by plugins (e.g. broadcast/hydration) that already have a hash\n\t* to look up directly.\n\t*\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t* const queryHash = hashKey(['posts'])\n\t*\n\t* const query = queryCache.get(queryHash)\n\t* ```\n\t*/\n\tget(queryHash) {\n\t\treturn this.#queries.get(queryHash);\n\t}\n\t/**\n\t* Returns all queries within the cache.\n\t*\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t*\n\t* const queries = queryCache.getAll()\n\t* ```\n\t*/\n\tgetAll() {\n\t\treturn [...this.#queries.values()];\n\t}\n\t/**\n\t* A slightly more advanced method that can be used to get an existing query instance from the\n\t* cache. This instance not only contains all the state for the query, but all of the instances,\n\t* and underlying guts of the query as well. If the query does not exist, `undefined` is\n\t* returned.\n\t*\n\t* This is not typically needed for most applications, but can come in handy when needing more\n\t* information about a query in rare scenarios (e.g. looking at `query.state.dataUpdatedAt` to\n\t* decide whether a query is fresh enough to be used as an initial value).\n\t*\n\t* @see {@link QueryCache#findAll}\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t*\n\t* const query = queryCache.find({ queryKey: ['posts'] })\n\t* ```\n\t*/\n\tfind(filters) {\n\t\tconst defaultedFilters = {\n\t\t\texact: true,\n\t\t\t...filters\n\t\t};\n\t\treturn this.getAll().find((query) => matchQuery(defaultedFilters, query));\n\t}\n\t/**\n\t* An even more advanced method that can be used to get existing query instances from the cache\n\t* that partially match a query key. If no queries match, an empty array is returned.\n\t*\n\t* This is not typically needed for most applications, but can come in handy when needing more\n\t* information about queries in rare scenarios.\n\t*\n\t* @see {@link QueryCache#find}\n\t* @example\n\t* ```ts\n\t* const queryCache = queryClient.getQueryCache()\n\t*\n\t* const queries = queryCache.findAll({ queryKey: ['posts'] })\n\t* ```\n\t*/\n\tfindAll(filters = {}) {\n\t\tconst queries = this.getAll();\n\t\treturn Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;\n\t}\n\t/** @internal */\n\tnotify(event) {\n\t\tnotifyManager.batch(() => {\n\t\t\tthis.listeners.forEach((listener) => {\n\t\t\t\tlistener(event);\n\t\t\t});\n\t\t});\n\t}\n\t/** @internal */\n\tonFocus() {\n\t\tnotifyManager.batch(() => {\n\t\t\tthis.getAll().forEach((query) => {\n\t\t\t\tquery.onFocus();\n\t\t\t});\n\t\t});\n\t}\n\t/** @internal */\n\tonOnline() {\n\t\tnotifyManager.batch(() => {\n\t\t\tthis.getAll().forEach((query) => {\n\t\t\t\tquery.onOnline();\n\t\t\t});\n\t\t});\n\t}\n};\n//#endregion\nexport { QueryCache };\n\n//# sourceMappingURL=queryCache.js.map","import { functionalUpdate, hashKey, hashQueryKeyByOptions, noop, partialMatchKey, resolveQueryValue, skipToken } from \"./utils.js\";\nimport { focusManager } from \"./focusManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { MutationCache } from \"./mutationCache.js\";\nimport { QueryCache } from \"./queryCache.js\";\n//#region src/queryClient.ts\n/**\n* `QueryClient` is used to interact with a cache of queries and mutations. It owns a\n* `QueryCache` and a `MutationCache` (creating default ones if none are passed in) and holds\n* the default options that are applied to queries and mutations created through it.\n*\n* @example\n* ```ts\n* const queryClient = new QueryClient({\n* defaultOptions: {\n* queries: {\n* staleTime: Infinity,\n* },\n* },\n* })\n*\n* await queryClient.query({ queryKey: ['posts'], queryFn: fetchPosts })\n* ```\n*/\nvar QueryClient = class {\n\t#queryCache;\n\t#mutationCache;\n\t#defaultOptions;\n\t#queryDefaults;\n\t#mutationDefaults;\n\t#mountCount;\n\t#unsubscribeFocus;\n\t#unsubscribeOnline;\n\tconstructor(config = {}) {\n\t\tthis.#queryCache = config.queryCache || new QueryCache();\n\t\tthis.#mutationCache = config.mutationCache || new MutationCache();\n\t\tthis.#defaultOptions = config.defaultOptions || {};\n\t\tthis.#queryDefaults = /* @__PURE__ */ new Map();\n\t\tthis.#mutationDefaults = /* @__PURE__ */ new Map();\n\t\tthis.#mountCount = 0;\n\t}\n\t/**\n\t* Called by a framework adapter's `QueryClientProvider`-equivalent when it mounts, to start\n\t* listening for focus/online events and resume paused mutations. Ref-counted via an internal\n\t* mount count, so nested or multiple providers sharing the same `QueryClient` don't tear down\n\t* the shared listeners until the last one unmounts.\n\t*/\n\tmount() {\n\t\tthis.#mountCount++;\n\t\tif (this.#mountCount !== 1) return;\n\t\tthis.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n\t\t\tif (focused) {\n\t\t\t\tawait this.resumePausedMutations();\n\t\t\t\tthis.#queryCache.onFocus();\n\t\t\t}\n\t\t});\n\t\tthis.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n\t\t\tif (online) {\n\t\t\t\tawait this.resumePausedMutations();\n\t\t\t\tthis.#queryCache.onOnline();\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* The inverse of {@link QueryClient#mount} — called by a framework adapter's\n\t* `QueryClientProvider`-equivalent when it unmounts. Only tears down the focus/online\n\t* listeners once the mount count returns to `0`.\n\t*/\n\tunmount() {\n\t\tthis.#mountCount--;\n\t\tif (this.#mountCount !== 0) return;\n\t\tthis.#unsubscribeFocus?.();\n\t\tthis.#unsubscribeFocus = void 0;\n\t\tthis.#unsubscribeOnline?.();\n\t\tthis.#unsubscribeOnline = void 0;\n\t}\n\t/**\n\t* Returns the number of queries in the cache that are currently fetching, optionally\n\t* matching a set of filters. This includes background-fetching, loading new pages, and\n\t* loading more infinite query results.\n\t*\n\t* @example\n\t* ```ts\n\t* if (queryClient.isFetching()) {\n\t* console.log('At least one query is fetching!')\n\t* }\n\t* ```\n\t*/\n\tisFetching(filters) {\n\t\treturn this.#queryCache.findAll({\n\t\t\t...filters,\n\t\t\tfetchStatus: \"fetching\"\n\t\t}).length;\n\t}\n\t/**\n\t* Returns the number of mutations in the cache that are currently pending, optionally\n\t* matching a set of filters.\n\t*\n\t* @example\n\t* ```ts\n\t* if (queryClient.isMutating()) {\n\t* console.log('At least one mutation is pending!')\n\t* }\n\t* ```\n\t*/\n\tisMutating(filters) {\n\t\treturn this.#mutationCache.findAll({\n\t\t\t...filters,\n\t\t\tstatus: \"pending\"\n\t\t}).length;\n\t}\n\t/**\n\t* Imperative (non-reactive) way to retrieve data for a QueryKey.\n\t* Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n\t*\n\t* Hint: Do not use this function inside a component, because it won't receive updates.\n\t* Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n\t*\n\t* @returns The cached data for the query, or `undefined` if no query with this key has been observed yet.\n\t* @see {@link QueryClient#getQueriesData}\n\t*/\n\tgetQueryData(queryKey) {\n\t\tconst options = this.defaultQueryOptions({ queryKey });\n\t\treturn this.#queryCache.get(options.queryHash)?.state.data;\n\t}\n\t/**\n\t* @deprecated Use queryClient.query({ ...options, staleTime: 'static' }) instead. This method will be removed in the next major version.\n\t*/\n\tensureQueryData(options) {\n\t\tconst defaultedOptions = this.defaultQueryOptions(options);\n\t\tconst query = this.#queryCache.build(this, defaultedOptions);\n\t\tconst cachedData = query.state.data;\n\t\tif (cachedData === void 0) return this.fetchQuery(options);\n\t\tif (options.revalidateIfStale && query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime, query))) this.prefetchQuery(defaultedOptions);\n\t\treturn Promise.resolve(cachedData);\n\t}\n\t/**\n\t* Imperative (non-reactive) way to retrieve the cached data of multiple queries at once.\n\t* Only queries matching the given filters are returned; if none match, an empty array is\n\t* returned.\n\t*\n\t* Because the matched queries can hold data of different shapes (e.g. a broad filter can match\n\t* queries with unrelated data types), the `TQueryFnData` generic defaults to `unknown` rather\n\t* than being inferred. Passing a more specific type is a convenience for call sites that know\n\t* every matched query holds the same shape — it is not checked against the actual cache\n\t* contents.\n\t*\n\t* @returns An array of query key and data pairs. The data is `undefined` for a query with no cached data.\n\t* @see {@link QueryClient#getQueryData}\n\t* @example\n\t* ```ts\n\t* const data = queryClient.getQueriesData({ queryKey: ['posts'] })\n\t* ```\n\t*/\n\tgetQueriesData(filters) {\n\t\treturn this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n\t\t\treturn [queryKey, state.data];\n\t\t});\n\t}\n\t/**\n\t* Synchronous way to immediately update a query's cached data. If the updater (or the value\n\t* passed) resolves to `undefined`, the cache is left untouched and no query is created;\n\t* otherwise, if the query does not exist yet, it will be created. To update multiple queries\n\t* at once by partially matching query keys, use {@link QueryClient#setQueriesData} instead.\n\t*\n\t* Updates must be performed immutably: do not mutate `oldData`, or data previously retrieved\n\t* via {@link QueryClient#getQueryData}, in place.\n\t*\n\t* @param queryKey - The query key to set data for.\n\t* @param updater - Either the new data, or a function that receives the current data (which\n\t* may be `undefined`) and returns the new data.\n\t* @param options - Set `updatedAt` to override the timestamp the written data is recorded with.\n\t* @returns The data that was written, or `undefined` if the updater returned `undefined` — in that case\n\t* the write is skipped and the cache is left unchanged.\n\t*\n\t* @example\n\t* ```ts\n\t* queryClient.setQueryData(['posts'], newPosts)\n\t*\n\t* // Or, using an updater function that receives the current data:\n\t* queryClient.setQueryData(['posts'], (oldPosts) => [...oldPosts, newPost])\n\t* ```\n\t*/\n\tsetQueryData(queryKey, updater, options) {\n\t\tconst defaultedOptions = this.defaultQueryOptions({ queryKey });\n\t\tconst prevData = this.#queryCache.get(defaultedOptions.queryHash)?.state.data;\n\t\tconst data = functionalUpdate(updater, prevData);\n\t\tif (data === void 0) return;\n\t\treturn this.#queryCache.build(this, defaultedOptions).setData(data, {\n\t\t\t...options,\n\t\t\tmanual: true\n\t\t});\n\t}\n\t/**\n\t* Synchronous way to immediately update the cached data of multiple queries at once, using\n\t* filters or partial query key matching. Only queries that already exist and match the given\n\t* filters are updated; no new cache entries are created. Internally this calls\n\t* {@link QueryClient#setQueryData} for each matching query.\n\t*\n\t* @returns One `[queryKey, data]` tuple per matched query, in the same shape and with the same\n\t* `undefined` case as {@link QueryClient#setQueryData}.\n\t* @example\n\t* ```ts\n\t* queryClient.setQueriesData({ queryKey: ['posts'] }, (oldPosts) =>\n\t* oldPosts ? oldPosts.filter((post) => post.id !== deletedId) : oldPosts,\n\t* )\n\t* ```\n\t*/\n\tsetQueriesData(filters, updater, options) {\n\t\treturn notifyManager.batch(() => this.#queryCache.findAll(filters).map(({ queryKey }) => [queryKey, this.setQueryData(queryKey, updater, options)]));\n\t}\n\t/**\n\t* Imperative (non-reactive) way to retrieve an existing query's state. If the query does not\n\t* exist, `undefined` is returned.\n\t*\n\t* @example\n\t* ```ts\n\t* const state = queryClient.getQueryState(['posts'])\n\t* console.log(state?.dataUpdatedAt)\n\t* ```\n\t*/\n\tgetQueryState(queryKey) {\n\t\tconst options = this.defaultQueryOptions({ queryKey });\n\t\treturn this.#queryCache.get(options.queryHash)?.state;\n\t}\n\t/**\n\t* Removes queries from the cache that match the given filters. Unlike\n\t* {@link QueryClient#invalidateQueries} or {@link QueryClient#refetchQueries}, this removes\n\t* matching queries from the cache instead of refetching them. Without filters, every query in\n\t* the cache is removed.\n\t*\n\t* @example\n\t* ```ts\n\t* queryClient.removeQueries({ queryKey: ['posts'], exact: true })\n\t* ```\n\t*/\n\tremoveQueries(filters) {\n\t\tconst queryCache = this.#queryCache;\n\t\tnotifyManager.batch(() => {\n\t\t\tqueryCache.findAll(filters).forEach((query) => {\n\t\t\t\tqueryCache.remove(query);\n\t\t\t});\n\t\t});\n\t}\n\t/**\n\t* Resets queries matching the given filters back to their initial state (e.g. any\n\t* `initialData`), notifying subscribers rather than removing them. Active queries among the\n\t* matched set are then refetched, and the returned promise resolves once that refetch settles.\n\t*\n\t* @example\n\t* ```ts\n\t* await queryClient.resetQueries({ queryKey: ['posts'], exact: true })\n\t* ```\n\t*/\n\tresetQueries(filters, options) {\n\t\tconst queryCache = this.#queryCache;\n\t\treturn notifyManager.batch(() => {\n\t\t\tconst matched = queryCache.findAll(filters);\n\t\t\tconst queriesToRefetch = new Set(matched);\n\t\t\tmatched.forEach((query) => {\n\t\t\t\tquery.reset();\n\t\t\t});\n\t\t\treturn this.refetchQueries({\n\t\t\t\ttype: \"active\",\n\t\t\t\tpredicate: (query) => queriesToRefetch.has(query)\n\t\t\t}, options);\n\t\t});\n\t}\n\t/**\n\t* Cancels outgoing fetches for queries matching the given filters. Most useful when performing\n\t* optimistic updates, since any outgoing refetch that resolves afterwards would otherwise\n\t* overwrite the optimistic update. By default (`revert: true`), a cancelled query's data is\n\t* reverted to its state before the outgoing fetch started.\n\t*\n\t* The returned promise never rejects, even if individual cancellations fail.\n\t*\n\t* @example\n\t* ```ts\n\t* await queryClient.cancelQueries({ queryKey: ['posts'], exact: true })\n\t* ```\n\t*/\n\tcancelQueries(filters, cancelOptions = {}) {\n\t\tconst defaultedCancelOptions = {\n\t\t\trevert: true,\n\t\t\t...cancelOptions\n\t\t};\n\t\tconst promises = notifyManager.batch(() => this.#queryCache.findAll(filters).map((query) => query.cancel(defaultedCancelOptions)));\n\t\treturn Promise.all(promises).then(noop).catch(noop);\n\t}\n\t/**\n\t* Marks queries matching the given filters as invalidated. Unlike\n\t* {@link QueryClient#removeQueries}, invalidated queries stay in the cache.\n\t*\n\t* Unless `filters.refetchType` is `'none'`, matching queries are then refetched via\n\t* {@link QueryClient#refetchQueries}, using `filters.refetchType` if set, otherwise\n\t* `filters.type`, otherwise `'active'`.\n\t*\n\t* @example\n\t* ```ts\n\t* await queryClient.invalidateQueries({ queryKey: ['posts'], refetchType: 'active' })\n\t* ```\n\t*/\n\tinvalidateQueries(filters, options = {}) {\n\t\treturn notifyManager.batch(() => {\n\t\t\tthis.#queryCache.findAll(filters).forEach((query) => {\n\t\t\t\tquery.invalidate();\n\t\t\t});\n\t\t\tif (filters?.refetchType === \"none\") return Promise.resolve();\n\t\t\treturn this.refetchQueries({\n\t\t\t\t...filters,\n\t\t\t\ttype: filters?.refetchType ?? filters?.type ?? \"active\"\n\t\t\t}, options);\n\t\t});\n\t}\n\t/**\n\t* Refetches queries matching the given filters, regardless of whether they are stale. Without\n\t* filters, every query in the cache is refetched. Queries that are disabled, or static (only\n\t* have observers with a static `staleTime`), are never refetched.\n\t*\n\t* By default (`cancelRefetch: true`), a currently running fetch is cancelled before the new\n\t* one starts. The returned promise resolves once all matching queries have settled; it does\n\t* not reject on individual query failures unless `throwOnError` is set.\n\t*\n\t* @example\n\t* ```ts\n\t* // refetch all active queries partially matching a query key:\n\t* await queryClient.refetchQueries({ queryKey: ['posts'], type: 'active' })\n\t* ```\n\t*/\n\trefetchQueries(filters, options = {}) {\n\t\tconst fetchOptions = {\n\t\t\t...options,\n\t\t\tcancelRefetch: options.cancelRefetch ?? true\n\t\t};\n\t\tconst promises = notifyManager.batch(() => this.#queryCache.findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {\n\t\t\tlet promise = query.fetch(void 0, fetchOptions);\n\t\t\tif (!fetchOptions.throwOnError) promise = promise.catch(noop);\n\t\t\treturn query.state.fetchStatus === \"paused\" ? Promise.resolve() : promise;\n\t\t}));\n\t\treturn Promise.all(promises).then(noop);\n\t}\n\t/**\n\t* Asynchronous method to fetch and cache a query, resolving with the data or throwing with\n\t* the error.\n\t*\n\t* If the query already exists in the cache and its data is not stale (per the given\n\t* `staleTime`), the cached data is returned without fetching. Otherwise, the query is fetched\n\t* and the promise resolves once the fetch settles. If a `select` function is provided, it is\n\t* applied to the data in both cases (cached or freshly fetched) before it is returned.\n\t*\n\t* Unlike a reactive observer, retries are disabled by default here (`retry: false`) unless\n\t* explicitly configured, since there is no component to catch a thrown error and retry through\n\t* re-render.\n\t*\n\t* The accepted options are `QueryObserverOptions` minus the fields that only make sense for a\n\t* reactive observer — `enabled`, `refetchInterval`, `refetchIntervalInBackground`,\n\t* `refetchOnWindowFocus`, `refetchOnReconnect`, `refetchOnMount`, `retryOnMount`,\n\t* `notifyOnChangeProps`, `throwOnError`, `suspense`, and `placeholderData` are not part of this\n\t* method's options.\n\t*\n\t* This method replaces the deprecated `fetchQuery`, and — combined with\n\t* `{ staleTime: 'static' }` — the deprecated `ensureQueryData`.\n\t*\n\t* @example\n\t* ```ts\n\t* try {\n\t* const data = await queryClient.query({ queryKey, queryFn, staleTime: 10000 })\n\t* } catch (error) {\n\t* console.log(error)\n\t* }\n\t* ```\n\t*/\n\tasync query(options) {\n\t\tconst defaultedOptions = this.defaultQueryOptions(options);\n\t\tif (defaultedOptions.retry === void 0) defaultedOptions.retry = false;\n\t\tconst query = this.#queryCache.build(this, defaultedOptions);\n\t\tconst queryData = query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime, query)) ? await query.fetch(defaultedOptions) : query.state.data;\n\t\tconst select = defaultedOptions.select;\n\t\tif (select) return select(queryData);\n\t\treturn queryData;\n\t}\n\t/**\n\t* @deprecated Use queryClient.query(options) instead. This method will be removed in the next major version.\n\t*/\n\tfetchQuery(options) {\n\t\tconst defaultedOptions = this.defaultQueryOptions(options);\n\t\tif (defaultedOptions.retry === void 0) defaultedOptions.retry = false;\n\t\tconst query = this.#queryCache.build(this, defaultedOptions);\n\t\treturn query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime, query)) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n\t}\n\t/**\n\t* @deprecated Use queryClient.query(options) instead. You can swallow errors with `.catch(noop)`. This method will be removed in the next major version.\n\t*/\n\tprefetchQuery(options) {\n\t\treturn this.fetchQuery(options).then(noop).catch(noop);\n\t}\n\t/**\n\t* Asynchronous method to fetch and cache an infinite query, resolving with an\n\t* {@link InfiniteData} object or throwing with the error.\n\t*\n\t* Behaves like {@link QueryClient#query}, accepting the same options (minus\n\t* `initialPageParam`), plus the required `initialPageParam`, and an optional `pages` /\n\t* `getNextPageParam` pair used to refetch a fixed number of pages from the start.\n\t*\n\t* This method replaces the deprecated `fetchInfiniteQuery`, and — combined with\n\t* `{ staleTime: 'static' }` — the deprecated `ensureInfiniteQueryData`.\n\t*\n\t* @example\n\t* ```ts\n\t* try {\n\t* const data = await queryClient.infiniteQuery({ queryKey, queryFn, initialPageParam: 0 })\n\t* console.log(data.pages)\n\t* } catch (error) {\n\t* console.log(error)\n\t* }\n\t* ```\n\t*/\n\tinfiniteQuery(options) {\n\t\toptions._type = \"infinite\";\n\t\treturn this.query(options);\n\t}\n\t/**\n\t* @deprecated Use queryClient.infiniteQuery(options) instead. This method will be removed in the next major version.\n\t*/\n\tfetchInfiniteQuery(options) {\n\t\toptions._type = \"infinite\";\n\t\treturn this.fetchQuery(options);\n\t}\n\t/**\n\t* @deprecated Use queryClient.infiniteQuery(options) instead. You can swallow errors with `.catch(noop)`. This method will be removed in the next major version.\n\t*/\n\tprefetchInfiniteQuery(options) {\n\t\treturn this.fetchInfiniteQuery(options).then(noop).catch(noop);\n\t}\n\t/**\n\t* @deprecated Use queryClient.infiniteQuery({ ...options, staleTime: 'static' }) instead. This method will be removed in the next major version.\n\t*/\n\tensureInfiniteQueryData(options) {\n\t\toptions._type = \"infinite\";\n\t\treturn this.ensureQueryData(options);\n\t}\n\t/**\n\t* Resumes mutations that were paused because there was no network connection. Does nothing\n\t* (resolving immediately) if the client is currently offline.\n\t*\n\t* @example\n\t* ```ts\n\t* import { QueryClient } from '@tanstack/query-core'\n\t*\n\t* const queryClient = new QueryClient()\n\t* await queryClient.resumePausedMutations()\n\t* ```\n\t*/\n\tresumePausedMutations() {\n\t\tif (onlineManager.isOnline()) return this.#mutationCache.resumePausedMutations();\n\t\treturn Promise.resolve();\n\t}\n\t/**\n\t* Returns the query cache this client is connected to.\n\t*\n\t* @example\n\t* ```ts\n\t* import { QueryClient } from '@tanstack/query-core'\n\t*\n\t* const queryClient = new QueryClient()\n\t* const queryCache = queryClient.getQueryCache()\n\t* const queries = queryCache.findAll({ queryKey: ['posts'] })\n\t* ```\n\t*/\n\tgetQueryCache() {\n\t\treturn this.#queryCache;\n\t}\n\t/**\n\t* Returns the mutation cache this client is connected to.\n\t*\n\t* @example\n\t* ```ts\n\t* import { QueryClient } from '@tanstack/query-core'\n\t*\n\t* const queryClient = new QueryClient()\n\t* const mutationCache = queryClient.getMutationCache()\n\t* const mutations = mutationCache.findAll({ status: 'pending' })\n\t* ```\n\t*/\n\tgetMutationCache() {\n\t\treturn this.#mutationCache;\n\t}\n\t/**\n\t* Returns the default options that were set when creating the client, or via\n\t* {@link QueryClient#setDefaultOptions}.\n\t*\n\t* @example\n\t* ```ts\n\t* import { QueryClient } from '@tanstack/query-core'\n\t*\n\t* const queryClient = new QueryClient()\n\t* const defaultOptions = queryClient.getDefaultOptions()\n\t* ```\n\t*/\n\tgetDefaultOptions() {\n\t\treturn this.#defaultOptions;\n\t}\n\t/**\n\t* Dynamically sets the default options for this client, overwriting any previously defined\n\t* default options.\n\t*\n\t* @see {@link QueryClient#getDefaultOptions}\n\t* @example\n\t* ```ts\n\t* import { QueryClient } from '@tanstack/query-core'\n\t*\n\t* const queryClient = new QueryClient()\n\t* queryClient.setDefaultOptions({\n\t* queries: {\n\t* staleTime: Infinity,\n\t* },\n\t* })\n\t* ```\n\t*/\n\tsetDefaultOptions(options) {\n\t\tthis.#defaultOptions = options;\n\t}\n\t/**\n\t* Sets default options for queries whose query key partially matches the given `queryKey`.\n\t*\n\t* If several registered query defaults match a given query key, they are merged together in\n\t* registration order by {@link QueryClient#getQueryDefaults}, so register defaults from the\n\t* most generic key to the least generic one — more specific defaults should be registered\n\t* after more generic ones so they take precedence.\n\t*\n\t* @example\n\t* ```ts\n\t* queryClient.setQueryDefaults(['posts'], { queryFn: fetchPosts })\n\t*\n\t* await queryClient.query({ queryKey: ['posts'] })\n\t* ```\n\t*/\n\tsetQueryDefaults(queryKey, options) {\n\t\tthis.#queryDefaults.set(hashKey(queryKey), {\n\t\t\tqueryKey,\n\t\t\tdefaultOptions: options\n\t\t});\n\t}\n\t/**\n\t* Returns the default options registered for queries whose query key partially matches the\n\t* given `queryKey`, via {@link QueryClient#setQueryDefaults}. If multiple registered defaults\n\t* match, they are merged together in registration order.\n\t*\n\t* @example\n\t* ```ts\n\t* const defaultOptions = queryClient.getQueryDefaults(['posts'])\n\t* ```\n\t*/\n\tgetQueryDefaults(queryKey) {\n\t\tconst defaults = [...this.#queryDefaults.values()];\n\t\tconst result = {};\n\t\tdefaults.forEach((queryDefault) => {\n\t\t\tif (partialMatchKey(queryKey, queryDefault.queryKey)) Object.assign(result, queryDefault.defaultOptions);\n\t\t});\n\t\treturn result;\n\t}\n\t/**\n\t* Sets default options for mutations whose mutation key partially matches the given\n\t* `mutationKey`. As with {@link QueryClient#setQueryDefaults}, the order of registration\n\t* matters when several registered defaults match the same mutation key.\n\t*\n\t* @see {@link QueryClient#getMutationDefaults}\n\t* @example\n\t* ```ts\n\t* queryClient.setMutationDefaults(['addPost'], { mutationFn: addPost })\n\t* ```\n\t*/\n\tsetMutationDefaults(mutationKey, options) {\n\t\tthis.#mutationDefaults.set(hashKey(mutationKey), {\n\t\t\tmutationKey,\n\t\t\tdefaultOptions: options\n\t\t});\n\t}\n\t/**\n\t* Returns the default options registered for mutations whose mutation key partially matches\n\t* the given `mutationKey`, via {@link QueryClient#setMutationDefaults}. If multiple registered\n\t* defaults match, they are merged together in registration order.\n\t*\n\t* @example\n\t* ```ts\n\t* const defaultOptions = queryClient.getMutationDefaults(['addPost'])\n\t* ```\n\t*/\n\tgetMutationDefaults(mutationKey) {\n\t\tconst defaults = [...this.#mutationDefaults.values()];\n\t\tconst result = {};\n\t\tdefaults.forEach((queryDefault) => {\n\t\t\tif (partialMatchKey(mutationKey, queryDefault.mutationKey)) Object.assign(result, queryDefault.defaultOptions);\n\t\t});\n\t\treturn result;\n\t}\n\t/**\n\t* Called by framework adapters (e.g. inside `useQuery`) to resolve the options passed by the\n\t* caller into their final, defaulted form: merging `queryClient.setQueryDefaults` for the\n\t* given `queryKey`, then the client's own `defaultOptions.queries`, then the caller's options\n\t* on top. A no-op if the options are already defaulted (`_defaulted: true`).\n\t*/\n\tdefaultQueryOptions(options) {\n\t\tif (options._defaulted) return options;\n\t\tconst defaultedOptions = {\n\t\t\t...this.#defaultOptions.queries,\n\t\t\t...this.getQueryDefaults(options.queryKey),\n\t\t\t...options,\n\t\t\t_defaulted: true\n\t\t};\n\t\tif (!defaultedOptions.queryHash) defaultedOptions.queryHash = hashQueryKeyByOptions(defaultedOptions.queryKey, defaultedOptions);\n\t\tif (defaultedOptions.refetchOnReconnect === void 0) defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== \"always\";\n\t\tif (defaultedOptions.throwOnError === void 0) defaultedOptions.throwOnError = !!defaultedOptions.suspense;\n\t\tif (!defaultedOptions.networkMode && defaultedOptions.persister) defaultedOptions.networkMode = \"offlineFirst\";\n\t\tif (defaultedOptions.queryFn === skipToken) defaultedOptions.enabled = false;\n\t\treturn defaultedOptions;\n\t}\n\t/**\n\t* The mutation counterpart of {@link QueryClient#defaultQueryOptions}. Called by framework\n\t* adapters (e.g. inside `useMutation`) to merge `queryClient.setMutationDefaults` for the\n\t* given `mutationKey`, then the client's `defaultOptions.mutations`, then the caller's options\n\t* on top. A no-op if the options are already defaulted (`_defaulted: true`).\n\t*/\n\tdefaultMutationOptions(options) {\n\t\tif (options?._defaulted) return options;\n\t\treturn {\n\t\t\t...this.#defaultOptions.mutations,\n\t\t\t...options?.mutationKey && this.getMutationDefaults(options.mutationKey),\n\t\t\t...options,\n\t\t\t_defaulted: true\n\t\t};\n\t}\n\t/**\n\t* Clears both the query cache and the mutation cache this client is connected to.\n\t*\n\t* @example\n\t* ```ts\n\t* import { QueryClient } from '@tanstack/query-core'\n\t*\n\t* const queryClient = new QueryClient()\n\t* queryClient.clear()\n\t* ```\n\t*/\n\tclear() {\n\t\tthis.#queryCache.clear();\n\t\tthis.#mutationCache.clear();\n\t}\n};\n//#endregion\nexport { QueryClient };\n\n//# sourceMappingURL=queryClient.js.map","\nimport { Selection as __zyzzSelection } from 'zyzz/runtime';\n\n\nimport { variables } from './vars.js';\n/**\n * Zyzz authoring helpers bound to the Web variables, so token strings such as `foreground`,\n * `'6'` and `copy.14` type-check and compile ahead of time.\n *\n * - `style(definition)` returns a callable that produces `className` and `style` props.\n * - `variants({ base, variants, defaultVariants })` returns a callable that takes the variant\n * selection.\n * - `vars` holds references such as `vars.ease.snappy`. Call `vars({ colorScheme })` for props\n * that apply the variables, and optionally a color scheme, to a scope.\n *\n * @example\n * namespace styles {\n * export const panel = style({ backgroundColor: 'background.surface', padding: '24' })\n * }\n *\n * <section {...styles.panel()} />\n */\nexport const { style, variants, vars } = ({vars:__zyzzSelection.create([[\"default\",\"z-theme-tds_2f_web-theme\"]],false,'set',\"default\")});\n// Inter's subsets, written by `scripts/subset-fonts.ts`. A browser downloads only the subsets whose\n// `unicodeRange` the page's text uses, and a face declared later takes precedence where ranges\n// overlap, so the order is intentional: `symbols` first and `latin` last, as Google Fonts orders them.\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\nvoid 0;\n//# sourceMappingURL=zyzz.config.js.map","/**\n * The document of every page, with the shared API and query clients. The router keeps `chain` on\n * every page. @module\n */\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport {\n createRootRoute,\n HeadContent,\n Outlet,\n retainSearchParams,\n Scripts,\n} from '@tanstack/react-router'\nimport { Toast, vars as ds } from '@tempoxyz/ds'\nimport { lazy, type ReactNode, Suspense, useEffect, useState } from 'react'\nimport reset from 'zyzz/reset.css?url'\nimport type * as Chain from '../../internal/Chain.js'\nimport * as ChainName from '../../internal/ChainName.js'\nimport * as Client from '../lib/Client.js'\nimport { NotFound } from '../screens/NotFound.js'\nimport { style, vars } from '../zyzz.config.js'\n\n/**\n * The Tempo mark, as Tempo Wallet and the Tempo Developer Console show it. Inline, so the browser\n * makes no request for it and never requests `/favicon.ico`.\n */\nconst favicon = `data:image/svg+xml,${encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 269 269\"><rect width=\"269\" height=\"269\" fill=\"#000\"/><path d=\"M123.273 190.794H93.445L121.09 105.318H85.7334L93.445 80.2642H191.95L184.238 105.318H150.773L123.273 190.794Z\" fill=\"#fff\"/></svg>',\n)}`\n\nexport const Route = createRootRoute({\n component: Root,\n head: () => ({\n links: [\n { href: reset, rel: 'stylesheet' },\n { href: favicon, rel: 'icon', type: 'image/svg+xml' },\n ],\n meta: [\n { charSet: 'utf-8' },\n { content: 'width=device-width, initial-scale=1', name: 'viewport' },\n { title: 'Tempo ID' },\n { content: 'Sign in to Tempo.', name: 'description' },\n ],\n }),\n notFoundComponent: NotFoundPage,\n // A chosen chain stays on every page that the router opens.\n search: { middlewares: [retainSearchParams(['chain'])] },\n shellComponent: Document,\n validateSearch: (search: Record<string, unknown>): Search => {\n // The router merges each route's search over the parsed query, so an invalid value is\n // replaced, not left in place, and the retained parameter never carries it.\n return { chain: ChainName.read(search.chain) }\n },\n})\n\n/** The search parameters of every page. */\ntype Search = {\n /** The chain of the balances. Defaults to Tempo mainnet. */\n chain?: Chain.Chain | undefined\n}\n\n/** The dev toolbar, in its own chunk, loaded after hydration. */\nconst DevTools = lazy(async () => ({\n default: (await import('../components/DevTools.js')).DevTools,\n}))\n\n/** The `localStorage` key of the toolbar choice in a build. */\nconst devToolsKey = 'tempo-id:devtools'\n\n/** Renders the page with the shared clients. */\nfunction Root() {\n // One of each for the document's lifetime, so neither holds state of another visitor.\n const [client] = useState(Client.create)\n const [queryClient] = useState(() => new QueryClient())\n const devTools = useDevTools()\n\n return (\n <Client.Context value={client}>\n <QueryClientProvider client={queryClient}>\n {/* Every page can confirm a change with a toast. */}\n <Toast.Provider>\n <Outlet />\n <Toast.Viewport />\n {devTools && (\n <Suspense fallback={null}>\n <DevTools />\n </Suspense>\n )}\n </Toast.Provider>\n </QueryClientProvider>\n </Client.Context>\n )\n}\n\n/**\n * Returns whether the dev toolbar renders: in `vp dev`, or from `?devtools` to `?devtools=false`.\n */\nfunction useDevTools() {\n const [enabled, setEnabled] = useState(false)\n\n useEffect(() => {\n if (import.meta.env.DEV) {\n setEnabled(true)\n return\n }\n\n const value = new URLSearchParams(location.search).get('devtools')\n const off = value === 'false' || value === '0'\n try {\n if (off) localStorage.removeItem(devToolsKey)\n else if (value !== null) localStorage.setItem(devToolsKey, 'true')\n setEnabled(localStorage.getItem(devToolsKey) === 'true')\n } catch {\n // Blocked storage keeps the parameter's choice for this page only.\n setEnabled(value !== null && !off)\n }\n }, [])\n\n return enabled\n}\n\n/** Renders the not-found screen. */\nfunction NotFoundPage() {\n return (\n <main {...styles.page()}>\n <NotFound />\n </main>\n )\n}\n\n/**\n * Renders the HTML document around the page. `data-hydrated` turns `true` once React hydrates the\n * document, which the end-to-end suite waits for before it types or clicks: a click before hydration\n * submits a form natively.\n */\nfunction Document(props: Document.Props) {\n const [hydrated, setHydrated] = useState(false)\n useEffect(() => setHydrated(true), [])\n\n return (\n <html\n className={`${ds().className} ${vars().className}`}\n data-hydrated={hydrated}\n lang=\"en\"\n >\n <head>\n <HeadContent />\n </head>\n <body>\n {props.children}\n <Scripts />\n </body>\n </html>\n )\n}\n\ndeclare namespace Document {\n type Props = {\n /** The page. */\n children: ReactNode\n }\n}\n\nnamespace styles {\n export const page = style({\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n minHeight: '100dvh !custom',\n paddingBlock: '64',\n paddingInline: '16',\n })\n}\n","/**\n * The flows canvas: each flow's entry point, sample screens, requests, and exit. It pans on scroll,\n * and zooms with a pinch, keys, or its controls. @module\n */\n/* istanbul ignore file -- With `ssr: false`, it renders only in a browser. */\nimport { createFileRoute, Link } from '@tanstack/react-router'\nimport { Accordion, Button, Tooltip } from '@tempoxyz/ds'\nimport { ChevronRight, ZoomIn, ZoomOut } from '@tempoxyz/ds/icons'\nimport {\n type FormEvent,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { CodeInput } from '../components/CodeInput.js'\nimport { Account } from '../screens/Account.js'\nimport { Approval, InvalidRequest } from '../screens/Approval.js'\nimport { ChooseAccount } from '../screens/ChooseAccount.js'\nimport { Deposit } from '../screens/Deposit.js'\nimport { DeviceApproval } from '../screens/DeviceApproval.js'\nimport { NotFound } from '../screens/NotFound.js'\nimport { SignIn } from '../screens/SignIn.js'\nimport { WalletUpgrade } from '../screens/WalletUpgrade.js'\nimport { style, variants, vars } from '../zyzz.config.js'\n\n/** An entry point, a Tempo ID screen, or an external step. */\ntype Node = {\n /** A secondary line, such as the entry request. */\n detail?: string | undefined\n /** The request or event on the incoming arrow. Absent on the first node. */\n edge?: string | undefined\n /** The name of the screen or step. */\n name: string\n /** `app` for an app's own screen. Absent for Tempo ID. */\n owner?: 'app' | undefined\n /** Absent for an external step. */\n screen?: ReactNode | undefined\n}\n\n/** One path from an entry point to an exit. */\ntype Flow = {\n /** What the flow does, with code spans in backticks. */\n description: string\n /** The entry point, the steps, and the exit, in order. */\n nodes: readonly Node[]\n /** The flow's name. */\n title: string\n}\n\n/** A canvas point that stays under a viewport point during a zoom. */\ntype Anchor = {\n /** Unzoomed pixels from the canvas's top left. */\n canvas: { x: number; y: number }\n /** Pixels from the viewport's top left. */\n viewport: { x: number; y: number }\n}\n\n/** A titled group of flows. */\ntype Section = {\n /** In reading order. */\n flows: readonly Flow[]\n /** The group's name. */\n title: string\n}\n\nexport const Route = createFileRoute('/_/flows')({\n component: Page,\n // The canvas renders in the browser alone, since its sample balances format in the browser's\n // locale and its sample expiries read the clock.\n ssr: false,\n})\n\n/** The zoom limits, and the factor of one step. */\nconst zoom = { max: 2, min: 0.25, step: 1.25 } as const\n\n/** Renders the canvas. */\nfunction Page(): ReactNode {\n // The screens stay the same elements between zoom renders, so React skips them.\n const all = useMemo(sections, [])\n const [scale, setScale] = useState(1)\n // The wheel and gesture listeners read the scale between renders, before the state updates.\n const current = useRef(1)\n const anchor = useRef<Anchor | undefined>(undefined)\n const main = useRef<HTMLElement>(null)\n const probe = useRef<HTMLDivElement>(null)\n\n // The zoomed content starts below the canvas's top space, which the zoom does not scale. Engines\n // with the legacy `zoom` geometry divide a zoomed element's rect by its zoom, so the origin comes\n // from the canvas, outside the zoom.\n const origin = () => {\n if (!main.current) return window.scrollY\n return (\n main.current.getBoundingClientRect().top +\n Number.parseFloat(getComputedStyle(main.current).paddingTop) +\n window.scrollY\n )\n }\n\n // Returns the rect pixels per CSS pixel inside the zoom: the scale in engines with the standard\n // `zoom` geometry, and 1 in engines with the legacy one.\n const unit = useCallback(\n () => (probe.current?.getBoundingClientRect().height ?? 100) / 100,\n [],\n )\n\n // Sets the zoom, and keeps the canvas point under `viewport` in place, or the viewport's center.\n const zoomTo = (next: number, viewport?: Anchor['viewport']) => {\n const clamped = Math.min(zoom.max, Math.max(zoom.min, next))\n // An unchanged scale renders nothing, so the layout effect would never spend the anchor.\n if (clamped === current.current) return\n\n const point = viewport ?? {\n x: window.innerWidth / 2,\n y: window.innerHeight / 2,\n }\n\n // The scroll position updates only after the render, so a pending anchor keeps its canvas point.\n anchor.current = {\n canvas: anchor.current?.canvas ?? {\n x: (window.scrollX + point.x) / current.current,\n y: (window.scrollY + point.y - origin()) / current.current,\n },\n viewport: point,\n }\n current.current = clamped\n setScale(clamped)\n }\n\n useLayoutEffect(() => {\n const pending = anchor.current\n if (!pending) return\n\n anchor.current = undefined\n window.scrollTo(\n pending.canvas.x * scale - pending.viewport.x,\n pending.canvas.y * scale + origin() - pending.viewport.y,\n )\n }, [scale])\n\n // A plain wheel scrolls, so it pans. A pinch on a trackpad reaches the page as a wheel with\n // `ctrlKey`, and Safari's as gesture events, which would otherwise zoom the whole page.\n useEffect(() => {\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) return\n\n event.preventDefault()\n const delta = (() => {\n if (event.deltaMode === WheelEvent.DOM_DELTA_LINE)\n return event.deltaY * 16\n if (event.deltaMode === WheelEvent.DOM_DELTA_PAGE)\n return event.deltaY * window.innerHeight\n return event.deltaY\n })()\n const bounded = Math.min(50, Math.max(-50, delta))\n zoomTo(current.current * Math.exp(-bounded / 200), {\n x: event.clientX,\n y: event.clientY,\n })\n }\n\n let gestureStart = 1\n const onGestureStart = (event: Event) => {\n event.preventDefault()\n gestureStart = current.current\n }\n // WebKit's `GestureEvent` is not in the DOM types. iOS leaves out the pointer's coordinates.\n type Gesture = Event & {\n clientX?: number | undefined\n clientY?: number | undefined\n scale: number\n }\n const onGestureChange = (event: Event) => {\n event.preventDefault()\n const gesture = event as Gesture\n // Without the pointer, the zoom keeps the viewport's center in place.\n zoomTo(\n gestureStart * gesture.scale,\n typeof gesture.clientX === 'number' &&\n typeof gesture.clientY === 'number'\n ? { x: gesture.clientX, y: gesture.clientY }\n : undefined,\n )\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.altKey || event.ctrlKey || event.metaKey) return\n if (\n event.target instanceof HTMLElement &&\n (event.target.isContentEditable ||\n event.target.closest('input, select, textarea'))\n )\n return\n\n if (event.key === '+' || event.key === '=')\n zoomTo(current.current * zoom.step)\n else if (event.key === '-') zoomTo(current.current / zoom.step)\n else if (event.key === '0') zoomTo(1)\n else return\n event.preventDefault()\n }\n\n window.addEventListener('wheel', onWheel, { passive: false })\n window.addEventListener('gesturestart', onGestureStart)\n window.addEventListener('gesturechange', onGestureChange)\n window.addEventListener('keydown', onKeyDown)\n return () => {\n window.removeEventListener('wheel', onWheel)\n window.removeEventListener('gesturestart', onGestureStart)\n window.removeEventListener('gesturechange', onGestureChange)\n window.removeEventListener('keydown', onKeyDown)\n }\n }, [])\n\n // The canvas renders after load, so the browser finds no target for a link's fragment then. Each\n // identifier is a slug, so the fragment needs no decoding.\n useEffect(() => {\n if (window.location.hash) reveal({ id: window.location.hash.slice(1) })\n }, [])\n\n // The content stays one element across zoom renders, so a zoom renders only the controls.\n const canvas = useMemo(\n () => <Content sections={all} unit={unit} />,\n [all, unit],\n )\n\n const percent = Math.round(scale * 100)\n\n return (\n <main ref={main} {...styles.canvas()}>\n <div {...styles.panels()}>\n <div aria-label=\"Zoom\" role=\"toolbar\" {...styles.zoom()}>\n <ZoomTip label=\"Zoom out\">\n <Button\n aria-label=\"Zoom out\"\n disabled={scale <= zoom.min}\n onClick={() => zoomTo(scale / zoom.step)}\n shape=\"icon\"\n size=\"small\"\n variant=\"text\"\n >\n <ZoomOut {...styles.zoomIcon()} />\n </Button>\n </ZoomTip>\n <ZoomTip label=\"Reset to 100%\">\n <Button\n aria-label={`Zoom ${percent}%. Reset to 100%`}\n onClick={() => zoomTo(1)}\n size=\"small\"\n variant=\"text\"\n {...styles.zoomLevel()}\n >\n {percent}%\n </Button>\n </ZoomTip>\n <ZoomTip label=\"Zoom in\">\n <Button\n aria-label=\"Zoom in\"\n disabled={scale >= zoom.max}\n onClick={() => zoomTo(scale * zoom.step)}\n shape=\"icon\"\n size=\"small\"\n variant=\"text\"\n >\n <ZoomIn {...styles.zoomIcon()} />\n </Button>\n </ZoomTip>\n <span aria-live=\"polite\" role=\"status\" {...styles.hidden()}>\n {`Zoom ${percent}%`}\n </span>\n </div>\n <Legend sections={all} />\n </div>\n {/* `zoom` scales the layout too, so the page's scroll size follows the zoom and scrolling pans. */}\n <div {...styles.world({ style: { zoom: scale } })}>\n <div aria-hidden ref={probe} {...styles.probe()} />\n {canvas}\n </div>\n </main>\n )\n}\n\n/** Renders the introduction, the groups, and their flows. */\nfunction Content(props: Content.Props): ReactNode {\n return (\n <>\n <header {...styles.intro()}>\n <h1 {...styles.title()}>Flows</h1>\n <p {...styles.lede()}>\n Every path through Tempo ID, from the entry point on the left to the\n exit on the right. Each arrow names the request or event that leads to\n the next step. Scroll to pan. To zoom, pinch, or scroll with Control\n or Command held.\n </p>\n </header>\n {props.sections.map((section) => (\n <section {...styles.section()} key={section.title}>\n <h2 {...styles.sectionTitle()} id={fragment.section(section)}>\n {section.title}\n </h2>\n {section.flows.map((flow) => (\n <article\n {...styles.flow()}\n id={fragment.flow(section, flow)}\n key={flow.title}\n >\n <header {...styles.flowHeader()}>\n <h3 {...styles.flowTitle()}>{flow.title}</h3>\n <p {...styles.flowDescription()}>\n <Description text={flow.description} />\n </p>\n </header>\n <Row flow={flow} unit={props.unit} />\n </article>\n ))}\n </section>\n ))}\n </>\n )\n}\n\ndeclare namespace Content {\n type Props = {\n /** In canvas order. */\n sections: readonly Section[]\n /** Returns the rect pixels per CSS pixel inside the zoom. */\n unit: () => number\n }\n}\n\n/** Estimated row heights before a render, in unzoomed pixels. */\nconst estimate = { external: 128, screen: 480 }\n\n/**\n * Renders a flow's row near the viewport, or a box of its last size, so a zoom lays out few\n * screens.\n */\nfunction Row(props: Row.Props): ReactNode {\n const box = useRef<HTMLDivElement>(null)\n const [near, setNear] = useState(false)\n const [size, setSize] = useState(() => ({\n height: props.flow.nodes.some((node) => node.screen !== undefined)\n ? estimate.screen\n : estimate.external,\n width: props.flow.nodes.reduce(\n (width, node, index) =>\n width + (node.screen === undefined ? 224 : 384) + (index > 0 ? 192 : 0),\n 0,\n ),\n }))\n\n useEffect(() => {\n const element = box.current\n if (!element) return\n\n // The margin of one viewport on each side renders a row before it scrolls into view.\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries.at(-1)\n if (!entry) return\n\n // A row records its size before it leaves, so its box keeps the canvas's layout. The rect\n // and the unit come from the same geometry, so the size is in CSS pixels in either one.\n if (\n !entry.isIntersecting &&\n element.firstElementChild instanceof HTMLOListElement\n ) {\n const rect = element.getBoundingClientRect()\n setSize({\n height: rect.height / props.unit(),\n width: rect.width / props.unit(),\n })\n }\n setNear(entry.isIntersecting)\n },\n { rootMargin: '100%' },\n )\n observer.observe(element)\n return () => observer.disconnect()\n }, [props.unit])\n\n return (\n <div ref={box} {...styles.rowBox()}>\n {near ? (\n <ol {...styles.row()}>\n {props.flow.nodes.map((node, index) => (\n <li {...styles.step()} key={`${index}:${node.name}`}>\n {index > 0 ? <Arrow label={node.edge} /> : null}\n {node.screen ? (\n <figure {...styles.artboard()}>\n <figcaption {...styles.frameLabel()}>\n {node.owner === 'app' ? `App · ${node.name}` : node.name}\n </figcaption>\n {node.owner === 'app' ? (\n <div {...vars({ set: 'thirdParty' })}>\n <div {...styles.frame()}>{node.screen}</div>\n </div>\n ) : (\n <div {...styles.frame()}>{node.screen}</div>\n )}\n </figure>\n ) : (\n <External\n detail={node.detail}\n kind={(() => {\n if (index === 0) return 'Entry'\n if (index === props.flow.nodes.length - 1) return 'Exit'\n return 'External'\n })()}\n name={node.name}\n />\n )}\n </li>\n ))}\n </ol>\n ) : (\n <div\n aria-hidden\n {...styles.placeholder({\n style: { height: size.height, width: size.width },\n })}\n />\n )}\n </div>\n )\n}\n\ndeclare namespace Row {\n type Props = {\n /** The flow that the row renders. */\n flow: Flow\n /** Returns the rect pixels per CSS pixel inside the zoom. */\n unit: () => number\n }\n}\n\n/** Fragment identifiers of the groups and flows, from their titles. */\nconst fragment = {\n /** Returns the identifier of `flow` under `section`, since flow names repeat across groups. */\n flow(section: Section, flow: Flow) {\n return `${fragment.section(section)}--${slug(flow.title)}`\n },\n /** Returns the identifier of `section`. */\n section(section: Section) {\n return slug(section.title)\n },\n}\n\n/**\n * Scrolls the group or flow `id` to the top left, and aligns it for 10 frames while rows render.\n */\nfunction reveal(options: reveal.Options) {\n const target = document.getElementById(options.id)\n if (!target) return\n\n // The clearance is in viewport pixels, since a scroll margin inside the zoom would shrink with it.\n // `scrollIntoView` places the target in either `zoom` geometry, so the scroll reads no zoomed rect.\n const top = window.matchMedia('(min-width: 64rem)').matches ? 24 : 112\n let settled = 0\n const align = () => {\n target.scrollIntoView({ block: 'start' })\n window.scrollTo({ left: 0, top: window.scrollY - top })\n settled = target.getBoundingClientRect().top\n }\n align()\n\n // Each check compares the target's rect with its own rect after the last alignment, which holds in\n // either geometry.\n let frames = 10\n const settle = () => {\n if (Math.abs(target.getBoundingClientRect().top - settled) > 1) align()\n frames -= 1\n if (frames > 0) requestAnimationFrame(settle)\n }\n requestAnimationFrame(settle)\n}\n\ndeclare namespace reveal {\n type Options = {\n /** The identifier of the group or flow. */\n id: string\n }\n}\n\n/** Returns `text` in lowercase, with each non-alphanumeric run as `-`. */\nfunction slug(text: string) {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\n/** Renders the collapsed contents list, with a link to each group and flow. */\nfunction Legend(props: Legend.Props): ReactNode {\n return (\n <nav aria-label=\"Flows\" {...styles.legend()}>\n <Accordion.Root>\n <Accordion.Item value=\"contents\" {...styles.legendItem()}>\n <Accordion.Trigger {...styles.legendTrigger()}>\n Contents\n </Accordion.Trigger>\n <Accordion.Panel>\n <ol {...styles.legendList()}>\n {props.sections.map((section) => (\n <li key={section.title}>\n <Entry\n {...styles.legendSection()}\n id={fragment.section(section)}\n >\n {section.title}\n </Entry>\n <ol {...styles.legendFlows()}>\n {section.flows.map((flow) => (\n <li key={flow.title}>\n <Entry\n {...styles.legendFlow()}\n id={fragment.flow(section, flow)}\n >\n {flow.title}\n </Entry>\n </li>\n ))}\n </ol>\n </li>\n ))}\n </ol>\n </Accordion.Panel>\n </Accordion.Item>\n </Accordion.Root>\n </nav>\n )\n}\n\ndeclare namespace Legend {\n type Props = {\n /** In canvas order. */\n sections: readonly Section[]\n }\n}\n\n/** Renders a link to the group or flow `id`, which {@link reveal} scrolls to. */\nfunction Entry(props: Entry.Props): ReactNode {\n return (\n <Link\n className={props.className}\n hash={props.id}\n hashScrollIntoView={false}\n onClick={(event) => {\n // A modified click opens the link in another tab or window, so this page keeps its scroll.\n if (\n event.button !== 0 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n )\n return\n reveal({ id: props.id })\n }}\n replace\n resetScroll={false}\n to=\"/_/flows\"\n >\n {props.children}\n </Link>\n )\n}\n\ndeclare namespace Entry {\n type Props = {\n /** The link text. */\n children: ReactNode\n /** The link's class names. */\n className?: string | undefined\n /** The identifier of the group or flow. */\n id: string\n }\n}\n\n/** Renders a tooltip below a zoom control. */\nfunction ZoomTip(props: ZoomTip.Props): ReactNode {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger delay={300} render={props.children} />\n <Tooltip.Popup side=\"bottom\" sideOffset={8}>\n {props.label}\n </Tooltip.Popup>\n </Tooltip.Root>\n )\n}\n\ndeclare namespace ZoomTip {\n type Props = {\n /** The control, which receives the trigger's props. */\n children: ReactElement\n /** The tooltip text. */\n label: string\n }\n}\n\n/** Renders `text` with each backtick span as code. */\nfunction Description(props: Description.Props): ReactNode {\n // Splitting on the backticks puts each code span at an odd index.\n return props.text.split('`').map((part, index) =>\n index % 2 ? (\n <code {...styles.code()} key={index}>\n {part}\n </code>\n ) : (\n part\n ),\n )\n}\n\ndeclare namespace Description {\n type Props = {\n /** The description, with code spans in backticks. */\n text: string\n }\n}\n\n/** A labeled arrow between two nodes. */\nfunction Arrow(props: Arrow.Props): ReactNode {\n return (\n <span {...styles.arrow()} aria-label={props.label ?? 'Then'} role=\"img\">\n <span {...styles.edge()}>{props.label}</span>\n <span {...styles.shaft()}>\n <span {...styles.line()} />\n <ChevronRight {...styles.head()} />\n </span>\n </span>\n )\n}\n\ndeclare namespace Arrow {\n type Props = {\n /** The request or event. */\n label?: string | undefined\n }\n}\n\n/** A step outside Tempo ID's pages, such as a provider. */\nfunction External(props: External.Props): ReactNode {\n return (\n <div {...styles.external({ kind: props.kind })}>\n <span {...styles.kind()}>{props.kind}</span>\n <span {...styles.externalName()}>{props.name}</span>\n {props.detail ? <code {...styles.detail()}>{props.detail}</code> : null}\n </div>\n )\n}\n\ndeclare namespace External {\n type Props = {\n /** A secondary line, such as the entry request. */\n detail?: string | undefined\n /** Where the step sits in its flow. */\n kind: 'Entry' | 'Exit' | 'External'\n /** The step's name. */\n name: string\n }\n}\n\n/** A sample app's own screen, in the style of a food-delivery app. */\nfunction AppScreen(props: AppScreen.Props): ReactNode {\n return (\n <div {...styles.app()}>\n <header {...styles.appHeader()}>\n <h4 {...styles.appTitle()}>{props.title}</h4>\n {props.description ? (\n <p {...styles.appDescription()}>{props.description}</p>\n ) : null}\n </header>\n {props.children}\n </div>\n )\n}\n\ndeclare namespace AppScreen {\n type Props = {\n /** The screen's controls. */\n children?: ReactNode | undefined\n /** The line below the title. */\n description?: string | undefined\n /** The screen's heading. */\n title: string\n }\n}\n\n/** A pill button in the sample app's style. */\nfunction AppButton(props: AppButton.Props): ReactNode {\n return (\n // oxlint-disable-next-line tds/prefer-component -- The sample app draws its own controls.\n <button {...styles.appButton({ tone: props.tone })} type=\"button\">\n {props.children}\n </button>\n )\n}\n\ndeclare namespace AppButton {\n type Props = {\n /** The button's label. */\n children: ReactNode\n /** The brand red, or a quiet gray. */\n tone: 'brand' | 'quiet'\n }\n}\n\n/** The sample app's labeled email field. */\nfunction AppEmailField(): ReactNode {\n return (\n <label {...styles.appField()}>\n <span {...styles.appLabel()}>Email</span>\n {/* oxlint-disable-next-line tds/prefer-component -- The sample app draws its own controls. */}\n <input {...styles.appInput()} placeholder=\"Required\" readOnly />\n </label>\n )\n}\n\n/** The sample app's sign-in: a passkey, or an email. */\nfunction AppSignIn(): ReactNode {\n return (\n <AppScreen title=\"Sign in or sign up\">\n <AppButton tone=\"quiet\">Continue with passkey</AppButton>\n <p {...styles.appDivider()}>or continue with email</p>\n <AppEmailField />\n <AppButton tone=\"brand\">Continue</AppButton>\n </AppScreen>\n )\n}\n\n/** The sample app's email step for an unlinked passkey. */\nfunction AppEmail(): ReactNode {\n return (\n <AppScreen\n description=\"Sign in with your email to link this passkey.\"\n title=\"Add your email\"\n >\n <AppEmailField />\n <AppButton tone=\"brand\">Continue</AppButton>\n </AppScreen>\n )\n}\n\n/** The sample app's code step. */\nfunction AppCode(): ReactNode {\n return (\n <AppScreen\n description={`Enter the 6-digit code sent to ${email}.`}\n title=\"Check your email\"\n >\n <CodeInput aria-label=\"Code\" length={6} readOnly />\n <AppButton tone=\"brand\">Verify</AppButton>\n </AppScreen>\n )\n}\n\n/** The sample app after the sign-in. */\nfunction AppSignedIn(): ReactNode {\n return (\n <AppScreen description={email} title=\"You're signed in\">\n <p {...styles.appAddress()}>{accounts[0].address}</p>\n <AppButton tone=\"quiet\">Sign out</AppButton>\n </AppScreen>\n )\n}\n\n/** A handler that does nothing. */\nfunction noop() {}\n\n/** A form handler that stops the submission. */\nfunction prevent(event: FormEvent<HTMLFormElement>) {\n event.preventDefault()\n}\n\n/** The sample accounts: one that Privy owns, and one that a passkey owns. */\nconst accounts = [\n {\n address: '0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9f3c',\n balance: { amount: '1250.5', currency: 'USD' },\n owner: 'privy',\n realm: null,\n },\n {\n address: '0x7c4d2e9a1b3f5c7d9e0a2b4c6d8e0f1a3b5c21ab',\n balance: { amount: '42', currency: 'USD' },\n owner: 'webAuthn',\n realm: null,\n },\n] as const satisfies readonly ChooseAccount.Account[]\n\n/** The sample email address. */\nconst email = 'user@example.com'\n\n/** The sample refusal of an upstream service. */\nconst unavailable = 'An upstream service is unavailable. Retry later.'\n\n/** The sample key: 100 USD a day for a week, in pathUSD. */\nfunction key(): Approval.Key {\n return {\n calls: [],\n expiry: Math.floor(Date.now() / 1000) + 7 * 24 * 60 * 60,\n limits: [\n {\n amount: '100',\n currency: 'USD',\n period: 24 * 60 * 60,\n tokens: [{ amount: '100', symbol: 'pathUSD' }],\n },\n ],\n unrecognized: [],\n }\n}\n\n/** Sample `Approval` props for a key, before a decision. */\nfunction approval(): Approval.Props {\n return {\n app: 'Tempo Wallet',\n approving: false,\n denying: false,\n destination: 'wallet.tempo.xyz',\n email,\n heading: 'h4',\n keyAuthorization: key(),\n onApprove: noop,\n onDeny: noop,\n verified: true,\n }\n}\n\n/** The sample sign-in request, with its key. */\nfunction signInRequest(): NonNullable<SignIn.Props['request']> {\n return { app: 'Tempo Wallet', key: key(), verified: true }\n}\n\n/** The sample sign-in request, without a key. */\nfunction appRequest(): NonNullable<SignIn.Props['request']> {\n return { app: 'Tempo Wallet', key: null, verified: true }\n}\n\n/** The sample account that the account step chose. */\nfunction selectedAccount(): NonNullable<Approval.Props['account']> {\n return { address: accounts[0].address, owner: accounts[0].owner }\n}\n\n/** The entry of a signed-out redirect with a key. */\nconst keyedEntry = {\n detail: 'GET /oauth2/authorize?…&key_authorization',\n name: 'Web app',\n} as const satisfies Node\n\n/** Sample `Account` props for a signed-in user. */\nfunction account(): Account.Props {\n return {\n accounts: [accounts[0]],\n email,\n heading: 'h4',\n onAddPasskey: noop,\n onSignOut: noop,\n signingOut: false,\n }\n}\n\n/** Sample `Account` props on a configurable chain, whose only account is `accounts[index]`. */\nfunction configurable(index: 0 | 1): Account.Props {\n return {\n ...account(),\n // An account that Tempo ID created is configurable from its creation, and a linked wallet.tempo\n // passkey's account is not until its upgrade.\n accounts: [{ ...accounts[index], configurable: index === 0 }],\n onAddOwner: noop,\n passkeys: true,\n }\n}\n\n/** Sample `ChooseAccount` props, with nothing chosen. */\nfunction chooseAccount(): ChooseAccount.Props {\n return { accounts, app: 'Tempo Wallet', heading: 'h4', onChoose: noop }\n}\n\n/** Sample `DeviceApproval` props, before a submission. */\nfunction deviceApproval(): DeviceApproval.Props {\n return {\n approving: false,\n code: '',\n denying: false,\n email,\n fetching: false,\n heading: 'h4',\n invalid: false,\n onApprove: noop,\n onDeny: noop,\n onSubmitCode: prevent,\n }\n}\n\n/** A sample `tempo-id login` request, with its key. */\nfunction deviceRequest(): DeviceApproval.Request {\n return {\n app: { name: 'Tempo CLI' },\n created_at: Math.floor(Date.now() / 1000),\n device: 'ada-macbook',\n ip: '203.0.113.7',\n key_authorization: key(),\n location: 'San Francisco, US',\n user_code: 'BDWP-HQPK',\n }\n}\n\n/** The entry of `tempo-id login`, which requests a code and a key. */\nconst loginEntry = {\n detail: 'POST /device/code with key_authorization',\n name: 'tempo-id login',\n} as const satisfies Node\n\n/** The exit of `tempo-id login`: the poll for the tokens and the signed key. */\nconst loginExit = {\n detail:\n 'Tokens and key_authorization, stored in ~/.tempo/id/credentials.json. A replaced session’s refresh token goes to POST /oauth2/revoke.',\n edge: 'POST /oauth2/token: authorization_pending, then tokens',\n name: 'tempo-id login',\n} as const satisfies Node\n\n/** Sample `WalletUpgrade` props, before the upgrade. */\nfunction walletUpgrade(): WalletUpgrade.Props {\n return {\n heading: 'h4',\n onContinue: noop,\n onSkip: noop,\n upgrading: false,\n }\n}\n\n/** Sample `SignIn` props, before a submission, with every method. */\nfunction signIn(): SignIn.Props {\n return {\n heading: 'h4',\n invalid: false,\n onChangeEmail: noop,\n onPasskey: noop,\n onResend: noop,\n onStartOver: noop,\n onSubmitCode: prevent,\n onSubmitEmail: prevent,\n resend: 'idle',\n sending: false,\n verifying: false,\n }\n}\n\n/** The entry of an app's redirect to `/oauth2/authorize`. */\nconst redirectEntry = {\n detail: 'GET /oauth2/authorize?client_id&redirect_uri&code_challenge&state',\n name: 'Web app',\n} as const satisfies Node\n\n/** The page-load requests that select a headless app's own sign-in. */\nconst appSignInEdge = 'GET /v1/auth/session: no user'\n\n/** The exit of an app's redirect: the code redemption. */\nconst tokenExit = {\n detail: 'Access, ID, and refresh tokens',\n edge: 'POST /oauth2/token with code_verifier',\n name: 'Web app',\n} as const satisfies Node\n\n/**\n * Every flow, by group. Update it with any flow it shows. It runs on mount, so sample times read\n * the clock then.\n */\nfunction sections(): readonly Section[] {\n return [\n {\n flows: [\n {\n description:\n 'A visitor opens Tempo ID without a session and signs in with an emailed code. An accepted code shows green for 500 ms before the sign-in continues.',\n nodes: [\n { detail: 'GET /', name: 'Browser opens Tempo ID' },\n {\n edge: 'Page /login',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify: 200',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect: null',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Email code',\n },\n {\n description:\n 'A passkey of the realm signs the user in with one prompt, from the button.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n detail: 'POST /v1/auth/passkey/options, as the page shows',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n {\n detail: 'The options that the page requested',\n edge: 'Sign in with a passkey',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/auth/passkey/verify',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Passkey',\n },\n {\n description:\n 'A wallet.tempo passkey without an email verifies one with a code. The passkey signs again with the code, which links it to the user.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n detail: 'POST /v1/auth/passkey/options, as the page shows',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n {\n detail: 'The options that the page requested',\n edge: 'Sign in with a passkey',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/auth/passkey/verify: step email',\n name: 'Sign in (link passkey)',\n screen: <SignIn {...signIn()} linking />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email (link passkey)',\n screen: <SignIn {...signIn()} email={email} linking />,\n },\n {\n detail: 'POST /v1/auth/passkey/options with link and authorize',\n edge: 'Code complete',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/auth/code/verify with link and assertion: 200',\n name: 'Check your email (link accepted)',\n screen: <SignIn {...signIn()} email={email} linking verified />,\n },\n {\n edge: 'after 500 ms, redirect: null',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Passkey: adds an email',\n },\n {\n description:\n 'Start over on the email step drops the passkey’s link and a pending code request, so the passkey stays unlinked.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'Sign in with a passkey, POST /v1/auth/passkey/verify: step email',\n name: 'Sign in (link passkey)',\n screen: <SignIn {...signIn()} linking />,\n },\n {\n edge: 'Start over',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n ],\n title: 'Passkey: start over',\n },\n {\n description:\n 'Realms without a passkey relying party at Tempo ID’s origin leave only the email field.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: '200, passkeys: false',\n name: 'Sign in (email only)',\n screen: <SignIn {...signIn()} onPasskey={undefined} />,\n },\n ],\n title: 'Email only: no passkey',\n },\n {\n description:\n 'Each sign-in request holds its controls, shows a spinner, and announces its progress until it settles. One sign-in runs at a time.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'Continue, POST /v1/auth/code',\n name: 'Sign in (sending)',\n screen: <SignIn {...signIn()} sending />,\n },\n {\n edge: 'Or: Sign in with a passkey',\n name: 'Sign in (passkey pending)',\n screen: <SignIn {...signIn()} passkeyPending />,\n },\n {\n edge: 'Code complete, POST /v1/auth/code/verify',\n name: 'Check your email (verifying)',\n screen: <SignIn {...signIn()} email={email} verifying />,\n },\n {\n edge: 'Or: Resend code, POST /v1/auth/code',\n name: 'Check your email (resending)',\n screen: <SignIn {...signIn()} email={email} resend=\"pending\" />,\n },\n ],\n title: 'Sign-in: in progress',\n },\n ],\n title: 'Sign-in',\n },\n {\n flows: [\n {\n description:\n 'The account page lists the user’s Tempo Accounts in the `default` realm, oldest first, each with its balance and a deposit link. A lone wallet shows its balance large, without a list.',\n nodes: [\n { detail: 'GET /', name: 'Browser opens Tempo ID' },\n {\n edge: 'GET /v1/account?chain, 200, one wallet',\n name: 'Your account (one wallet)',\n screen: <Account {...account()} />,\n },\n {\n edge: 'Or: several wallets',\n name: 'Your account (several wallets)',\n screen: <Account {...account()} accounts={accounts} />,\n },\n {\n edge: 'Or: a balance read fails',\n name: 'Your account (balance unavailable)',\n screen: (\n <Account\n {...account()}\n accounts={[accounts[0], { ...accounts[1], balance: null }]}\n />\n ),\n },\n {\n edge: 'Or: no wallet, POST /v1/account with chain creates the first one, 200 with its balance',\n name: 'Your account (wallet created)',\n screen: <Account {...account()} />,\n },\n {\n edge: 'Or: the realm creates no wallets on the server, but holds passkeys',\n name: 'Your account (no wallets)',\n screen: <Account {...account()} accounts={[]} />,\n },\n {\n edge: 'Or: the realm creates no wallets at all',\n name: 'Your account (no wallet possible)',\n screen: (\n <Account\n {...account()}\n accounts={[]}\n onAddPasskey={undefined}\n />\n ),\n },\n {\n edge: 'Or: the accounts cannot be read',\n name: 'Your account (unavailable)',\n screen: (\n <Account\n {...account()}\n accountError=\"Your wallets failed to load. Reload the page to try again.\"\n accounts={null}\n />\n ),\n },\n ],\n title: 'Account page',\n },\n {\n description:\n 'On a test chain, such as testnet, each deposit icon funds its wallet from the chain’s faucet through `POST /i/account/fund`, one request at a time. Tempo mainnet has no faucet, so its deposit icon opens `/deposit`.',\n nodes: [\n { detail: 'GET /?chain=testnet', name: 'Browser' },\n {\n edge: 'GET /v1/account?chain=testnet, 200',\n name: 'Your account (test chain)',\n screen: (\n <Account\n {...account()}\n accounts={[\n {\n ...accounts[0],\n balance: { amount: '0', currency: 'USD' },\n },\n ]}\n onFund={noop}\n />\n ),\n },\n {\n edge: 'Deposit icon, POST /i/account/fund',\n name: 'Your account (funding)',\n screen: (\n <Account\n {...account()}\n accounts={[\n {\n ...accounts[0],\n balance: { amount: '0', currency: 'USD' },\n },\n ]}\n funding={accounts[0].address}\n onFund={noop}\n />\n ),\n },\n {\n edge: '200 with the transfers, GET /v1/account?chain=testnet',\n name: 'Your account (funded)',\n screen: (\n <Account\n {...account()}\n accounts={[\n {\n ...accounts[0],\n balance: { amount: '5000000', currency: 'USD' },\n },\n ]}\n onFund={noop}\n />\n ),\n },\n {\n edge: 'Or: the node fails, 503 upstream_unavailable',\n name: 'Your account (faucet unavailable)',\n screen: (\n <Account\n {...account()}\n accounts={[\n {\n ...accounts[0],\n balance: { amount: '0', currency: 'USD' },\n },\n ]}\n error={unavailable}\n onFund={noop}\n />\n ),\n },\n ],\n title: 'Account page: testnet faucet',\n },\n {\n description:\n 'In one click, the account page adds a passkey of the `default` realm, which signs the user in and owns a new passkey wallet. The page offers it only when the realm holds passkeys and the user has no passkey wallet.',\n nodes: [\n { detail: 'GET /', name: 'Browser opens Tempo ID' },\n {\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n {\n edge: 'Add passkey, POST /v1/account/passkey/options, navigator.credentials.create(), POST /v1/account/passkey, navigator.credentials.get()',\n name: 'Your account (adding a passkey)',\n screen: <Account {...account()} addingPasskey />,\n },\n {\n edge: 'POST /v1/account/passkey/verify, 200, then the accounts load again, and a toast: Passkey added',\n name: 'Your account (passkey added)',\n screen: (\n <Account\n {...account()}\n accounts={accounts}\n onAddPasskey={undefined}\n passkeyAdded\n />\n ),\n },\n {\n edge: 'Or: the ceremony is canceled',\n name: 'Your account (passkey canceled)',\n screen: (\n <Account\n {...account()}\n error=\"Adding a passkey was canceled. Try again.\"\n />\n ),\n },\n {\n edge: 'Or: the session signed in more than 10 minutes before',\n name: 'Your account (sign in again)',\n screen: (\n <Account\n {...account()}\n error=\"Sign in again: adding a passkey needs a sign-in within the last 10 minutes.\"\n />\n ),\n },\n {\n edge: 'Or: the accounts failed to load, and the device already holds one of the user’s passkeys',\n name: 'Your account (passkey held)',\n screen: (\n <Account\n {...account()}\n error=\"This device already holds one of your passkeys. Add a passkey on another device.\"\n />\n ),\n },\n ],\n title: 'Account page: add a passkey',\n },\n {\n description:\n 'On a chain that `CONFIGURABLE_ACCOUNTS` names, a cloud wallet’s configurable account adds a passkey as a second owner. The cloud wallet signs the configuration update, so the wallet keeps its address, and either owner then signs alone.',\n nodes: [\n { detail: 'GET /?chain=local', name: 'Browser opens Tempo ID' },\n {\n name: 'Your account (configurable chain)',\n screen: <Account {...configurable(0)} />,\n },\n {\n edge: 'Add passkey, POST /v1/account/passkey/options, navigator.credentials.create(), POST /v1/account/passkey, navigator.credentials.get()',\n name: 'Your account (adding a passkey)',\n screen: <Account {...configurable(0)} addingPasskey />,\n },\n {\n edge: 'POST /v1/account/passkey/verify with account: the cloud wallet signs the update, and a toast: Passkey added',\n name: 'Your account (passkey added)',\n screen: (\n <Account\n {...configurable(0)}\n accounts={[\n {\n ...accounts[0],\n configurable: true,\n owners: ['privy', 'webAuthn'],\n },\n ]}\n ownerAdded=\"passkey\"\n />\n ),\n },\n {\n edge: 'Or: the chain refuses the change, or the Tempo API’s sponsor fails',\n name: 'Your account (change failed)',\n screen: (\n <Account\n {...configurable(0)}\n error=\"An upstream service is unavailable. Retry later.\"\n />\n ),\n },\n ],\n title: 'Add a passkey to a cloud wallet',\n },\n {\n description:\n 'On a chain that `CONFIGURABLE_ACCOUNTS` names, a linked wallet.tempo passkey’s wallet upgrades in place, with the passkey as its only owner. One click signs the prepared passkey step, and the wallet keeps its address.',\n nodes: [\n {\n detail:\n 'GET /?chain=local, then POST /v1/account/upgrade, 200, the passkey step',\n name: 'Browser opens Tempo ID',\n },\n {\n name: 'Your account (upgrade)',\n screen: <Account {...configurable(1)} onUpgrade={noop} />,\n },\n {\n edge: 'Or: the user holds a cloud wallet too, and each wallet’s row offers its own change as an icon',\n name: 'Your account (two wallets)',\n screen: (\n <Account\n {...configurable(1)}\n accounts={[\n { ...accounts[0], configurable: true },\n { ...accounts[1], configurable: false },\n ]}\n onUpgrade={noop}\n />\n ),\n },\n {\n edge: 'Upgrade wallet, navigator.credentials.get(), POST /v1/account/upgrade with passkey.assertion',\n name: 'Your account (upgrading)',\n screen: (\n <Account\n {...configurable(1)}\n onUpgrade={noop}\n upgrading={accounts[1].address}\n />\n ),\n },\n {\n edge: '200, the account at version 1, and a toast: Wallet upgraded',\n name: 'Your account (upgraded)',\n screen: (\n <Account\n {...configurable(1)}\n accounts={[{ ...accounts[1], configurable: true }]}\n />\n ),\n },\n {\n edge: 'Or: the chain refuses the upgrade, or the Tempo API’s sponsor fails',\n name: 'Your account (upgrade failed)',\n screen: (\n <Account\n {...configurable(1)}\n error=\"An upstream service is unavailable. Retry later.\"\n onUpgrade={noop}\n />\n ),\n },\n ],\n title: 'Upgrade a passkey wallet',\n },\n {\n description:\n 'When `CONFIGURABLE_ACCOUNTS` names the sign-in page’s `chain`, a wallet.tempo user receives no cloud wallet. Before the account page, Continue on the upgrade step links the passkey and signs its upgrade.',\n nodes: [\n {\n detail:\n 'GET /?chain=local, page /login?chain=local, then POST /v1/auth/code/verify: 200',\n name: 'Browser signs in by email',\n },\n {\n edge: 'GET /i/account/upgrades?chain=local, then POST /v1/account/upgrade with credentialId, 200, the passkey step',\n name: 'Upgrade your wallet',\n screen: <WalletUpgrade {...walletUpgrade()} />,\n },\n {\n edge: 'Continue, POST /v1/account/upgrade with passkey.assertion, which links the passkey',\n name: 'Upgrade your wallet (upgrading)',\n screen: <WalletUpgrade {...walletUpgrade()} upgrading />,\n },\n {\n edge: 'Or: the passkey ceremony fails, or the upgrade is refused',\n name: 'Upgrade your wallet (failed)',\n screen: (\n <WalletUpgrade\n {...walletUpgrade()}\n error=\"Your passkey did not sign the upgrade. Continue to try again.\"\n />\n ),\n },\n {\n edge: 'redirect: null, GET /?chain=local',\n name: 'Your account (upgraded)',\n screen: (\n <Account\n {...configurable(1)}\n accounts={[{ ...accounts[1], configurable: true }]}\n />\n ),\n },\n ],\n title: 'Sign-in: upgrade a wallet.tempo passkey',\n },\n {\n description:\n 'A wallet.tempo user who chooses Not now on the upgrade step holds no configurable wallet yet. The account page lists that passkey’s wallet from `GET /i/account/passkeys`, and one click links the passkey and signs its upgrade.',\n nodes: [\n {\n detail: 'Not now, then GET /?chain=local',\n name: 'Browser signs in',\n },\n {\n edge: 'GET /i/account/passkeys, then POST /v1/account/upgrade with credentialId, 200, the passkey step',\n name: 'Your account (wallet.tempo passkey)',\n screen: (\n <Account\n {...configurable(1)}\n accounts={[\n {\n ...accounts[1],\n credentialId: 'KEbWNCc7NgaYnUyrNeFGX9_3Y-8',\n },\n ]}\n onUpgrade={noop}\n />\n ),\n },\n {\n edge: 'Upgrade wallet, POST /v1/account/upgrade with passkey.assertion, which links the passkey, and a toast: Wallet upgraded',\n name: 'Your account (upgraded)',\n screen: (\n <Account\n {...configurable(1)}\n accounts={[{ ...accounts[1], configurable: true }]}\n />\n ),\n },\n ],\n title: 'Account page: upgrade a wallet.tempo passkey',\n },\n {\n description:\n 'The account page and the deposit page send a visitor without a session to sign-in, which then opens the account page. The deposit page leaves the address out of the sign-in query.',\n nodes: [\n { detail: 'GET / or GET /deposit?address', name: 'Browser' },\n {\n edge: 'GET /v1/account: session_required, page /login',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify: 200',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect: null, GET /',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Account page: signed out',\n },\n {\n description:\n 'Deposit lists the networks and cash methods for one of the user’s wallets. Only Tempo is available, and it shows the wallet’s address as a QR code and as text.',\n nodes: [\n { detail: 'GET /', name: 'Browser opens Tempo ID' },\n {\n edge: '200, one wallet',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n {\n edge: 'Deposit, GET /deposit?address',\n name: 'Deposit',\n screen: <Deposit address={accounts[0].address} heading=\"h4\" />,\n },\n {\n edge: 'Tempo, GET /deposit?address&method=tempo',\n name: 'Receive funds',\n screen: (\n <Deposit\n address={accounts[0].address}\n heading=\"h4\"\n method=\"tempo\"\n />\n ),\n },\n {\n edge: 'Back, GET /deposit?address',\n name: 'Deposit',\n screen: <Deposit address={accounts[0].address} heading=\"h4\" />,\n },\n {\n edge: 'Back, GET /',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Deposit',\n },\n {\n description: 'Done on Receive funds opens the account page at once.',\n nodes: [\n { detail: 'GET /deposit?address&method=tempo', name: 'Browser' },\n {\n edge: '200 deposit page',\n name: 'Receive funds',\n screen: (\n <Deposit\n address={accounts[0].address}\n heading=\"h4\"\n method=\"tempo\"\n />\n ),\n },\n {\n edge: 'Done, GET /',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Deposit: done',\n },\n {\n description:\n 'An address that is not one of the user’s wallets in the `default` realm shows no address. A spent rate limit or a failed account read shows its own reason in the same place.',\n nodes: [\n {\n detail: 'GET /deposit?address (not the user’s)',\n name: 'Browser',\n },\n {\n edge: '200, address: null',\n name: 'Deposit (wallet not found)',\n screen: (\n <Deposit\n error=\"This wallet was not found. Go back to your account, then choose Deposit.\"\n heading=\"h4\"\n />\n ),\n },\n {\n edge: 'Or: the account rate limit is spent',\n name: 'Deposit (rate limited)',\n screen: (\n <Deposit\n error=\"Too many requests. Try again in 1 minute.\"\n heading=\"h4\"\n />\n ),\n },\n {\n edge: 'Or: the accounts cannot be read',\n name: 'Deposit (unavailable)',\n screen: (\n <Deposit\n error=\"Your wallets failed to load. Reload the page to try again.\"\n heading=\"h4\"\n />\n ),\n },\n ],\n title: 'Deposit: unknown wallet',\n },\n {\n description:\n 'A page path that no route serves responds with status 404 and the not-found screen, which links to the account page. An API path, such as `/v1/…` or `/oauth2/…`, responds with `unknown_endpoint` instead.',\n nodes: [\n { detail: 'GET /nope', name: 'Browser' },\n {\n edge: '404',\n name: 'Page not found',\n screen: <NotFound heading=\"h4\" />,\n },\n {\n edge: 'Go to your account, GET /',\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n ],\n title: 'Unknown page: 404',\n },\n ],\n title: 'Account and deposit',\n },\n {\n flows: [\n {\n description:\n 'A web app redirects a signed-out user to the sign-in page, which names the app of the request that Better Auth signs. A page on Tempo ID’s site can first prefetch the sign-in page’s assets from `GET /v1/auth/assets`.',\n nodes: [\n redirectEntry,\n {\n edge: 'Page /login?…&sig, GET /login: request without key',\n name: 'Sign in (app)',\n screen: <SignIn {...signIn()} request={appRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'after 500 ms, redirect',\n name: 'Web app callback',\n },\n tokenExit,\n ],\n title: 'Redirect: signed out',\n },\n {\n description:\n 'A signed-out user’s request with a key shows the app and the key on the sign-in page. The first sign-in of the request grants the key, so the browser returns to the app without the approval page.',\n nodes: [\n keyedEntry,\n {\n edge: 'Page /login?…&sig, GET /login: request',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200, grants the key',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'after 500 ms, redirect',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant',\n },\n {\n description:\n 'On the sign-in page, the passkey’s challenge is the digest of the request’s key. One assertion signs the user in and signs the key, for an account that this passkey owns, or that Privy or secp256k1 owns.',\n nodes: [\n keyedEntry,\n {\n edge: 'Page /login?…&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n detail:\n 'POST /v1/auth/passkey/options with oauth_query, as the page shows: the key’s digest',\n edge: 'Sign in with a passkey',\n name: 'Authenticator prompt',\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/auth/passkey/verify with oauth_query, grants the key',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant: passkey sign-in with key signature',\n },\n {\n description:\n 'When the account reads are spent, the account step does not run, so a user with several accounts receives no grant. The approval page opens, and holds Approve until a reload after a minute.',\n nodes: [\n keyedEntry,\n {\n edge: 'Page /login?…&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: ACCOUNT_LIMIT spent, no account step, several accounts: no grant',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect /authorize?…&sig',\n name: 'Authorize this app (unavailable)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{ ...key(), refusal: 'unavailable' }}\n />\n ),\n },\n {\n edge: 'Reload after a minute',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant: account reads spent',\n },\n {\n description:\n 'A held grant covers only the request that the sign-in spent. A request with another `scope`, or with a `challenge`, takes no held grant on the account step, so the approval page opens.',\n nodes: [\n {\n detail: 'GET /choose-account?…&sig, another scope or a challenge',\n name: 'Browser',\n },\n {\n edge: '200 account step',\n name: 'Choose a wallet',\n screen: <ChooseAccount {...chooseAccount()} />,\n },\n {\n edge: 'Choose, POST /v1/authorize/account: another scope, no held grant, redirect /authorize?…&sig',\n name: 'Authorize this app (another scope)',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Or: a challenge, which takes no grant, redirect /authorize?…&sig',\n name: 'Authorize this app (challenge)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{\n ...key(),\n challenge: 'Sign in to api.example.com\\nNonce: 8f2a91',\n }}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant: another request',\n },\n {\n description:\n 'A user with several accounts in the app’s realms chooses one, and the choice takes the sign-in’s grant, which lasts 10 minutes. A passkey that owns the chosen account first signs the key on this step.',\n nodes: [\n keyedEntry,\n {\n edge: 'Page /login?…&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200, holds the grant',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect /choose-account?…&sig',\n name: 'Choose a wallet',\n screen: <ChooseAccount {...chooseAccount()} />,\n },\n {\n edge: 'Choose, POST /v1/authorize/account',\n name: 'Choose a wallet (selecting)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n selecting={accounts[0].address}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'takes the held grant, redirect (a passkey account: passkey step, then POST again with the assertion)',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant: account step',\n },\n {\n description:\n 'A sign-in that cannot grant the key keeps the redirect to the approval page, which shows the request again. Causes include another passkey that owns the account, a replayed request, a refused key, a spent rate limit, or an upstream failure.',\n nodes: [\n keyedEntry,\n {\n edge: 'Page /login?…&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'Sign-in with oauth_query: the grant fails, redirect /authorize?…&sig',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Authorize this app (approving)',\n screen: <Approval {...approval()} approving />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'redirect, or the passkey step first',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant: falls back to approval',\n },\n {\n description:\n 'The account step’s signed query expires 10 minutes after the sign-in, just before its held grant. A later choice is refused with `authorization_expired`, so the user starts again in the app.',\n nodes: [\n keyedEntry,\n {\n edge: 'Page /login?…&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200, holds the grant',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect /choose-account?…&sig',\n name: 'Choose a wallet',\n screen: <ChooseAccount {...chooseAccount()} />,\n },\n {\n edge: 'After 10 minutes, Choose, POST /v1/authorize/account: authorization_expired',\n name: 'Choose a wallet (request expired)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n error=\"Expired authorization request: the request from the app is no longer valid. Return to the app, and start again.\"\n />\n ),\n },\n {\n detail:\n 'GET /oauth2/authorize?…&key_authorization, a new request',\n edge: 'Return to the app, and start again',\n name: 'Web app',\n },\n ],\n title: 'Sign-in grant: account step expired',\n },\n {\n description:\n 'A request with a `challenge` signs a message that only the approval page shows. So the sign-in page names the app but shows no key, and the sign-in grants nothing.',\n nodes: [\n {\n ...keyedEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization&challenge',\n },\n {\n edge: 'Page /login?…&sig, GET /login: request without key',\n name: 'Sign in (app)',\n screen: <SignIn {...signIn()} request={appRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect /authorize?…&sig',\n name: 'Authorize this app (challenge)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{\n ...key(),\n challenge: 'Sign in to api.example.com\\nNonce: 8f2a91',\n }}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Sign-in grant: with a challenge',\n },\n {\n description:\n 'A signed-in user returns to an app that skips consent at once. Tempo ID shows no screen.',\n nodes: [\n redirectEntry,\n {\n detail: 'GET redirect_uri?code&state',\n edge: '302, no screen',\n name: 'Web app callback',\n },\n tokenExit,\n ],\n title: 'Redirect: signed in',\n },\n {\n description:\n 'A request with `prompt=login` asks a signed-in user to sign in again. The sign-in page shows the request, and its key, despite the session.',\n nodes: [\n {\n ...keyedEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization&prompt=login',\n },\n {\n edge: 'Page /login?…&prompt=login consent&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200, grants the key',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'after 500 ms, redirect',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Redirect: prompt=login',\n },\n {\n description:\n 'A signed-in user approves a third-party app, which never skips consent, once for the scopes it requests. The request carries no key, so the page shows none.',\n nodes: [\n redirectEntry,\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app (no key)',\n screen: <Approval {...approval()} keyAuthorization={undefined} />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Web app callback',\n },\n tokenExit,\n ],\n title: 'Approval: no key',\n },\n {\n description:\n 'A signed-in user’s request with a key opens the approval page, which holds Approve until the account read streams in. A Privy or secp256k1 owner signs the key on the server when the user approves.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig, GET /i/authorize/request',\n name: 'Authorize this app (checking)',\n screen: <Approval {...approval()} checking />,\n },\n {\n edge: 'GET /v1/authorize/request streams in: the account and any refusal',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Authorize this app (approving)',\n screen: <Approval {...approval()} approving />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'redirect',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: key',\n },\n {\n description:\n 'A key on a chain other than mainnet shows its chain as a gray tag on the permissions card. The tag shows the name that `GET /v1/chains` lists, or else the chain ID.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization with chainId',\n },\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app (another chain)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{\n ...key(),\n chain: { id: 31318, name: 't14' },\n }}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: key on another chain',\n },\n {\n description:\n 'A third-party app names its metadata document’s URL, or its origin, as `client_id`, and registers nothing. The page shows the host beside the name, marks no name as verified, and grants only keys that name expiry, limits, and scopes.',\n nodes: [\n {\n detail:\n 'GET /oauth2/authorize?client_id=https://app.example.com/.well-known/oauth-client-metadata.json&key_authorization',\n name: 'Third-party app',\n },\n {\n edge: \"GET client_id: the metadata document or the origin's manifest, page /authorize?…&sig\",\n name: 'Authorize this app (third-party)',\n screen: (\n <Approval\n {...approval()}\n app=\"Example\"\n destination=\"app.example.com\"\n verified={false}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Third-party app callback',\n },\n {\n detail: 'Tokens, account, and key_authorization',\n edge: 'POST /oauth2/token with code_verifier',\n name: 'Third-party app',\n },\n ],\n title: 'Third-party app',\n },\n {\n description:\n 'A third-party app’s key that leaves out its expiry, limits, or scopes returns to the app with `missing_permissions`, before sign-in.',\n nodes: [\n {\n detail:\n 'GET /oauth2/authorize?client_id=https://app.example.com/.well-known/oauth-client-metadata.json&key_authorization (no limits)',\n name: 'Third-party app',\n },\n {\n detail: 'GET redirect_uri?error=invalid_authorization_details',\n edge: 'missing_permissions',\n name: 'Third-party app callback',\n },\n ],\n title: 'Third-party app: missing permissions',\n },\n {\n description:\n 'A passkey owns the account, so the approval returns the passkey step. The passkey signs the key’s digest, and the page approves again.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Authorize this app (approving)',\n screen: <Approval {...approval()} approving />,\n },\n {\n detail: 'Signs the key authorization, over the approving page',\n edge: 'step passkey',\n name: 'Authenticator prompt',\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent with passkey.assertion',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: passkey account',\n },\n {\n description:\n 'When a wallet.tempo passkey’s wallet waits for its upgrade, Approve shows the upgrade step first. The approval follows the upgrade, so the browser returns to the app.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig, GET /v1/authorize/request: refusal upgrade, GET /i/account/passkeys for a passkey that has not linked, POST /v1/account/upgrade, the passkey step',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Approve',\n name: 'Upgrade your wallet',\n screen: <WalletUpgrade {...walletUpgrade()} />,\n },\n {\n edge: 'Or: POST /v1/account/upgrade: reauthentication_required, then Sign in again, POST /v1/auth/logout, and the sign-in page',\n name: 'Upgrade your wallet (sign in again)',\n screen: <WalletUpgrade {...walletUpgrade()} onSignIn={noop} />,\n },\n {\n detail:\n 'Signs the upgrade, then the key authorization, over the upgrading step',\n edge: 'Continue, POST /v1/account/upgrade with passkey.assertion, then POST /v1/authorize/consent, step passkey',\n name: 'Authenticator prompt',\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent with passkey.assertion',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: upgrade after Approve',\n },\n {\n description:\n 'Not now on the upgrade step approves the request without the upgrade, and the passkey signs the key as its own account. The key stops working on that chain once the wallet upgrades, and the account page and the next approval offer the upgrade again.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig, GET /v1/authorize/request: refusal upgrade, then Approve',\n name: 'Upgrade your wallet',\n screen: <WalletUpgrade {...walletUpgrade()} />,\n },\n {\n edge: 'Not now, POST /v1/authorize/consent with skip_upgrade',\n name: 'Upgrade your wallet (skipping)',\n screen: <WalletUpgrade {...walletUpgrade()} skipping />,\n },\n {\n detail:\n 'Signs the key authorization as the passkey’s own account, over the skipping step',\n edge: 'step passkey',\n name: 'Authenticator prompt',\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent with skip_upgrade and passkey.assertion, which links a passkey that has not linked',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: skip the upgrade',\n },\n {\n description:\n 'An app with the `tempo-id:sign` scope sends a challenge, and the approval page shows the message that the key signs.',\n nodes: [\n {\n detail: 'GET /oauth2/authorize?…&key_authorization&challenge',\n name: 'Native app',\n },\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app (challenge)',\n screen: (\n <Approval\n {...approval()}\n app=\"Tempo Mobile\"\n destination=\"tempo\"\n keyAuthorization={{\n ...key(),\n challenge: 'Sign in to api.example.com\\nNonce: 8f2a91',\n }}\n />\n ),\n },\n {\n detail: 'tempo:/callback?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Native app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n name: 'Native app',\n },\n ],\n title: 'Approval: challenge',\n },\n {\n description:\n 'Beside its limits, the approval page lists the `open` and `topUp` calls on the channel reserve as funds held for services. Its info icon links to the Machine Payments Protocol.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app (MPP sessions)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{\n ...key(),\n calls: [{ call: 'open' }, { call: 'topUp' }],\n }}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: MPP sessions',\n },\n {\n description:\n 'The approval page lists a key’s calls that Tempo ID does not recognize, such as a function on another contract, with a warning. A headless request refuses them unless the app holds the `tempo-id:sign` scope.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app (unrecognized calls)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{\n ...key(),\n unrecognized: [\n {\n address: '0xdec0000000000000000000000000000000000000',\n selector: '0x12345678',\n },\n ],\n }}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: unrecognized calls',\n },\n {\n description:\n 'A user with more than one Tempo Account in the app’s realms chooses one, which continues to the approval page. Each row shows the account’s balance on the key’s chain, or Balance unavailable when the read fails.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /choose-account?…&sig',\n name: 'Choose a wallet',\n screen: <ChooseAccount {...chooseAccount()} />,\n },\n {\n edge: 'Or: a balance read fails',\n name: 'Choose a wallet (balance unavailable)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n accounts={[accounts[0], { ...accounts[1], balance: null }]}\n />\n ),\n },\n {\n edge: 'Choose, POST /v1/authorize/account',\n name: 'Choose a wallet (selecting)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n selecting={accounts[0].address}\n />\n ),\n },\n {\n edge: 'redirect /authorize?…&sig, GET /v1/authorize/request: account',\n name: 'Authorize this app (account)',\n screen: <Approval {...approval()} account={selectedAccount()} />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Account step',\n },\n {\n description:\n 'A user with several Tempo Accounts who returns in the same session skips the account step, and the approval page shows the selected account. Sign-out from Tempo ID ends the selection.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig, GET /v1/authorize/request: account',\n name: 'Authorize this app (selected account)',\n screen: <Approval {...approval()} account={selectedAccount()} />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Account step: selection kept',\n },\n {\n description:\n 'An app in several realms, such as web-shared, lists accounts from each. Each row then names its realm, apart from the `default` realm.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n name: 'Web app in two realms',\n },\n {\n edge: 'Page /choose-account?…&sig',\n name: 'Choose a wallet (two realms)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n accounts={[\n { ...accounts[0], realm: 'Tempo Cash' },\n accounts[1],\n ]}\n />\n ),\n },\n {\n edge: 'Choose, POST /v1/authorize/account',\n name: 'Choose a wallet (two realms, selecting)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n accounts={[\n { ...accounts[0], realm: 'Tempo Cash' },\n accounts[1],\n ]}\n selecting={accounts[0].address}\n />\n ),\n },\n {\n edge: 'redirect /authorize?…&sig',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'POST /v1/authorize/consent, accept',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Account step: several realms',\n },\n {\n description:\n 'Denying returns the browser to the app with `error=access_denied`. The app receives no code.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Deny',\n name: 'Authorize this app (denying)',\n screen: <Approval {...approval()} denying />,\n },\n {\n detail: 'GET redirect_uri?error=access_denied&state',\n edge: 'POST /v1/authorize/consent, accept: false',\n name: 'Web app callback',\n },\n ],\n title: 'Approval: denied',\n },\n {\n description:\n 'Approval cannot sign some keys, so the page holds Approve and states why. Deny still returns to the app.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n edge: 'Page /authorize?…&sig: no account, and no Privy app to create one',\n name: 'Authorize this app (no account)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{ ...key(), refusal: 'no_account' }}\n />\n ),\n },\n {\n edge: 'Or: a passkey whose relying party is not Tempo ID’s, or POST /v1/authorize/consent: webauthn_required',\n name: 'Authorize this app (passkey)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{ ...key(), refusal: 'passkey' }}\n />\n ),\n },\n {\n edge: 'Or: a wallet.tempo passkey’s wallet waits for its upgrade, and the page reads no upgrade for it, such as when GET /i/chains fails',\n name: 'Authorize this app (upgrade first)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{ ...key(), refusal: 'upgrade' }}\n />\n ),\n },\n {\n edge: 'Or: the key names an account that the user does not hold',\n name: 'Authorize this app (foreign account)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{ ...key(), refusal: 'foreign_account' }}\n />\n ),\n },\n {\n edge: 'Or: the accounts cannot be read',\n name: 'Authorize this app (unavailable)',\n screen: (\n <Approval\n {...approval()}\n keyAuthorization={{ ...key(), refusal: 'unavailable' }}\n />\n ),\n },\n {\n detail: 'GET redirect_uri?error=access_denied&state',\n edge: 'Deny, POST /v1/authorize/consent, accept: false',\n name: 'Web app callback',\n },\n ],\n title: 'Approval: key it cannot sign',\n },\n {\n description:\n 'A key that breaks a rule returns to the app with the refusal, as `/oauth2/authorize` returns one before sign-in. The `error` names the rule, such as `invalid_authorization_details` for an expired key, or `unauthorized_client` for a challenge without the `tempo-id:sign` scope.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?…&key_authorization',\n },\n {\n detail: 'GET redirect_uri?error&error_description',\n edge: 'key refused',\n name: 'Web app callback',\n },\n ],\n title: 'Refused key',\n },\n {\n description:\n 'A changed or expired query, or a request without a known app, shows an invalid request, on the approval page and on the account step.',\n nodes: [\n { detail: 'GET /authorize?…&sig (changed)', name: 'Browser' },\n {\n edge: '200, request: null',\n name: 'This sign-in request is invalid',\n screen: <InvalidRequest heading=\"h4\" />,\n },\n {\n edge: 'Or: GET /choose-account?…&sig (changed), 200, request: null',\n name: 'This sign-in request is invalid (account step)',\n screen: <InvalidRequest heading=\"h4\" />,\n },\n ],\n title: 'Invalid request',\n },\n {\n description:\n '`/oauth2/authorize` shows the error page, not a redirect, for an unknown or disabled app, a failed metadata document, or an unregistered `redirect_uri`. The page maps `error` to fixed copy and never shows `error_description`.',\n nodes: [\n {\n ...redirectEntry,\n detail: 'GET /oauth2/authorize?client_id (unknown)',\n },\n {\n edge: 'Page /error?error=invalid_client',\n name: 'This app is not recognized',\n screen: <InvalidRequest heading=\"h4\" reason=\"client\" />,\n },\n {\n edge: 'Or: redirect_uri not registered, 302 /error?error=invalid_redirect',\n name: 'This app’s return address is not registered',\n screen: <InvalidRequest heading=\"h4\" reason=\"redirect\" />,\n },\n {\n edge: 'Or: another error, such as unsupported_response_type',\n name: 'This sign-in request is invalid (error page)',\n screen: <InvalidRequest heading=\"h4\" />,\n },\n ],\n title: 'Unknown app or redirect URI',\n },\n {\n description:\n 'A backend runs the redirect flow and redeems the code with its client secret, so tokens never reach the browser. In the test harness, no account in the `default` realm can sign the request’s key, so the approval page holds Approve.',\n nodes: [\n {\n detail: 'GET /auth/start on the backend, with a key',\n name: 'Backend playground',\n },\n {\n edge: '302 /oauth2/authorize with state and code_challenge, page /login?…&sig',\n name: 'Sign in (key)',\n screen: (\n <SignIn\n {...signIn()}\n request={{ ...signInRequest(), app: 'Backend playground' }}\n />\n ),\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200, no account to sign',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect /authorize?…&sig',\n name: 'Authorize this app (no account)',\n screen: (\n <Approval\n {...approval()}\n app=\"Backend playground\"\n destination=\"backend.example.com\"\n keyAuthorization={{ ...key(), refusal: 'no_account' }}\n />\n ),\n },\n {\n detail: 'GET /auth/callback?error=access_denied&state',\n edge: 'Deny, POST /v1/authorize/consent, accept: false',\n name: 'Backend callback',\n },\n {\n detail: 'GET /auth/callback?code&state',\n edge: '302 /auth/start?key=false, 302 /oauth2/authorize, 302, no screen',\n name: 'Backend callback',\n },\n {\n detail: 'Tokens stay on the server, without a key',\n edge: 'POST /oauth2/token with client_secret',\n name: 'Backend session',\n },\n ],\n title: 'Backend app',\n },\n ],\n title: 'App authorization',\n },\n {\n flows: [\n {\n description:\n \"The app's own pages send the code, then verify it with the authorization request, which signs in, creates the first account, and returns the authorization. Tempo ID shows no screen.\",\n nodes: [\n { detail: 'Web playground', name: \"App's sign-in\" },\n {\n edge: appSignInEdge,\n name: 'Sign in',\n owner: 'app',\n screen: <AppSignIn />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n owner: 'app',\n screen: <AppCode />,\n },\n {\n edge: 'POST /v1/auth/code/verify with authorize: user and authorization',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Email code',\n },\n {\n description:\n \"A wallet.tempo passkey owns the user's account, so the code signs no key, and the sign-in returns the passkey step. The passkey then signs the key's digest on the app's page, with no approval page, when its relying party covers the page.\",\n nodes: [\n { detail: 'Web playground', name: \"App's sign-in\" },\n {\n edge: appSignInEdge,\n name: 'Sign in',\n owner: 'app',\n screen: <AppSignIn />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n owner: 'app',\n screen: <AppCode />,\n },\n {\n detail:\n 'POST /v1/auth/code/verify with authorize and passkey: step passkey',\n edge: 'Code complete',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/authorize with expiry and passkey: { assertion }: authorization',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Email code: passkey account',\n },\n {\n description:\n 'A signed-in user skips the code. The app requests the authorization at once.',\n nodes: [\n { detail: 'Session cookie set', name: \"App's page\" },\n {\n edge: 'GET /v1/auth/session, POST /v1/authorize',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Email code: signed in',\n },\n {\n description:\n \"The app's page runs the passkey ceremony with its client ID, which selects the app's realms, and its authorization request. The challenge is the key's digest, so one assertion signs the user in and signs the key of the passkey's account, with no approval page.\",\n nodes: [\n { detail: 'Web playground', name: \"App's sign-in\" },\n {\n edge: appSignInEdge,\n name: 'Sign in',\n owner: 'app',\n screen: <AppSignIn />,\n },\n {\n detail:\n 'The options of `Actions.passkey.prepare`, as the form showed: GET /v1/realms, then POST /v1/auth/passkey/options with client_id and authorize',\n edge: 'Continue with passkey',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/auth/passkey/verify: user and authorization',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Passkey',\n },\n {\n description:\n \"A wallet.tempo passkey without an email verifies one through the app's own code step. The passkey signs again with the code, which links it, and that assertion signs the key of its account.\",\n nodes: [\n { detail: 'Web playground', name: \"App's sign-in\" },\n {\n edge: appSignInEdge,\n name: 'Sign in',\n owner: 'app',\n screen: <AppSignIn />,\n },\n {\n detail:\n 'The options of `Actions.passkey.prepare`, as the form showed: GET /v1/realms, then POST /v1/auth/passkey/options with client_id',\n edge: 'Continue with passkey',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/auth/passkey/verify: step email',\n name: 'Add your email',\n owner: 'app',\n screen: <AppEmail />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n owner: 'app',\n screen: <AppCode />,\n },\n {\n detail: 'POST /v1/auth/passkey/options with link',\n edge: 'Code complete',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/auth/code/verify with link and assertion: user and authorization',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Passkey: adds an email',\n },\n {\n description:\n 'In a sign-in with key signature, a passkey signs only the key of its own account. For another passkey’s account, the sign-in refuses the key with `webauthn_required`, and the app signs in through a redirect without a key.',\n nodes: [\n {\n detail: 'POST /v1/auth/passkey/verify: webauthn_required',\n name: \"App's sign-in\",\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'GET /oauth2/authorize without key_authorization, 302, no screen',\n name: 'Web app callback',\n },\n {\n edge: 'POST /oauth2/token with code_verifier',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Passkey: falls back to redirect',\n },\n {\n description:\n \"On a chain whose accounts are configurable, a wallet.tempo passkey's account waits for its upgrade. The sign-in sets `skip_upgrade`, so its one assertion signs the key as the passkey's own account, and returns `upgradeAvailable`. The web playground then calls `Actions.account.upgrade` in the same click. Its prompt signs the upgrade, and Tempo ID first registers the key through a sponsored transaction that the access key signs, so the key keeps working.\",\n nodes: [\n { detail: 'Web playground', name: \"App's sign-in\" },\n {\n edge: appSignInEdge,\n name: 'Sign in',\n owner: 'app',\n screen: <AppSignIn />,\n },\n {\n detail:\n 'The options of `Actions.passkey.prepare`, with skip_upgrade in authorize',\n edge: 'Continue with passkey',\n name: 'Authenticator prompt',\n },\n {\n detail:\n 'POST /v1/account/upgrade with key_authorization: the passkey step, with step.key.digest, which the access key signs with no prompt',\n edge: 'POST /v1/auth/passkey/verify: user and authorization with upgrade_available: true',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/account/upgrade with passkey.assertion and key.signature: the key registers, then the account upgrades',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n ],\n title: 'Passkey: upgrade the wallet',\n },\n ],\n title: 'Headless apps',\n },\n {\n flows: [\n {\n description:\n '`tempo-id login` requests a code with a new access key, and prints `verification_uri_complete`. After the user approves on the device page, the CLI’s next poll receives the tokens and the signed key, and stores them.',\n nodes: [\n loginEntry,\n {\n detail: 'GET /device?code',\n edge: 'Shows verification_uri_complete',\n name: 'Browser',\n },\n {\n edge: 'Page /login?return_to=/device?code',\n name: 'Sign in',\n screen: <SignIn {...signIn()} device />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} device email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify: 200',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} device email={email} verified />,\n },\n {\n edge: 'after 500 ms, /device?code',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n {\n edge: 'POST /v1/device/approve',\n name: 'Authorization successful',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"approved\"\n />\n ),\n },\n loginExit,\n ],\n title: 'Device code: signed out',\n },\n {\n description:\n 'A user who opens the bare `verification_uri` types the code that the terminal shows.',\n nodes: [\n loginEntry,\n {\n detail: 'GET /device',\n edge: 'Shows user_code and verification_uri',\n name: 'Browser',\n },\n {\n edge: '200 device page',\n name: 'Authorize a device (enter a code)',\n screen: <DeviceApproval {...deviceApproval()} />,\n },\n {\n edge: 'Continue, GET /device?code',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n {\n edge: 'POST /v1/device/approve',\n name: 'Authorization successful',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"approved\"\n />\n ),\n },\n loginExit,\n ],\n title: 'Device code: typed',\n },\n {\n description:\n \"Denying ends the request. The CLI's next poll is refused.\",\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: '200 device page',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n {\n edge: 'POST /v1/device/deny',\n name: 'Denied',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"denied\"\n />\n ),\n },\n {\n detail: 'Exits with not_signed_in',\n edge: 'POST /oauth2/token: access_denied',\n name: 'tempo-id login',\n },\n ],\n title: 'Device code: denied',\n },\n {\n description:\n 'A passkey owns the account, so the approval returns the passkey step. The passkey signs the key’s digest in this browser, and the page approves again.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: '200 device page',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n {\n edge: 'Approve, POST /v1/device/approve',\n name: 'Authorize a device (approving)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n approving\n request={deviceRequest()}\n />\n ),\n },\n {\n detail: 'Signs the key authorization, over the approving page',\n edge: 'step passkey',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/device/approve with passkey.assertion',\n name: 'Authorization successful',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"approved\"\n />\n ),\n },\n loginExit,\n ],\n title: 'Device code: passkey account',\n },\n {\n description:\n 'When a wallet.tempo passkey’s wallet waits for its upgrade, the device page shows the upgrade step first. Continue upgrades the wallet and loads the request again, and Not now shows the request with its refusal.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: 'GET /v1/device/requests/:code: refusal upgrade, GET /i/account/passkeys for a passkey that has not linked, POST /v1/account/upgrade, the passkey step',\n name: 'Upgrade your wallet',\n screen: <WalletUpgrade {...walletUpgrade()} />,\n },\n {\n edge: 'Continue, POST /v1/account/upgrade with passkey.assertion, then GET /v1/device/requests/:code again',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n {\n detail: 'Signs the key authorization, over the approving page',\n edge: 'Approve, POST /v1/device/approve, step passkey',\n name: 'Authenticator prompt',\n },\n {\n edge: 'POST /v1/device/approve with passkey.assertion',\n name: 'Authorization successful',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"approved\"\n />\n ),\n },\n loginExit,\n ],\n title: 'Device code: upgrade first',\n },\n {\n description:\n 'Approval cannot sign some keys, so the page holds Approve and states why. Deny still ends the request.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: 'The key names an account that the user does not hold',\n name: 'Authorize a device (foreign account)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={{\n ...deviceRequest(),\n key_authorization: { ...key(), refusal: 'foreign_account' },\n }}\n />\n ),\n },\n {\n edge: 'Or: no account, and no Privy app to create one, or Not now on the upgrade step',\n name: 'Authorize a device (no account)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={{\n ...deviceRequest(),\n key_authorization: { ...key(), refusal: 'no_account' },\n }}\n />\n ),\n },\n {\n edge: 'Or: a passkey whose relying party is not Tempo ID’s, or POST /v1/device/approve: webauthn_required',\n name: 'Authorize a device (passkey)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={{\n ...deviceRequest(),\n key_authorization: { ...key(), refusal: 'passkey' },\n }}\n />\n ),\n },\n {\n edge: 'Or: the accounts cannot be read',\n name: 'Authorize a device (unavailable)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={{\n ...deviceRequest(),\n key_authorization: { ...key(), refusal: 'unavailable' },\n }}\n />\n ),\n },\n {\n detail: 'POST /oauth2/token: access_denied',\n edge: 'Deny, POST /v1/device/deny',\n name: 'tempo-id login',\n },\n ],\n title: 'Device code: key it cannot sign',\n },\n {\n description:\n 'A CLI with the `tempo-id:sign` scope sends a challenge, and the device page shows the message that the key signs.',\n nodes: [\n {\n detail: 'POST /device/code with key_authorization and challenge',\n name: 'CLI',\n },\n {\n edge: 'GET /device?code, 200 device page',\n name: 'Authorize a device (challenge)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={{\n ...deviceRequest(),\n challenge: 'Sign in to api.example.com\\nNonce: 8f2a91',\n }}\n />\n ),\n },\n {\n edge: 'Approve, POST /v1/device/approve, or the passkey step first',\n name: 'Authorization successful',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"approved\"\n />\n ),\n },\n {\n detail:\n 'Tokens, and key_authorization bound to the challenge’s hash',\n edge: 'POST /oauth2/token: authorization_pending, then tokens',\n name: 'CLI',\n },\n ],\n title: 'Device code: challenge',\n },\n {\n description:\n 'A code that is already approved or denied shows its outcome again, without the decision buttons.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: '200, status: approved',\n name: 'Authorization successful',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n status=\"approved\"\n />\n ),\n },\n ],\n title: 'Device code: already decided',\n },\n {\n description:\n 'A code that no one approves before `expires_in` ends the login. The CLI stores nothing, and the user runs `tempo-id login` again.',\n nodes: [\n loginEntry,\n {\n detail: 'Exits with not_signed_in',\n edge: 'POST /oauth2/token: authorization_pending, then expired_token',\n name: 'tempo-id login',\n },\n ],\n title: 'tempo-id login: expired',\n },\n {\n description:\n 'The CLI reads the stored session, refreshes its access token when it expires within 30 seconds, and reads the user.',\n nodes: [\n { detail: '~/.tempo/id/credentials.json', name: 'tempo-id whoami' },\n {\n detail: 'Email and Tempo Account',\n edge: 'POST /oauth2/token with refresh_token within 30 s of expiry, GET /oauth2/userinfo',\n name: 'tempo-id whoami',\n },\n ],\n title: 'tempo-id whoami',\n },\n {\n description:\n 'Each device request holds the code field or the decision buttons, and shows a spinner, until it settles.',\n nodes: [\n { detail: 'GET /device', name: 'Browser' },\n {\n edge: 'Continue, GET /device?code',\n name: 'Authorize a device (fetching)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n code=\"BDWP-HQPK\"\n fetching\n />\n ),\n },\n {\n edge: 'Approve, POST /v1/device/approve',\n name: 'Authorize a device (approving)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n approving\n request={deviceRequest()}\n />\n ),\n },\n {\n edge: 'Or: Deny, POST /v1/device/deny',\n name: 'Authorize a device (denying)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n denying\n request={deviceRequest()}\n />\n ),\n },\n ],\n title: 'Device code: in progress',\n },\n {\n description:\n 'A device app without a display name could be anyone’s, so the request omits `app`, and the page flags an unverified app.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: '200 device page, request without app',\n name: 'Authorize a device (unverified app)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={{ ...deviceRequest(), app: undefined }}\n />\n ),\n },\n ],\n title: 'Device code: unverified app',\n },\n {\n description:\n 'A code that matches no pending request, or one that another user holds, keeps the code form.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: 'unknown_code',\n name: 'Authorize a device (unknown code)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n code=\"BDWP-HQPX\"\n error=\"Invalid or expired code. Check the code in the terminal.\"\n invalid\n />\n ),\n },\n ],\n title: 'Device code: unknown code',\n },\n {\n description:\n 'Each user’s code lookups share one rate limit, so the page refuses a lookup over it and keeps the code form.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: 'Lookup over the rate limit',\n name: 'Authorize a device (rate limited)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n code=\"BDWP-HQPK\"\n error=\"Too many requests. Try again in 1 minute.\"\n invalid\n />\n ),\n },\n ],\n title: 'Device code: rate limited',\n },\n ],\n title: 'Device grant',\n },\n {\n flows: [\n {\n description:\n 'Sign-out ends the session and revokes its refresh tokens, then opens the sign-in page.',\n nodes: [\n { detail: 'GET /', name: 'Browser opens Tempo ID' },\n {\n name: 'Your account',\n screen: <Account {...account()} />,\n },\n {\n edge: 'Sign out, POST /v1/auth/logout',\n name: 'Your account (signing out)',\n screen: <Account {...account()} signingOut />,\n },\n {\n edge: '200, then /login',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n ],\n title: 'Sign-out',\n },\n {\n description:\n 'An app signs the user out with its ID token. Tempo ID ends the session that the hint names, if this browser holds it, and redirects to the app.',\n nodes: [\n {\n detail:\n 'GET /oauth2/end-session?id_token_hint&post_logout_redirect_uri&state',\n name: 'Web app',\n },\n {\n detail: 'GET post_logout_redirect_uri?state',\n edge: '302, no screen',\n name: 'Web app',\n },\n ],\n title: 'RP-initiated logout',\n },\n {\n description:\n 'A cross-site form POST carries no `SameSite=Lax` session cookie, so Tempo ID seals the parameters and continues as a GET, which carries the cookie.',\n nodes: [\n {\n detail:\n 'POST /oauth2/end-session with id_token_hint, post_logout_redirect_uri, and state',\n name: 'Web app',\n },\n {\n detail: 'GET /oauth2/end-session?continuation',\n edge: '303, no session cookie',\n name: 'Browser',\n },\n {\n detail: 'GET post_logout_redirect_uri?state',\n edge: '302, no screen',\n name: 'Web app',\n },\n ],\n title: 'RP-initiated logout: form POST',\n },\n {\n description:\n \"An app's own Sign out ends the Tempo ID session. The app forgets the sign-in even if the request fails, and shows the error.\",\n nodes: [\n { detail: 'Web playground', name: \"App's page\" },\n {\n edge: 'GET /v1/auth/session, POST /v1/authorize',\n name: 'Signed in',\n owner: 'app',\n screen: <AppSignedIn />,\n },\n {\n edge: 'Sign out, POST /v1/auth/logout',\n name: 'Sign in',\n owner: 'app',\n screen: <AppSignIn />,\n },\n ],\n title: 'Headless sign-out',\n },\n {\n description:\n 'The CLI revokes the stored refresh token at the deployment that issued it, and deletes the session even if the revocation fails.',\n nodes: [\n { detail: '~/.tempo/id/credentials.json', name: 'tempo-id logout' },\n {\n detail: 'Session deleted',\n edge: 'POST /oauth2/revoke with the refresh token',\n name: 'tempo-id logout',\n },\n ],\n title: 'tempo-id logout',\n },\n ],\n title: 'Sign-out',\n },\n {\n flows: [\n {\n description:\n 'A refused send keeps the first step, with the refusal below the email field, which it marks invalid. The user can try again or pick another method.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'POST /v1/auth/code: 503',\n name: 'Sign in (send failed)',\n screen: <SignIn {...signIn()} error={unavailable} invalid />,\n },\n ],\n title: 'Email code: send refused',\n },\n {\n description:\n 'A canceled prompt or a refused passkey keeps the first step, with the error below the email field. The email field is not marked invalid, since no address was sent.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'Canceled prompt, or POST /v1/auth/passkey/verify refused',\n name: 'Sign in (passkey failed)',\n screen: (\n <SignIn\n {...signIn()}\n error=\"Passkey sign-in was canceled. Try again, or continue with email.\"\n />\n ),\n },\n ],\n title: 'Passkey: fails',\n },\n {\n description:\n 'A refused code clears the field and marks it invalid, so the next code can be typed at once.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'POST /v1/auth/code/verify: 401',\n name: 'Check your email (wrong code)',\n screen: (\n <SignIn\n {...signIn()}\n email={email}\n error=\"Invalid or expired code. Request a new one.\"\n invalid\n />\n ),\n },\n ],\n title: 'Email code: wrong code',\n },\n {\n description:\n 'With `SIGN_UP_DOMAINS`, a verified code for an address with no account, outside those domains, creates no account. An existing account at any domain still signs in.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'POST /v1/auth/code/verify: 403 sign_up_not_permitted',\n name: 'Check your email (sign-up refused)',\n screen: (\n <SignIn\n {...signIn()}\n email={email}\n error=\"Sign-up not permitted: new accounts need an address at tempo.xyz. Sign in with an existing account, or with an address at tempo.xyz.\"\n invalid\n />\n ),\n },\n ],\n title: 'Email code: sign-up refused',\n },\n {\n description:\n 'A passkey that does not sign again, or whose assertion is refused, drops the link. The code field clears and takes focus, so the next code signs in with email only.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'Canceled prompt, or POST /v1/auth/code/verify with link: webauthn_rejected',\n name: 'Check your email (link failed)',\n screen: (\n <SignIn\n {...signIn()}\n email={email}\n error=\"Your passkey did not confirm the sign-in. Enter the code again to sign in with email only.\"\n invalid\n />\n ),\n },\n ],\n title: 'Passkey: link fails',\n },\n {\n description:\n 'A resent code shows Code sent on the disabled button for 5 seconds, then Resend code again. A hidden status announces the send, and the code field keeps its value.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'Resend code, POST /v1/auth/code',\n name: 'Check your email (resent)',\n screen: <SignIn {...signIn()} email={email} resend=\"sent\" />,\n },\n ],\n title: 'Email code: resent',\n },\n {\n description:\n 'A refused resend keeps the code step and its code, with the refusal below the code field. The code stays valid, so the field is not marked invalid.',\n nodes: [\n { detail: 'GET /login', name: 'Browser opens sign-in' },\n {\n edge: 'Resend code, POST /v1/auth/code: 429',\n name: 'Check your email (resend refused)',\n screen: (\n <SignIn\n {...signIn()}\n email={email}\n error=\"Too many requests. Try again in 1 minute.\"\n />\n ),\n },\n ],\n title: 'Email code: resend refused',\n },\n {\n description:\n 'A failed selection keeps the account step, so the user can choose again. The page does not reload, so an ended session or an expired request shows its refusal in the same place.',\n nodes: [\n { detail: 'GET /choose-account?…&sig', name: 'Browser' },\n {\n edge: 'POST /v1/authorize/account: 503',\n name: 'Choose a wallet (failed)',\n screen: (\n <ChooseAccount {...chooseAccount()} error={unavailable} />\n ),\n },\n {\n edge: 'Or: POST /v1/authorize/account: session_required',\n name: 'Choose a wallet (session ended)',\n screen: (\n <ChooseAccount {...chooseAccount()} error=\"Sign in first.\" />\n ),\n },\n {\n edge: 'Or: POST /v1/authorize/account: authorization_expired',\n name: 'Choose a wallet (request expired)',\n screen: (\n <ChooseAccount\n {...chooseAccount()}\n error=\"Expired authorization request: the request from the app is no longer valid. Return to the app, and start again.\"\n />\n ),\n },\n ],\n title: 'Account step: fails',\n },\n {\n description:\n 'A failed decision keeps the approval page, with the refusal below the buttons.',\n nodes: [\n { detail: 'GET /authorize?…&sig', name: 'Browser' },\n {\n edge: 'POST /v1/authorize/consent: 503',\n name: 'Authorize this app (failed)',\n screen: <Approval {...approval()} error={unavailable} />,\n },\n ],\n title: 'Approval: fails',\n },\n {\n description:\n 'A spent authorization rate limit refuses Approve, as it refuses the grant at sign-in. The approval page stays until the limit resets.',\n nodes: [\n { detail: 'GET /authorize?…&sig', name: 'Browser' },\n {\n edge: 'Approve, POST /v1/authorize/consent: 429 rate_limited',\n name: 'Authorize this app (rate limited)',\n screen: (\n <Approval\n {...approval()}\n error=\"Too many requests. Try again in 1 minute.\"\n />\n ),\n },\n ],\n title: 'Approval: rate limited',\n },\n {\n description:\n 'A canceled prompt or a refused assertion keeps the approval page, and Approve starts a new passkey step.',\n nodes: [\n { detail: 'GET /authorize?…&sig', name: 'Browser' },\n {\n edge: 'Canceled prompt, or POST /v1/authorize/consent with passkey.assertion: webauthn_rejected',\n name: 'Authorize this app (passkey failed)',\n screen: (\n <Approval\n {...approval()}\n error=\"The passkey request was canceled. Approve again, or deny the request.\"\n />\n ),\n },\n ],\n title: 'Approval: passkey fails',\n },\n {\n description:\n 'A session that ends before the decision reloads the page, and the loader sends the browser to sign-in with the signed query. A sign-in already spent this request, so the sign-in page shows only the app, and the next sign-in opens the approval page again.',\n nodes: [\n { detail: 'GET /authorize?…&sig', name: 'Browser' },\n {\n edge: '200 approval page',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Approve, POST /v1/authorize/consent: session_required, reload, 302 /login?…&sig, GET /login: spent request',\n name: 'Sign in (app)',\n screen: <SignIn {...signIn()} request={appRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n edge: 'after 500 ms, redirect /authorize?…&sig',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'Approve, POST /v1/authorize/consent',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: session expired',\n },\n {\n description:\n 'A user who was signed in when the request arrived reached the approval page without a sign-in, so the request is unspent. The sign-in after the reload grants the key and returns to the app at once.',\n nodes: [\n { detail: 'GET /authorize?…&sig', name: 'Browser' },\n {\n edge: '200 approval page',\n name: 'Authorize this app',\n screen: <Approval {...approval()} />,\n },\n {\n edge: 'Approve, POST /v1/authorize/consent: session_required, reload, 302 /login?…&sig',\n name: 'Sign in (key)',\n screen: <SignIn {...signIn()} request={signInRequest()} />,\n },\n {\n edge: 'POST /v1/auth/code',\n name: 'Check your email',\n screen: <SignIn {...signIn()} email={email} />,\n },\n {\n edge: 'POST /v1/auth/code/verify with oauth_query: 200, grants the key',\n name: 'Check your email (accepted)',\n screen: <SignIn {...signIn()} email={email} verified />,\n },\n {\n detail: 'GET redirect_uri?code&state',\n edge: 'after 500 ms, redirect',\n name: 'Web app callback',\n },\n {\n ...tokenExit,\n detail: 'Tokens, account, and key_authorization',\n },\n ],\n title: 'Approval: session expired, unspent',\n },\n {\n description:\n 'A failed decision keeps the device page with the request, and the refusal below the buttons.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: 'POST /v1/device/approve: 503',\n name: 'Authorize a device (failed)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n error={unavailable}\n request={deviceRequest()}\n />\n ),\n },\n ],\n title: 'Device code: decision fails',\n },\n {\n description:\n 'A session that ends before the decision reloads the page, and sign-in returns to the same code. The request is bound to its user, so another user’s sign-in shows the unknown code.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: '200 device page',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n {\n edge: 'Approve, POST /v1/device/approve: session_required, reload, 302 /login?return_to=/device?code',\n name: 'Sign in',\n screen: <SignIn {...signIn()} />,\n },\n {\n edge: 'Sign-in, /device?code',\n name: 'Authorize a device',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n request={deviceRequest()}\n />\n ),\n },\n ],\n title: 'Device code: session expired',\n },\n {\n description:\n 'A canceled prompt or a refused assertion keeps the device page, and Approve starts a new passkey step.',\n nodes: [\n { detail: 'GET /device?code', name: 'Browser' },\n {\n edge: 'Canceled prompt, or POST /v1/device/approve with passkey.assertion: webauthn_rejected',\n name: 'Authorize a device (passkey failed)',\n screen: (\n <DeviceApproval\n {...deviceApproval()}\n error=\"The passkey request was canceled. Approve again, or deny the request.\"\n request={deviceRequest()}\n />\n ),\n },\n ],\n title: 'Device code: passkey fails',\n },\n {\n description:\n 'A failed sign-out keeps the account page, with the refusal above the button.',\n nodes: [\n { detail: 'GET /', name: 'Browser opens Tempo ID' },\n {\n edge: 'POST /v1/auth/logout: 503',\n name: 'Your account (sign-out failed)',\n screen: <Account {...account()} error={unavailable} />,\n },\n ],\n title: 'Sign-out: fails',\n },\n ],\n title: 'Request failures',\n },\n ]\n}\n\nnamespace styles {\n export const app = style({ display: 'grid', gap: '12' })\n\n export const appAddress = style({\n color: 'gray.900',\n margin: '0',\n overflowWrap: 'anywhere',\n typography: 'copy.13.mono',\n })\n\n export const appButton = variants({\n base: {\n alignItems: 'center',\n border: 'none',\n borderRadius: 'full',\n cursor: 'pointer',\n display: 'flex',\n gap: '12',\n height: '48',\n justifyContent: 'center',\n paddingInline: '24',\n typography: 'button.16',\n width: '100% !custom',\n },\n variants: {\n tone: {\n brand: { backgroundColor: 'red.700', color: 'white' },\n quiet: { backgroundColor: 'gray.100', color: 'foreground' },\n },\n },\n })\n\n export const appDescription = style({\n color: 'gray.900',\n typography: 'copy.16',\n })\n\n // A rule on each side of the label, as the sample app's divider draws it.\n export const appDivider = style({\n alignItems: 'center',\n color: 'gray.900',\n display: 'flex',\n gap: '16',\n margin: '0',\n typography: 'copy.14',\n whiteSpace: 'nowrap',\n '&::before, &::after': {\n backgroundColor: 'gray.400',\n content: '\"\"',\n flexGrow: 1,\n height: '1',\n },\n })\n\n export const appField = style({ display: 'grid', gap: '8' })\n\n export const appHeader = style({\n display: 'grid',\n gap: '8',\n marginBottom: '8',\n })\n\n export const appInput = style({\n backgroundColor: 'gray.100',\n border: 'none',\n borderRadius: '6',\n color: 'foreground',\n height: '48',\n paddingInline: '16',\n typography: 'copy.16',\n width: '100% !custom',\n })\n\n export const appLabel = style({ typography: 'label.16' })\n\n export const appTitle = style({ typography: 'heading.32' })\n\n export const arrow = style({\n alignItems: 'center',\n display: 'grid',\n flexShrink: 0,\n gap: '8',\n justifyItems: 'center',\n paddingInline: '12',\n width: '192',\n })\n\n export const artboard = style({ display: 'grid', gap: '8', margin: '0' })\n\n export const canvas = style({\n backgroundColor: 'gray.100',\n minHeight: '100dvh !custom',\n // The canvas grows to its widest flow at the current zoom, so the page scrolls to pan.\n minWidth: '100% !custom',\n // Below 64rem, the fixed controls reach over the introduction, so the canvas starts below them.\n // The space sits outside the zoom, so it holds at every scale.\n paddingTop: '96',\n width: 'max-content !custom',\n '@media (min-width: 64rem)': { paddingTop: '0' },\n })\n\n export const code = style({ typography: 'copy.13.mono' })\n\n export const detail = style({\n color: 'gray.900',\n overflowWrap: 'anywhere',\n typography: 'copy.13.mono',\n })\n\n export const edge = style({\n color: 'gray.900',\n overflowWrap: 'anywhere',\n textAlign: 'center',\n typography: 'copy.13.mono',\n })\n\n export const external = variants({\n base: {\n backgroundColor: 'background.surface',\n border: '1px dashed',\n borderColor: 'gray.500',\n borderRadius: '8',\n display: 'grid',\n flexShrink: 0,\n gap: '4',\n padding: '16',\n width: '224',\n },\n variants: {\n kind: {\n Entry: { borderColor: 'blue.700', borderStyle: 'solid' },\n Exit: { borderColor: 'green.700', borderStyle: 'solid' },\n External: {},\n },\n },\n })\n\n export const externalName = style({ typography: 'label.14' })\n\n export const flow = style({ display: 'grid', gap: '16' })\n\n export const flowDescription = style({\n color: 'gray.900',\n typography: 'copy.14',\n })\n\n // The flow's text stays at the canvas's left edge while the row scrolls.\n export const flowHeader = style({\n display: 'grid',\n gap: '4',\n left: '16',\n maxWidth: 'min(36rem, calc(100vw - 2rem)) !custom',\n position: 'sticky',\n '@media (min-width: 48rem)': { left: '48' },\n })\n\n export const flowTitle = style({ typography: 'heading.16' })\n\n // Each frame draws the page's color, so its screen reads as it does in the app.\n export const frame = style({\n // oxlint-disable-next-line typescript/restrict-template-expressions -- zyzz reads each token reference at build time, so it stays a direct interpolation.\n backgroundColor: `light-dark(${vars.color.background.surface}, ${vars.color.background.primary}) !custom`,\n borderRadius: '8',\n boxShadow: '6',\n paddingBlock: '40',\n paddingInline: '24',\n width: '384',\n })\n\n export const frameLabel = style({ color: 'gray.900', typography: 'label.12' })\n\n export const head = style({\n color: 'gray.600',\n flexShrink: 0,\n height: '16',\n width: '16',\n })\n\n export const hidden = style({\n clipPath: 'inset(50%) !custom',\n height: '1px !custom',\n overflow: 'hidden',\n position: 'absolute',\n whiteSpace: 'nowrap',\n width: '1px !custom',\n })\n\n export const intro = style({\n display: 'grid',\n gap: '8',\n left: '16',\n maxWidth: 'min(36rem, calc(100vw - 2rem)) !custom',\n position: 'sticky',\n '@media (min-width: 48rem)': { left: '48' },\n })\n\n export const kind = style({\n color: 'gray.900',\n textTransform: 'uppercase',\n typography: 'label.12',\n })\n\n export const legend = style({\n backgroundColor: 'background.surface',\n borderRadius: '12',\n boxShadow: 'popover',\n // The list ends above the developer toolbar at the bottom of the viewport.\n maxHeight: 'calc(100dvh - 9.5rem) !custom',\n overflowY: 'auto',\n pointerEvents: 'auto',\n width: 'min(18rem, calc(100vw - 2rem)) !custom',\n })\n\n export const legendFlow = style({\n borderRadius: '6',\n color: 'gray.900',\n display: 'block',\n paddingBlock: '4',\n paddingInline: '8',\n textDecoration: 'none',\n typography: 'copy.13',\n '&:hover': { backgroundColor: 'grayAlpha.100', color: 'foreground' },\n })\n\n export const legendFlows = style({\n listStyle: 'none',\n margin: '0',\n padding: '0',\n })\n\n export const legendList = style({\n display: 'grid',\n gap: '12',\n listStyle: 'none',\n margin: '0',\n paddingBlockEnd: '8',\n paddingBlockStart: '0',\n paddingInline: '8',\n })\n\n export const legendSection = style({\n borderRadius: '6',\n color: 'foreground',\n display: 'block',\n paddingBlock: '4',\n paddingInline: '8',\n textDecoration: 'none',\n typography: 'label.14',\n '&:hover': { backgroundColor: 'grayAlpha.100' },\n })\n\n export const legendItem = style({ borderBottom: 'none !custom' })\n\n export const legendTrigger = style({\n paddingInline: '1rem !custom',\n })\n\n export const lede = style({ color: 'gray.900', typography: 'copy.16' })\n\n export const line = style({\n backgroundColor: 'gray.600',\n flexGrow: 1,\n height: '1',\n })\n\n // The zoom controls and the contents stay at the top right, clear of the developer toolbar at the\n // bottom. Clicks between them reach the canvas.\n export const panels = style({\n alignItems: 'flex-end',\n display: 'flex',\n flexDirection: 'column',\n gap: '8',\n pointerEvents: 'none',\n position: 'fixed',\n right: '16',\n top: '16',\n zIndex: 'overlay',\n })\n\n export const placeholder = style({ flexShrink: 0 })\n\n // A box of 100 CSS pixels inside the zoom, whose rect height measures the zoom's geometry.\n export const probe = style({\n height: '100px !custom',\n pointerEvents: 'none',\n position: 'absolute',\n visibility: 'hidden',\n width: '1px !custom',\n })\n\n export const row = style({\n alignItems: 'center',\n display: 'flex',\n listStyle: 'none',\n margin: '0',\n padding: '0',\n })\n\n // The box spans its row, so the observer sees the row's full width at every scroll position.\n export const rowBox = style({ width: 'max-content !custom' })\n\n export const section = style({ display: 'grid', gap: '40' })\n\n export const sectionTitle = style({\n borderBottom: '1px solid',\n borderBottomColor: 'grayAlpha.400',\n paddingBottom: '8',\n typography: 'heading.20',\n })\n\n export const shaft = style({\n alignItems: 'center',\n display: 'flex',\n width: '100% !custom',\n })\n\n export const step = style({ alignItems: 'center', display: 'flex' })\n\n export const title = style({ typography: 'heading.32' })\n\n export const world = style({\n display: 'grid',\n gap: '64',\n padding: '16',\n '@media (min-width: 48rem)': { padding: '48' },\n })\n\n export const zoom = style({\n alignItems: 'center',\n backgroundColor: 'background.surface',\n borderRadius: 'full',\n boxShadow: 'popover',\n display: 'flex',\n gap: '2',\n padding: '4',\n pointerEvents: 'auto',\n })\n\n export const zoomIcon = style({\n flexShrink: '0 !custom',\n height: '18',\n width: '18',\n })\n\n // A fixed width keeps the zoom buttons in place as the percentage changes.\n export const zoomLevel = style({\n fontVariantNumeric: 'tabular-nums',\n minWidth: '56',\n })\n}\n","/* eslint-disable */\n\n// @ts-nocheck\n\n// noinspection JSUnusedGlobalSymbols\n\n// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.\n\nimport { Route as rootRouteImport } from './routes/__root'\nimport { Route as IndexRouteImport } from './routes/index'\nimport { Route as AuthorizeRouteImport } from './routes/authorize'\nimport { Route as ChooseAccountRouteImport } from './routes/choose-account'\nimport { Route as DepositRouteImport } from './routes/deposit'\nimport { Route as DeviceRouteImport } from './routes/device'\nimport { Route as ErrorRouteImport } from './routes/error'\nimport { Route as LoginRouteImport } from './routes/login'\nimport { Route as Char91_Char93FlowsRouteImport } from './routes/[_].flows'\n\nconst IndexRoute = IndexRouteImport.update({\n id: '/',\n path: '/',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst AuthorizeRoute = AuthorizeRouteImport.update({\n id: '/authorize',\n path: '/authorize',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst ChooseAccountRoute = ChooseAccountRouteImport.update({\n id: '/choose-account',\n path: '/choose-account',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst DepositRoute = DepositRouteImport.update({\n id: '/deposit',\n path: '/deposit',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst DeviceRoute = DeviceRouteImport.update({\n id: '/device',\n path: '/device',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst ErrorRoute = ErrorRouteImport.update({\n id: '/error',\n path: '/error',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LoginRoute = LoginRouteImport.update({\n id: '/login',\n path: '/login',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst Char91_Char93FlowsRoute = Char91_Char93FlowsRouteImport.update({\n id: '/_/flows',\n path: '/_/flows',\n getParentRoute: () => rootRouteImport,\n} as any)\n\nexport interface FileRoutesByFullPath {\n '/': typeof IndexRoute\n '/authorize': typeof AuthorizeRoute\n '/choose-account': typeof ChooseAccountRoute\n '/deposit': typeof DepositRoute\n '/device': typeof DeviceRoute\n '/error': typeof ErrorRoute\n '/login': typeof LoginRoute\n '/_/flows': typeof Char91_Char93FlowsRoute\n}\nexport interface FileRoutesByTo {\n '/': typeof IndexRoute\n '/authorize': typeof AuthorizeRoute\n '/choose-account': typeof ChooseAccountRoute\n '/deposit': typeof DepositRoute\n '/device': typeof DeviceRoute\n '/error': typeof ErrorRoute\n '/login': typeof LoginRoute\n '/_/flows': typeof Char91_Char93FlowsRoute\n}\nexport interface FileRoutesById {\n __root__: typeof rootRouteImport\n '/': typeof IndexRoute\n '/authorize': typeof AuthorizeRoute\n '/choose-account': typeof ChooseAccountRoute\n '/deposit': typeof DepositRoute\n '/device': typeof DeviceRoute\n '/error': typeof ErrorRoute\n '/login': typeof LoginRoute\n '/_/flows': typeof Char91_Char93FlowsRoute\n}\nexport interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths:\n | '/'\n | '/authorize'\n | '/choose-account'\n | '/deposit'\n | '/device'\n | '/error'\n | '/login'\n | '/_/flows'\n fileRoutesByTo: FileRoutesByTo\n to:\n | '/'\n | '/authorize'\n | '/choose-account'\n | '/deposit'\n | '/device'\n | '/error'\n | '/login'\n | '/_/flows'\n id:\n | '__root__'\n | '/'\n | '/authorize'\n | '/choose-account'\n | '/deposit'\n | '/device'\n | '/error'\n | '/login'\n | '/_/flows'\n fileRoutesById: FileRoutesById\n}\nexport interface RootRouteChildren {\n IndexRoute: typeof IndexRoute\n AuthorizeRoute: typeof AuthorizeRoute\n ChooseAccountRoute: typeof ChooseAccountRoute\n DepositRoute: typeof DepositRoute\n DeviceRoute: typeof DeviceRoute\n ErrorRoute: typeof ErrorRoute\n LoginRoute: typeof LoginRoute\n Char91_Char93FlowsRoute: typeof Char91_Char93FlowsRoute\n}\n\ndeclare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n '/': {\n id: '/'\n path: '/'\n fullPath: '/'\n preLoaderRoute: typeof IndexRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/authorize': {\n id: '/authorize'\n path: '/authorize'\n fullPath: '/authorize'\n preLoaderRoute: typeof AuthorizeRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/choose-account': {\n id: '/choose-account'\n path: '/choose-account'\n fullPath: '/choose-account'\n preLoaderRoute: typeof ChooseAccountRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/deposit': {\n id: '/deposit'\n path: '/deposit'\n fullPath: '/deposit'\n preLoaderRoute: typeof DepositRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/device': {\n id: '/device'\n path: '/device'\n fullPath: '/device'\n preLoaderRoute: typeof DeviceRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/error': {\n id: '/error'\n path: '/error'\n fullPath: '/error'\n preLoaderRoute: typeof ErrorRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/login': {\n id: '/login'\n path: '/login'\n fullPath: '/login'\n preLoaderRoute: typeof LoginRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_/flows': {\n id: '/_/flows'\n path: '/_/flows'\n fullPath: '/_/flows'\n preLoaderRoute: typeof Char91_Char93FlowsRouteImport\n parentRoute: typeof rootRouteImport\n }\n }\n}\n\nconst rootRouteChildren: RootRouteChildren = {\n IndexRoute: IndexRoute,\n AuthorizeRoute: AuthorizeRoute,\n ChooseAccountRoute: ChooseAccountRoute,\n DepositRoute: DepositRoute,\n DeviceRoute: DeviceRoute,\n ErrorRoute: ErrorRoute,\n LoginRoute: LoginRoute,\n Char91_Char93FlowsRoute: Char91_Char93FlowsRoute,\n}\nexport const routeTree = rootRouteImport\n ._addFileChildren(rootRouteChildren)\n ._addFileTypes<FileRouteTypes>()\n\nimport type { getRouter } from './router.tsx'\nimport type { createStart } from '@tanstack/react-start'\ndeclare module '@tanstack/react-start' {\n interface Register {\n ssr: true\n router: Awaited<ReturnType<typeof getRouter>>\n }\n}\n","/** Creates the router. @module */\nimport { createRouter } from '@tanstack/react-router'\nimport { routeTree } from './routeTree.gen.js'\n\n/** Returns a router, once per server request and once in the browser. */\nexport function getRouter() {\n return createRouter({\n // A loader reads the session, so its data is never reused for another navigation.\n defaultPreloadStaleTime: 0,\n parseSearch,\n routeTree,\n scrollRestoration: true,\n stringifySearch,\n })\n}\n\n/**\n * Parses a search string into strings, with a list for a repeated parameter. The default parses\n * JSON, which changes a user code of digits.\n */\nfunction parseSearch(search: string) {\n const params = new URLSearchParams(search)\n return Object.fromEntries(\n [...new Set(params.keys())].map((key) => {\n const values = params.getAll(key)\n return [key, values.length > 1 ? values : values[0]]\n }),\n )\n}\n\n/** Serializes search values as {@link parseSearch} reads them. */\nfunction stringifySearch(search: Record<string, unknown>) {\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(search)) {\n if (value === undefined) continue\n for (const entry of Array.isArray(value) ? value : [value])\n params.append(key, String(entry))\n }\n const query = params.toString()\n return query ? `?${query}` : ''\n}\n\ndeclare module '@tanstack/react-router' {\n interface Register {\n router: ReturnType<typeof getRouter>\n }\n}\n"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"mappings":"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"}