@tempoxyz/id 0.0.0-pr-187.sha-eed04d3
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.
- package/README.md +81 -0
- package/dist/App.d.ts +20 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +26 -0
- package/dist/App.js.map +1 -0
- package/dist/app/client/.assetsignore +2 -0
- package/dist/app/client/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/client/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/client/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/client/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/client/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/client/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/client/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/client/assets/ccip-Cq1mMiVl.js +1 -0
- package/dist/app/client/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/client/assets/index-B7YJVP00.css +1 -0
- package/dist/app/client/assets/index-UXTxXCLk.js +55 -0
- package/dist/app/client/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/client/assets/reset-co-CHrff.css +1 -0
- package/dist/app/client/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/db/auth.d.ts +3207 -0
- package/dist/app/db/auth.d.ts.map +1 -0
- package/dist/app/db/auth.js +330 -0
- package/dist/app/db/auth.js.map +1 -0
- package/dist/app/db/schema.d.ts +932 -0
- package/dist/app/db/schema.d.ts.map +1 -0
- package/dist/app/db/schema.js +171 -0
- package/dist/app/db/schema.js.map +1 -0
- package/dist/app/server/.vite/manifest.json +489 -0
- package/dist/app/server/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/server/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/server/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/server/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/server/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/server/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/server/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/server/assets/_tanstack-start-manifest_v-DjQNeRZp.js +1 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js +2 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js.map +1 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js +31 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js.map +1 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js +2 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js.map +1 -0
- package/dist/app/server/assets/call-UQamaCKN.js +32 -0
- package/dist/app/server/assets/call-UQamaCKN.js.map +1 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js +2 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js.map +1 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js +2 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js.map +1 -0
- package/dist/app/server/assets/convert-BIC8n32x.js +2 -0
- package/dist/app/server/assets/convert-BIC8n32x.js.map +1 -0
- package/dist/app/server/assets/cookie-CS900nSP.css +1 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js +10 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js.map +1 -0
- package/dist/app/server/assets/core-B1HCXUmx.js +56 -0
- package/dist/app/server/assets/core-B1HCXUmx.js.map +1 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js +2 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js.map +1 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js +2 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js.map +1 -0
- package/dist/app/server/assets/dist-BxSwugSY.js +1 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js +2 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js.map +1 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js +15 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js.map +1 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js +2 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js.map +1 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js +2 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js.map +1 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js +5 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js.map +1 -0
- package/dist/app/server/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/server/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js +6 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js.map +1 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js +2 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js.map +1 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js +2 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js.map +1 -0
- package/dist/app/server/assets/kysely-adapter-MkHAI9Jk.js +1 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js +2 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js.map +1 -0
- package/dist/app/server/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/server/assets/reset-co-CHrff.css +1 -0
- package/dist/app/server/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/dist/app/server/assets/router-CcbyBCI4.css +1 -0
- package/dist/app/server/assets/router-xjZtEeaI.js +7 -0
- package/dist/app/server/assets/router-xjZtEeaI.js.map +1 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js +9 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js.map +1 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js +2 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js.map +1 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js +2 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js.map +1 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js +2 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js.map +1 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js +6 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js.map +1 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js +2 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js.map +1 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js +2 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js.map +1 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js +2 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js.map +1 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js +2 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js.map +1 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js +2 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js.map +1 -0
- package/dist/app/server/assets/start-C63VetBp.js +2 -0
- package/dist/app/server/assets/start-C63VetBp.js.map +1 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js +2 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js.map +1 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js +2 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js.map +1 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js +2 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js.map +1 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js +2 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js.map +1 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js +2 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js.map +1 -0
- package/dist/app/server/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js +2 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js.map +1 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js +2 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js.map +1 -0
- package/dist/app/server/index.js +574 -0
- package/dist/app/server/index.js.map +1 -0
- package/dist/app/server/wrangler.json +1 -0
- package/dist/cli/Admin.d.ts +38 -0
- package/dist/cli/Admin.d.ts.map +1 -0
- package/dist/cli/Admin.js +62 -0
- package/dist/cli/Admin.js.map +1 -0
- package/dist/cli/Apps.d.ts +9 -0
- package/dist/cli/Apps.d.ts.map +1 -0
- package/dist/cli/Apps.js +36 -0
- package/dist/cli/Apps.js.map +1 -0
- package/dist/cli/Cli.d.ts +14 -0
- package/dist/cli/Cli.d.ts.map +1 -0
- package/dist/cli/Cli.js +27 -0
- package/dist/cli/Cli.js.map +1 -0
- package/dist/cli/Project.d.ts +20 -0
- package/dist/cli/Project.d.ts.map +1 -0
- package/dist/cli/Project.js +88 -0
- package/dist/cli/Project.js.map +1 -0
- package/dist/cli/Realms.d.ts +24 -0
- package/dist/cli/Realms.d.ts.map +1 -0
- package/dist/cli/Realms.js +49 -0
- package/dist/cli/Realms.js.map +1 -0
- package/dist/cli/Session.d.ts +85 -0
- package/dist/cli/Session.d.ts.map +1 -0
- package/dist/cli/Session.js +178 -0
- package/dist/cli/Session.js.map +1 -0
- package/dist/cli/User.d.ts +29 -0
- package/dist/cli/User.d.ts.map +1 -0
- package/dist/cli/User.js +39 -0
- package/dist/cli/User.js.map +1 -0
- package/dist/cli/V1.d.ts +35 -0
- package/dist/cli/V1.d.ts.map +1 -0
- package/dist/cli/V1.js +41 -0
- package/dist/cli/V1.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +46 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/admin/apps/create.d.ts +23 -0
- package/dist/cli/commands/admin/apps/create.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/create.js +89 -0
- package/dist/cli/commands/admin/apps/create.js.map +1 -0
- package/dist/cli/commands/admin/apps/delete.d.ts +14 -0
- package/dist/cli/commands/admin/apps/delete.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/delete.js +41 -0
- package/dist/cli/commands/admin/apps/delete.js.map +1 -0
- package/dist/cli/commands/admin/apps/index.d.ts +5 -0
- package/dist/cli/commands/admin/apps/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/index.js +14 -0
- package/dist/cli/commands/admin/apps/index.js.map +1 -0
- package/dist/cli/commands/admin/apps/list.d.ts +9 -0
- package/dist/cli/commands/admin/apps/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/list.js +26 -0
- package/dist/cli/commands/admin/apps/list.js.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts +16 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js +47 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js.map +1 -0
- package/dist/cli/commands/admin/apps/update.d.ts +20 -0
- package/dist/cli/commands/admin/apps/update.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/update.js +76 -0
- package/dist/cli/commands/admin/apps/update.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +5 -0
- package/dist/cli/commands/admin/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/index.js +13 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +9 -0
- package/dist/cli/commands/admin/migrate.d.ts.map +1 -0
- package/dist/cli/commands/admin/migrate.js +17 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/realms/add.d.ts +12 -0
- package/dist/cli/commands/admin/realms/add.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/add.js +42 -0
- package/dist/cli/commands/admin/realms/add.js.map +1 -0
- package/dist/cli/commands/admin/realms/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/index.js +13 -0
- package/dist/cli/commands/admin/realms/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/list.d.ts +13 -0
- package/dist/cli/commands/admin/realms/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/list.js +36 -0
- package/dist/cli/commands/admin/realms/list.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js +13 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js +46 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.js +13 -0
- package/dist/cli/commands/admin/realms/privy/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts +18 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.js +66 -0
- package/dist/cli/commands/admin/realms/privy/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/remove.d.ts +11 -0
- package/dist/cli/commands/admin/realms/remove.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/remove.js +35 -0
- package/dist/cli/commands/admin/realms/remove.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts +9 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js +17 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/set.js +46 -0
- package/dist/cli/commands/admin/realms/set.js.map +1 -0
- package/dist/cli/commands/admin/rotate-key.d.ts +15 -0
- package/dist/cli/commands/admin/rotate-key.d.ts.map +1 -0
- package/dist/cli/commands/admin/rotate-key.js +46 -0
- package/dist/cli/commands/admin/rotate-key.js.map +1 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +34 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +29 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +8 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +12 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +24 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/client/Actions.d.ts +101 -0
- package/dist/client/Actions.d.ts.map +1 -0
- package/dist/client/Actions.js +90 -0
- package/dist/client/Actions.js.map +1 -0
- package/dist/client/Auth.d.ts +161 -0
- package/dist/client/Auth.d.ts.map +1 -0
- package/dist/client/Auth.js +113 -0
- package/dist/client/Auth.js.map +1 -0
- package/dist/client/Authorization.d.ts +29 -0
- package/dist/client/Authorization.d.ts.map +1 -0
- package/dist/client/Authorization.js +12 -0
- package/dist/client/Authorization.js.map +1 -0
- package/dist/client/Decorator.d.ts +170 -0
- package/dist/client/Decorator.d.ts.map +1 -0
- package/dist/client/Decorator.js +227 -0
- package/dist/client/Decorator.js.map +1 -0
- package/dist/client/Key.d.ts +85 -0
- package/dist/client/Key.d.ts.map +1 -0
- package/dist/client/Key.js +83 -0
- package/dist/client/Key.js.map +1 -0
- package/dist/client/Pending.d.ts +39 -0
- package/dist/client/Pending.d.ts.map +1 -0
- package/dist/client/Pending.js +12 -0
- package/dist/client/Pending.js.map +1 -0
- package/dist/client/Permissions.d.ts +34 -0
- package/dist/client/Permissions.d.ts.map +1 -0
- package/dist/client/Permissions.js +16 -0
- package/dist/client/Permissions.js.map +1 -0
- package/dist/client/Provider.d.ts +16 -0
- package/dist/client/Provider.d.ts.map +1 -0
- package/dist/client/Provider.js +12 -0
- package/dist/client/Provider.js.map +1 -0
- package/dist/client/Step.d.ts +21 -0
- package/dist/client/Step.d.ts.map +1 -0
- package/dist/client/Step.js +16 -0
- package/dist/client/Step.js.map +1 -0
- package/dist/client/Storage.d.ts +27 -0
- package/dist/client/Storage.d.ts.map +1 -0
- package/dist/client/Storage.js +16 -0
- package/dist/client/Storage.js.map +1 -0
- package/dist/client/TempoAccount.d.ts +40 -0
- package/dist/client/TempoAccount.d.ts.map +1 -0
- package/dist/client/TempoAccount.js +16 -0
- package/dist/client/TempoAccount.js.map +1 -0
- package/dist/client/Tokens.d.ts +25 -0
- package/dist/client/Tokens.d.ts.map +1 -0
- package/dist/client/Tokens.js +12 -0
- package/dist/client/Tokens.js.map +1 -0
- package/dist/client/User.d.ts +21 -0
- package/dist/client/User.d.ts.map +1 -0
- package/dist/client/User.js +12 -0
- package/dist/client/User.js.map +1 -0
- package/dist/client/actions/account.d.ts +25 -0
- package/dist/client/actions/account.d.ts.map +1 -0
- package/dist/client/actions/account.js +34 -0
- package/dist/client/actions/account.js.map +1 -0
- package/dist/client/actions/device.d.ts +53 -0
- package/dist/client/actions/device.d.ts.map +1 -0
- package/dist/client/actions/device.js +79 -0
- package/dist/client/actions/device.js.map +1 -0
- package/dist/client/actions/email.d.ts +84 -0
- package/dist/client/actions/email.d.ts.map +1 -0
- package/dist/client/actions/email.js +63 -0
- package/dist/client/actions/email.js.map +1 -0
- package/dist/client/actions/oauth.d.ts +115 -0
- package/dist/client/actions/oauth.d.ts.map +1 -0
- package/dist/client/actions/oauth.js +105 -0
- package/dist/client/actions/oauth.js.map +1 -0
- package/dist/client/actions/passkey.d.ts +88 -0
- package/dist/client/actions/passkey.d.ts.map +1 -0
- package/dist/client/actions/passkey.js +60 -0
- package/dist/client/actions/passkey.js.map +1 -0
- package/dist/client/actions/provider.d.ts +49 -0
- package/dist/client/actions/provider.d.ts.map +1 -0
- package/dist/client/actions/provider.js +34 -0
- package/dist/client/actions/provider.js.map +1 -0
- package/dist/client/actions/realm.d.ts +24 -0
- package/dist/client/actions/realm.d.ts.map +1 -0
- package/dist/client/actions/realm.js +15 -0
- package/dist/client/actions/realm.js.map +1 -0
- package/dist/client/actions/redirect.d.ts +153 -0
- package/dist/client/actions/redirect.d.ts.map +1 -0
- package/dist/client/actions/redirect.js +236 -0
- package/dist/client/actions/redirect.js.map +1 -0
- package/dist/client/internal/accessKey.d.ts +21 -0
- package/dist/client/internal/accessKey.d.ts.map +1 -0
- package/dist/client/internal/accessKey.js +38 -0
- package/dist/client/internal/accessKey.js.map +1 -0
- package/dist/client/internal/account.d.ts +14 -0
- package/dist/client/internal/account.d.ts.map +1 -0
- package/dist/client/internal/account.js +3 -0
- package/dist/client/internal/account.js.map +1 -0
- package/dist/client/internal/api.d.ts +106 -0
- package/dist/client/internal/api.d.ts.map +1 -0
- package/dist/client/internal/api.js +129 -0
- package/dist/client/internal/api.js.map +1 -0
- package/dist/client/internal/headless.d.ts +33 -0
- package/dist/client/internal/headless.d.ts.map +1 -0
- package/dist/client/internal/headless.js +46 -0
- package/dist/client/internal/headless.js.map +1 -0
- package/dist/client/internal/indexedDb.d.ts +9 -0
- package/dist/client/internal/indexedDb.d.ts.map +1 -0
- package/dist/client/internal/indexedDb.js +32 -0
- package/dist/client/internal/indexedDb.js.map +1 -0
- package/dist/client/internal/request.d.ts +58 -0
- package/dist/client/internal/request.d.ts.map +1 -0
- package/dist/client/internal/request.js +45 -0
- package/dist/client/internal/request.js.map +1 -0
- package/dist/client/internal/store.d.ts +12 -0
- package/dist/client/internal/store.d.ts.map +1 -0
- package/dist/client/internal/store.js +15 -0
- package/dist/client/internal/store.js.map +1 -0
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +20 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Apps.d.ts +3051 -0
- package/dist/internal/Apps.d.ts.map +1 -0
- package/dist/internal/Apps.js +472 -0
- package/dist/internal/Apps.js.map +1 -0
- package/dist/internal/Auth.d.ts +4058 -0
- package/dist/internal/Auth.d.ts.map +1 -0
- package/dist/internal/Auth.js +137 -0
- package/dist/internal/Auth.js.map +1 -0
- package/dist/internal/Authorize.d.ts +532 -0
- package/dist/internal/Authorize.d.ts.map +1 -0
- package/dist/internal/Authorize.js +326 -0
- package/dist/internal/Authorize.js.map +1 -0
- package/dist/internal/Device.d.ts +371 -0
- package/dist/internal/Device.d.ts.map +1 -0
- package/dist/internal/Device.js +271 -0
- package/dist/internal/Device.js.map +1 -0
- package/dist/internal/Env.d.ts +57 -0
- package/dist/internal/Env.d.ts.map +1 -0
- package/dist/internal/Env.js +2 -0
- package/dist/internal/Env.js.map +1 -0
- package/dist/internal/ErrorResponse.d.ts +609 -0
- package/dist/internal/ErrorResponse.d.ts.map +1 -0
- package/dist/internal/ErrorResponse.js +679 -0
- package/dist/internal/ErrorResponse.js.map +1 -0
- package/dist/internal/Id.d.ts +10 -0
- package/dist/internal/Id.d.ts.map +1 -0
- package/dist/internal/Id.js +34 -0
- package/dist/internal/Id.js.map +1 -0
- package/dist/internal/KeyAuthorization.d.ts +1456 -0
- package/dist/internal/KeyAuthorization.d.ts.map +1 -0
- package/dist/internal/KeyAuthorization.js +1030 -0
- package/dist/internal/KeyAuthorization.js.map +1 -0
- package/dist/internal/Limits.d.ts +65 -0
- package/dist/internal/Limits.d.ts.map +1 -0
- package/dist/internal/Limits.js +35 -0
- package/dist/internal/Limits.js.map +1 -0
- package/dist/internal/Log.d.ts +49 -0
- package/dist/internal/Log.d.ts.map +1 -0
- package/dist/internal/Log.js +101 -0
- package/dist/internal/Log.js.map +1 -0
- package/dist/internal/LogLine.d.ts +33 -0
- package/dist/internal/LogLine.d.ts.map +1 -0
- package/dist/internal/LogLine.js +56 -0
- package/dist/internal/LogLine.js.map +1 -0
- package/dist/internal/Migrations.d.ts +19 -0
- package/dist/internal/Migrations.d.ts.map +1 -0
- package/dist/internal/Migrations.js +57 -0
- package/dist/internal/Migrations.js.map +1 -0
- package/dist/internal/Owner.d.ts +146 -0
- package/dist/internal/Owner.d.ts.map +1 -0
- package/dist/internal/Owner.js +65 -0
- package/dist/internal/Owner.js.map +1 -0
- package/dist/internal/Passkey.d.ts +528 -0
- package/dist/internal/Passkey.d.ts.map +1 -0
- package/dist/internal/Passkey.js +658 -0
- package/dist/internal/Passkey.js.map +1 -0
- package/dist/internal/PendingKey.d.ts +49 -0
- package/dist/internal/PendingKey.d.ts.map +1 -0
- package/dist/internal/PendingKey.js +58 -0
- package/dist/internal/PendingKey.js.map +1 -0
- package/dist/internal/Privy.d.ts +105 -0
- package/dist/internal/Privy.d.ts.map +1 -0
- package/dist/internal/Privy.js +224 -0
- package/dist/internal/Privy.js.map +1 -0
- package/dist/internal/RateLimit.d.ts +190 -0
- package/dist/internal/RateLimit.d.ts.map +1 -0
- package/dist/internal/RateLimit.js +148 -0
- package/dist/internal/RateLimit.js.map +1 -0
- package/dist/internal/Realm.d.ts +281 -0
- package/dist/internal/Realm.d.ts.map +1 -0
- package/dist/internal/Realm.js +477 -0
- package/dist/internal/Realm.js.map +1 -0
- package/dist/internal/RequestId.d.ts +16 -0
- package/dist/internal/RequestId.d.ts.map +1 -0
- package/dist/internal/RequestId.js +78 -0
- package/dist/internal/RequestId.js.map +1 -0
- package/dist/internal/SigningKey.d.ts +115 -0
- package/dist/internal/SigningKey.d.ts.map +1 -0
- package/dist/internal/SigningKey.js +197 -0
- package/dist/internal/SigningKey.js.map +1 -0
- package/dist/internal/TestInbox.d.ts +42 -0
- package/dist/internal/TestInbox.d.ts.map +1 -0
- package/dist/internal/TestInbox.js +20 -0
- package/dist/internal/TestInbox.js.map +1 -0
- package/dist/internal/Timing.d.ts +51 -0
- package/dist/internal/Timing.d.ts.map +1 -0
- package/dist/internal/Timing.js +103 -0
- package/dist/internal/Timing.js.map +1 -0
- package/dist/internal/Validation.d.ts +52 -0
- package/dist/internal/Validation.d.ts.map +1 -0
- package/dist/internal/Validation.js +22 -0
- package/dist/internal/Validation.js.map +1 -0
- package/dist/internal/Wallet.d.ts +37 -0
- package/dist/internal/Wallet.d.ts.map +1 -0
- package/dist/internal/Wallet.js +43 -0
- package/dist/internal/Wallet.js.map +1 -0
- package/dist/worker.d.ts +12 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +12 -0
- package/dist/worker.js.map +1 -0
- package/package.json +82 -0
- package/src/Api.ts +151 -0
- package/src/App.ts +56 -0
- package/src/api/account.ts +311 -0
- package/src/api/authenticate.ts +1290 -0
- package/src/api/authorize.ts +1030 -0
- package/src/api/device.ts +874 -0
- package/src/api/health.ts +72 -0
- package/src/api/lib/AccountStep.ts +335 -0
- package/src/api/lib/Auth.ts +134 -0
- package/src/api/lib/Consent.ts +339 -0
- package/src/api/lib/Cors.ts +107 -0
- package/src/api/lib/Database.ts +10 -0
- package/src/api/lib/DeviceRequest.ts +265 -0
- package/src/api/lib/FirstAccount.ts +90 -0
- package/src/api/lib/KeySigner.ts +393 -0
- package/src/api/lib/PasskeyLink.ts +162 -0
- package/src/api/lib/Session.ts +34 -0
- package/src/api/lib/SignInConsent.ts +316 -0
- package/src/api/oauth.ts +1282 -0
- package/src/api/provider.ts +441 -0
- package/src/app/components/Button.tsx +128 -0
- package/src/app/components/CodeInput.tsx +186 -0
- package/src/app/components/ErrorMessage.tsx +66 -0
- package/src/app/components/Grant.tsx +323 -0
- package/src/app/components/Input.tsx +48 -0
- package/src/app/components/Tooltip.tsx +45 -0
- package/src/app/components/icons/BRLA.png +0 -0
- package/src/app/components/icons/BRZ.svg +1 -0
- package/src/app/components/icons/CHFAU.png +0 -0
- package/src/app/components/icons/DLUSD.png +0 -0
- package/src/app/components/icons/EURAU.svg +1 -0
- package/src/app/components/icons/EURC.e.svg +1 -0
- package/src/app/components/icons/GBPA.svg +4 -0
- package/src/app/components/icons/GUSD.svg +1 -0
- package/src/app/components/icons/MACH.svg +4 -0
- package/src/app/components/icons/OUSD.svg +5 -0
- package/src/app/components/icons/PRIME.svg +14 -0
- package/src/app/components/icons/SBC.svg +1 -0
- package/src/app/components/icons/SEKAU.svg +5 -0
- package/src/app/components/icons/USD1.svg +30 -0
- package/src/app/components/icons/USDB.svg +11 -0
- package/src/app/components/icons/USDC.e.svg +1 -0
- package/src/app/components/icons/USDT0.svg +1 -0
- package/src/app/components/icons/USDY.svg +16 -0
- package/src/app/components/icons/USDe.svg +1 -0
- package/src/app/components/icons/YLDS.svg +3 -0
- package/src/app/components/icons/alphaUSD.svg +1 -0
- package/src/app/components/icons/betaUSD.svg +1 -0
- package/src/app/components/icons/cUSD.svg +1 -0
- package/src/app/components/icons/cbBTC.svg +1 -0
- package/src/app/components/icons/frxUSD.svg +1 -0
- package/src/app/components/icons/goUSD.svg +5 -0
- package/src/app/components/icons/iUSD.svg +1 -0
- package/src/app/components/icons/pathUSD.svg +25 -0
- package/src/app/components/icons/rUSD.svg +1 -0
- package/src/app/components/icons/reUSD.svg +1 -0
- package/src/app/components/icons/sUSDe.svg +1 -0
- package/src/app/components/icons/siUSD.svg +1 -0
- package/src/app/components/icons/stcUSD.svg +1 -0
- package/src/app/components/icons/syrupUSDC.svg +5 -0
- package/src/app/components/icons/thetaUSD.svg +1 -0
- package/src/app/components/icons/wYLDS.svg +10 -0
- package/src/app/components/icons/wsrUSD.svg +1 -0
- package/src/app/components/logos/OUSD.dark.svg +17 -0
- package/src/app/components/logos/OUSD.light.svg +17 -0
- package/src/app/crons/cleanup.ts +42 -0
- package/src/app/db/auth.ts +416 -0
- package/src/app/db/migrations/0000_better_auth.sql +53 -0
- package/src/app/db/migrations/0001_oauth_provider.sql +162 -0
- package/src/app/db/migrations/0002_device_code.sql +17 -0
- package/src/app/db/migrations/0003_realms.sql +27 -0
- package/src/app/db/migrations/0004_default_realm.sql +2 -0
- package/src/app/db/migrations/0005_passkeys.sql +30 -0
- package/src/app/db/migrations/0006_first_accounts.sql +9 -0
- package/src/app/db/migrations/0007_pending_keys.sql +13 -0
- package/src/app/db/migrations/0008_secp256k1_owners.sql +18 -0
- package/src/app/db/migrations/0009_device_requests.sql +8 -0
- package/src/app/db/migrations/0010_device_keys.sql +4 -0
- package/src/app/db/migrations/meta/0000_snapshot.json +362 -0
- package/src/app/db/migrations/meta/0001_snapshot.json +1487 -0
- package/src/app/db/migrations/meta/0002_snapshot.json +1603 -0
- package/src/app/db/migrations/meta/0003_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0004_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0005_snapshot.json +1911 -0
- package/src/app/db/migrations/meta/0006_snapshot.json +1967 -0
- package/src/app/db/migrations/meta/0007_snapshot.json +2047 -0
- package/src/app/db/migrations/meta/0008_snapshot.json +2157 -0
- package/src/app/db/migrations/meta/0009_snapshot.json +2207 -0
- package/src/app/db/migrations/meta/0010_snapshot.json +2231 -0
- package/src/app/db/migrations/meta/_journal.json +83 -0
- package/src/app/db/schema.ts +218 -0
- package/src/app/env.ts +49 -0
- package/src/app/lib/Client.ts +82 -0
- package/src/app/lib/Loader.ts +24 -0
- package/src/app/package.json +8 -0
- package/src/app/routeTree.gen.ts +198 -0
- package/src/app/router.tsx +48 -0
- package/src/app/routes/[_].flows.tsx +3001 -0
- package/src/app/routes/__root.tsx +91 -0
- package/src/app/routes/authorize.tsx +197 -0
- package/src/app/routes/choose-account.tsx +111 -0
- package/src/app/routes/deposit.tsx +105 -0
- package/src/app/routes/device.tsx +227 -0
- package/src/app/routes/index.tsx +115 -0
- package/src/app/routes/login.tsx +506 -0
- package/src/app/screens/Account.tsx +347 -0
- package/src/app/screens/Approval.tsx +276 -0
- package/src/app/screens/ChooseAccount.tsx +240 -0
- package/src/app/screens/Deposit.tsx +762 -0
- package/src/app/screens/DeviceApproval.tsx +480 -0
- package/src/app/screens/SignIn.tsx +362 -0
- package/src/app/screens/chains/base.svg +3 -0
- package/src/app/screens/chains/ethereum.svg +11 -0
- package/src/app/screens/chains/solana.svg +4 -0
- package/src/app/screens/chains/tempo.svg +4 -0
- package/src/app/server.ts +204 -0
- package/src/app/vite.config.ts +95 -0
- package/src/app/void.config.ts +29 -0
- package/src/app/zyzz.config.ts +274 -0
- package/src/cli/Admin.ts +73 -0
- package/src/cli/Apps.ts +29 -0
- package/src/cli/Cli.ts +42 -0
- package/src/cli/Project.ts +117 -0
- package/src/cli/Realms.ts +50 -0
- package/src/cli/Session.ts +239 -0
- package/src/cli/User.ts +45 -0
- package/src/cli/V1.ts +57 -0
- package/src/cli/bin.ts +44 -0
- package/src/cli/commands/admin/apps/create.ts +101 -0
- package/src/cli/commands/admin/apps/delete.ts +38 -0
- package/src/cli/commands/admin/apps/index.ts +15 -0
- package/src/cli/commands/admin/apps/list.ts +25 -0
- package/src/cli/commands/admin/apps/rotate-secret.ts +47 -0
- package/src/cli/commands/admin/apps/update.ts +86 -0
- package/src/cli/commands/admin/index.ts +14 -0
- package/src/cli/commands/admin/migrate.ts +16 -0
- package/src/cli/commands/admin/realms/add.ts +40 -0
- package/src/cli/commands/admin/realms/index.ts +14 -0
- package/src/cli/commands/admin/realms/list.ts +38 -0
- package/src/cli/commands/admin/realms/passkeys/index.ts +15 -0
- package/src/cli/commands/admin/realms/passkeys/set.ts +44 -0
- package/src/cli/commands/admin/realms/privy/index.ts +14 -0
- package/src/cli/commands/admin/realms/privy/set.ts +69 -0
- package/src/cli/commands/admin/realms/remove.ts +33 -0
- package/src/cli/commands/admin/realms/secp256k1/disable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/enable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/index.ts +19 -0
- package/src/cli/commands/admin/realms/set.ts +46 -0
- package/src/cli/commands/admin/rotate-key.ts +47 -0
- package/src/cli/commands/init.ts +42 -0
- package/src/cli/commands/login.ts +32 -0
- package/src/cli/commands/logout.ts +19 -0
- package/src/cli/commands/whoami.ts +23 -0
- package/src/client/Actions.ts +168 -0
- package/src/client/Auth.ts +285 -0
- package/src/client/Authorization.ts +34 -0
- package/src/client/Decorator.ts +410 -0
- package/src/client/Key.ts +140 -0
- package/src/client/Pending.ts +46 -0
- package/src/client/Permissions.ts +39 -0
- package/src/client/Provider.ts +18 -0
- package/src/client/Step.ts +24 -0
- package/src/client/Storage.ts +29 -0
- package/src/client/TempoAccount.ts +42 -0
- package/src/client/Tokens.ts +27 -0
- package/src/client/User.ts +23 -0
- package/src/client/actions/account.ts +57 -0
- package/src/client/actions/device.ts +151 -0
- package/src/client/actions/email.ts +141 -0
- package/src/client/actions/oauth.ts +182 -0
- package/src/client/actions/passkey.ts +141 -0
- package/src/client/actions/provider.ts +70 -0
- package/src/client/actions/realm.ts +36 -0
- package/src/client/actions/redirect.ts +408 -0
- package/src/client/internal/accessKey.ts +54 -0
- package/src/client/internal/account.ts +15 -0
- package/src/client/internal/api.ts +224 -0
- package/src/client/internal/headless.ts +77 -0
- package/src/client/internal/indexedDb.ts +44 -0
- package/src/client/internal/request.ts +71 -0
- package/src/client/internal/store.ts +20 -0
- package/src/client.ts +19 -0
- package/src/index.ts +6 -0
- package/src/internal/Apps.ts +718 -0
- package/src/internal/Auth.ts +203 -0
- package/src/internal/Authorize.ts +424 -0
- package/src/internal/Balance.ts +168 -0
- package/src/internal/BodyLimit.ts +36 -0
- package/src/internal/Chain.ts +16 -0
- package/src/internal/Device.ts +469 -0
- package/src/internal/Env.ts +58 -0
- package/src/internal/ErrorResponse.ts +854 -0
- package/src/internal/Id.ts +41 -0
- package/src/internal/KeyAuthorization.ts +1339 -0
- package/src/internal/Limits.ts +39 -0
- package/src/internal/Log.ts +178 -0
- package/src/internal/LogLine.ts +87 -0
- package/src/internal/Logout.ts +336 -0
- package/src/internal/Migrations.ts +86 -0
- package/src/internal/OpenApi.ts +300 -0
- package/src/internal/Owner.ts +211 -0
- package/src/internal/Passkey.ts +1052 -0
- package/src/internal/PendingKey.ts +104 -0
- package/src/internal/Privy.ts +402 -0
- package/src/internal/Provider.ts +125 -0
- package/src/internal/RateLimit.ts +259 -0
- package/src/internal/Realm.ts +768 -0
- package/src/internal/RequestId.ts +118 -0
- package/src/internal/SignInGrant.ts +168 -0
- package/src/internal/SigningKey.ts +286 -0
- package/src/internal/TempoAccount.ts +342 -0
- package/src/internal/TestInbox.ts +51 -0
- package/src/internal/Timing.ts +158 -0
- package/src/internal/Validation.ts +52 -0
- package/src/internal/Wallet.ts +62 -0
- package/src/internal/owners/Passkey.ts +72 -0
- package/src/internal/owners/Privy.ts +81 -0
- package/src/internal/owners/Secp256k1.ts +143 -0
- package/src/types/app.d.ts +19 -0
- package/src/worker.ts +11 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The account screen: the signed-in user, their Tempo Accounts with each balance and a deposit link,
|
|
3
|
+
* and sign-out.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Link } from '@tanstack/react-router'
|
|
7
|
+
import type { ReactNode } from 'react'
|
|
8
|
+
import ArrowDownToLine from '~icons/lucide/arrow-down-to-line'
|
|
9
|
+
import Cloud from '~icons/lucide/cloud'
|
|
10
|
+
import Fingerprint from '~icons/lucide/fingerprint'
|
|
11
|
+
import LogOut from '~icons/lucide/log-out'
|
|
12
|
+
import { Button } from '../components/Button.js'
|
|
13
|
+
import { ErrorMessage } from '../components/ErrorMessage.js'
|
|
14
|
+
import { Tooltip } from '../components/Tooltip.js'
|
|
15
|
+
import { style, variants } from '../zyzz.config.js'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The account screen. It names the user, lists their Tempo Accounts with each balance, oldest
|
|
19
|
+
* first, and offers sign-out. A lone account shows its balance large, without a list.
|
|
20
|
+
*/
|
|
21
|
+
export function Account(props: Account.Props): ReactNode {
|
|
22
|
+
const { accounts } = props
|
|
23
|
+
const Title = props.heading ?? 'h1'
|
|
24
|
+
const Subtitle = props.heading === 'h4' ? 'h5' : 'h2'
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div {...styles.column()}>
|
|
28
|
+
<header {...styles.header()}>
|
|
29
|
+
<span {...styles.avatar()} aria-hidden>
|
|
30
|
+
{(props.name || props.email).charAt(0).toUpperCase()}
|
|
31
|
+
</span>
|
|
32
|
+
<div {...styles.identity()}>
|
|
33
|
+
{/* The email heads the screen when the user has no name. */}
|
|
34
|
+
<Title {...styles.name()}>{props.name || props.email}</Title>
|
|
35
|
+
{props.name ? <p {...styles.email()}>{props.email}</p> : null}
|
|
36
|
+
</div>
|
|
37
|
+
</header>
|
|
38
|
+
|
|
39
|
+
{(() => {
|
|
40
|
+
if (!accounts)
|
|
41
|
+
return (
|
|
42
|
+
<ErrorMessage align="center">{props.accountError}</ErrorMessage>
|
|
43
|
+
)
|
|
44
|
+
if (!accounts.length)
|
|
45
|
+
return (
|
|
46
|
+
<p {...styles.hint()}>
|
|
47
|
+
You have no wallets yet. Sign in to an app to create one.
|
|
48
|
+
</p>
|
|
49
|
+
)
|
|
50
|
+
const only = accounts.length === 1 ? accounts[0] : undefined
|
|
51
|
+
// One wallet needs no list, so its balance leads the screen.
|
|
52
|
+
if (only)
|
|
53
|
+
return (
|
|
54
|
+
<section {...styles.single()} aria-label="Wallet">
|
|
55
|
+
<span {...styles.balance()} data-testid="balance">
|
|
56
|
+
{format(only.balance)}
|
|
57
|
+
</span>
|
|
58
|
+
<DepositLink entry={only} large />
|
|
59
|
+
</section>
|
|
60
|
+
)
|
|
61
|
+
return (
|
|
62
|
+
<section {...styles.accounts()}>
|
|
63
|
+
<Subtitle {...styles.label()}>Wallets</Subtitle>
|
|
64
|
+
<ul {...styles.list()} aria-label="Wallets">
|
|
65
|
+
{accounts.map((entry) => (
|
|
66
|
+
<li {...styles.row()} key={entry.address}>
|
|
67
|
+
{entry.owner === 'webAuthn' ? (
|
|
68
|
+
<Fingerprint {...styles.owner()} aria-hidden />
|
|
69
|
+
) : (
|
|
70
|
+
<Cloud {...styles.owner()} aria-hidden />
|
|
71
|
+
)}
|
|
72
|
+
<span {...styles.kind()}>{kind(entry)}</span>
|
|
73
|
+
<span {...styles.amount()} data-testid="balance">
|
|
74
|
+
{format(entry.balance)}
|
|
75
|
+
</span>
|
|
76
|
+
<DepositLink entry={entry} />
|
|
77
|
+
</li>
|
|
78
|
+
))}
|
|
79
|
+
</ul>
|
|
80
|
+
</section>
|
|
81
|
+
)
|
|
82
|
+
})()}
|
|
83
|
+
|
|
84
|
+
<Button
|
|
85
|
+
loading={props.signingOut}
|
|
86
|
+
onClick={props.onSignOut}
|
|
87
|
+
prefix={<LogOut {...styles.icon()} aria-hidden />}
|
|
88
|
+
variant="secondary"
|
|
89
|
+
>
|
|
90
|
+
Sign out
|
|
91
|
+
</Button>
|
|
92
|
+
<ErrorMessage align="center">{props.error}</ErrorMessage>
|
|
93
|
+
<p {...styles.status()} aria-live="polite" role="status">
|
|
94
|
+
{props.signingOut ? 'Signing out.' : undefined}
|
|
95
|
+
</p>
|
|
96
|
+
</div>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export declare namespace Account {
|
|
101
|
+
type Props = {
|
|
102
|
+
/** Why the accounts failed to load. It shows when `accounts` is `null`. */
|
|
103
|
+
accountError?: string | undefined
|
|
104
|
+
/** The user's Tempo Accounts in the `default` realm, oldest first, or `null` when they failed to load. */
|
|
105
|
+
accounts: readonly Entry[] | null
|
|
106
|
+
/** The signed-in user's email address. */
|
|
107
|
+
email: string
|
|
108
|
+
/** Why the sign-out failed. */
|
|
109
|
+
error?: string | undefined
|
|
110
|
+
/** The level of the screen's title: `h1` by default, or `h4` on the flows canvas, below the canvas's own headings. */
|
|
111
|
+
heading?: 'h1' | 'h4' | undefined
|
|
112
|
+
/** The user's name, which heads the screen when the user has one. */
|
|
113
|
+
name?: string | undefined
|
|
114
|
+
/** Signs the user out. */
|
|
115
|
+
onSignOut: () => void
|
|
116
|
+
/** Whether the sign-out is in progress, which holds the button. */
|
|
117
|
+
signingOut: boolean
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** One account, with its balance. */
|
|
121
|
+
type Entry = {
|
|
122
|
+
/** The account's address. */
|
|
123
|
+
address: `0x${string}`
|
|
124
|
+
/** The account's balance, or `null` when it failed to load. */
|
|
125
|
+
balance: Balance | null
|
|
126
|
+
/**
|
|
127
|
+
* Who holds the owner key: a Privy wallet (`privy`), a key that Tempo ID holds in development
|
|
128
|
+
* (`secp256k1`), or a passkey (`webAuthn`).
|
|
129
|
+
*/
|
|
130
|
+
owner: 'privy' | 'secp256k1' | 'webAuthn'
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** A balance in one currency. */
|
|
134
|
+
type Balance = {
|
|
135
|
+
/** The amount, as a decimal string, such as `12.5`. */
|
|
136
|
+
amount: string
|
|
137
|
+
/** The ISO 4217 currency code, such as `USD`. */
|
|
138
|
+
currency: string
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Links to the deposit page for one wallet, as an icon with a tooltip. */
|
|
143
|
+
function DepositLink(props: DepositLink.Props): ReactNode {
|
|
144
|
+
const { address } = props.entry
|
|
145
|
+
return (
|
|
146
|
+
<Tooltip label="Deposit">
|
|
147
|
+
<Link
|
|
148
|
+
{...styles.deposit({ size: props.large ? 'large' : 'small' })}
|
|
149
|
+
// The short address tells apart wallets of the same kind, which the row shows only by name.
|
|
150
|
+
aria-label={`Deposit to ${kind(props.entry)} wallet ${address.slice(0, 6)}…${address.slice(-4)}`}
|
|
151
|
+
search={{ address }}
|
|
152
|
+
to="/deposit"
|
|
153
|
+
>
|
|
154
|
+
<ArrowDownToLine
|
|
155
|
+
{...(props.large ? styles.depositIcon() : styles.icon())}
|
|
156
|
+
aria-hidden
|
|
157
|
+
/>
|
|
158
|
+
</Link>
|
|
159
|
+
</Tooltip>
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
declare namespace DepositLink {
|
|
164
|
+
type Props = {
|
|
165
|
+
/** The wallet the deposit goes to. */
|
|
166
|
+
entry: Account.Entry
|
|
167
|
+
/** Whether the icon matches the size of a lone wallet's balance. */
|
|
168
|
+
large?: boolean | undefined
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Formats a balance in its currency, or names its failed state. The locale is fixed, so the server
|
|
174
|
+
* and the browser render the same text.
|
|
175
|
+
*/
|
|
176
|
+
function format(balance: Account.Entry['balance']) {
|
|
177
|
+
if (!balance) return 'Unavailable'
|
|
178
|
+
return new Intl.NumberFormat('en-US', {
|
|
179
|
+
currency: balance.currency,
|
|
180
|
+
style: 'currency',
|
|
181
|
+
// A decimal string keeps every digit, which a `Number` would round.
|
|
182
|
+
}).format(balance.amount as Intl.StringNumericLiteral)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Names an account by its owner. A Privy wallet is `Cloud`, since it is held for the user rather than on a device. */
|
|
186
|
+
function kind(entry: Account.Entry) {
|
|
187
|
+
return entry.owner === 'webAuthn' ? 'Passkey' : 'Cloud'
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
namespace styles {
|
|
191
|
+
export const accounts = style({ display: 'grid', gap: 2 })
|
|
192
|
+
|
|
193
|
+
export const amount = style({
|
|
194
|
+
fontVariantNumeric: 'tabular-nums',
|
|
195
|
+
marginLeft: 'auto',
|
|
196
|
+
typography: 'label.14',
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
export const avatar = style({
|
|
200
|
+
alignItems: 'center',
|
|
201
|
+
backgroundColor: 'foreground',
|
|
202
|
+
backgroundImage: 'sheen',
|
|
203
|
+
borderRadius: 'full',
|
|
204
|
+
color: 'background.surface',
|
|
205
|
+
display: 'flex',
|
|
206
|
+
flexShrink: 0,
|
|
207
|
+
height: 16,
|
|
208
|
+
justifyContent: 'center',
|
|
209
|
+
typography: 'heading.24',
|
|
210
|
+
width: 16,
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
export const balance = style({
|
|
214
|
+
fontVariantNumeric: 'tabular-nums',
|
|
215
|
+
letterSpacing: 'balance',
|
|
216
|
+
typography: 'heading.32',
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
export const column = style({
|
|
220
|
+
display: 'grid',
|
|
221
|
+
gap: 8,
|
|
222
|
+
maxWidth: 'sm',
|
|
223
|
+
width: 'full',
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
// Pseudo-elements make the touch target and the hover fill larger than the icon. The icon sits
|
|
227
|
+
// above the fill. In a row the fill stays smaller than the hit area, so a gap stays before the
|
|
228
|
+
// balance.
|
|
229
|
+
export const deposit = variants({
|
|
230
|
+
base: {
|
|
231
|
+
borderRadius: 'full',
|
|
232
|
+
color: 'gray.900',
|
|
233
|
+
display: 'flex',
|
|
234
|
+
flexShrink: 0,
|
|
235
|
+
outline: 'none',
|
|
236
|
+
position: 'relative',
|
|
237
|
+
'& > svg': { position: 'relative', zIndex: 1 },
|
|
238
|
+
'&::before': {
|
|
239
|
+
content: '""',
|
|
240
|
+
inset: 'bleed',
|
|
241
|
+
position: 'absolute',
|
|
242
|
+
},
|
|
243
|
+
'&::after': {
|
|
244
|
+
borderRadius: 'full',
|
|
245
|
+
content: '""',
|
|
246
|
+
position: 'absolute',
|
|
247
|
+
},
|
|
248
|
+
':focus-visible': {
|
|
249
|
+
outline: '2px solid',
|
|
250
|
+
outlineColor: 'blue.700',
|
|
251
|
+
outlineOffset: '2px',
|
|
252
|
+
},
|
|
253
|
+
':hover': { color: 'foreground' },
|
|
254
|
+
':hover::after': { backgroundColor: 'grayAlpha.200' },
|
|
255
|
+
},
|
|
256
|
+
variants: {
|
|
257
|
+
size: {
|
|
258
|
+
large: { '&::after': { inset: 'bleed' } },
|
|
259
|
+
small: { '&::after': { inset: 'bleedSmall' } },
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
export const depositIcon = style({ height: 6, width: 6 })
|
|
265
|
+
|
|
266
|
+
export const email = style({ color: 'gray.900', typography: 'copy.16' })
|
|
267
|
+
|
|
268
|
+
export const header = style({
|
|
269
|
+
display: 'grid',
|
|
270
|
+
gap: 3,
|
|
271
|
+
justifyItems: 'center',
|
|
272
|
+
textAlign: 'center',
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
export const hint = style({
|
|
276
|
+
color: 'gray.900',
|
|
277
|
+
textAlign: 'center',
|
|
278
|
+
textWrap: 'balance',
|
|
279
|
+
typography: 'copy.14',
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
export const icon = style({ height: 4, width: 4 })
|
|
283
|
+
|
|
284
|
+
export const identity = style({ display: 'grid', gap: 1, minWidth: 0 })
|
|
285
|
+
|
|
286
|
+
export const kind = style({
|
|
287
|
+
fontWeight: 'medium',
|
|
288
|
+
minWidth: 0,
|
|
289
|
+
overflow: 'hidden',
|
|
290
|
+
textOverflow: 'ellipsis',
|
|
291
|
+
typography: 'label.14',
|
|
292
|
+
whiteSpace: 'nowrap',
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
export const label = style({
|
|
296
|
+
color: 'gray.900',
|
|
297
|
+
paddingInline: 4,
|
|
298
|
+
typography: 'label.14',
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
// A gray group, as in Link's settings, whose rows need no dividers.
|
|
302
|
+
export const list = style({
|
|
303
|
+
backgroundColor: 'gray.100',
|
|
304
|
+
borderRadius: '2xl',
|
|
305
|
+
display: 'grid',
|
|
306
|
+
listStyle: 'none',
|
|
307
|
+
margin: 0,
|
|
308
|
+
overflow: 'hidden',
|
|
309
|
+
padding: 0,
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
export const name = style({
|
|
313
|
+
overflowWrap: 'anywhere',
|
|
314
|
+
typography: 'heading.24',
|
|
315
|
+
})
|
|
316
|
+
|
|
317
|
+
export const owner = style({
|
|
318
|
+
color: 'gray.900',
|
|
319
|
+
flexShrink: 0,
|
|
320
|
+
height: 4,
|
|
321
|
+
width: 4,
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
export const row = style({
|
|
325
|
+
alignItems: 'center',
|
|
326
|
+
display: 'flex',
|
|
327
|
+
gap: 3,
|
|
328
|
+
justifyContent: 'space-between',
|
|
329
|
+
paddingBlock: 3,
|
|
330
|
+
paddingInline: 4,
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
// The balance on the left and its deposit link on the right, inset like the list's rows.
|
|
334
|
+
export const single = style({
|
|
335
|
+
alignItems: 'center',
|
|
336
|
+
display: 'flex',
|
|
337
|
+
gap: 3,
|
|
338
|
+
justifyContent: 'space-between',
|
|
339
|
+
paddingInline: 4,
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
export const status = style({
|
|
343
|
+
color: 'gray.900',
|
|
344
|
+
textAlign: 'center',
|
|
345
|
+
typography: 'copy.14',
|
|
346
|
+
})
|
|
347
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The approval screen for an app's authorization request, with the key that it requests, and the
|
|
3
|
+
* screen for a request that the approval page cannot show. The layout follows the
|
|
4
|
+
* approval screen of the WorkOS implementation.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from 'react'
|
|
8
|
+
import BadgeCheck from '~icons/lucide/badge-check'
|
|
9
|
+
import Globe from '~icons/lucide/globe'
|
|
10
|
+
import type * as KeyAuthorization from '../../internal/KeyAuthorization.js'
|
|
11
|
+
import { Button } from '../components/Button.js'
|
|
12
|
+
import { ErrorMessage } from '../components/ErrorMessage.js'
|
|
13
|
+
import { Grant } from '../components/Grant.js'
|
|
14
|
+
import { Tooltip } from '../components/Tooltip.js'
|
|
15
|
+
import { style } from '../zyzz.config.js'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The approval screen. It names the app, shows the key that the app requests and any message that
|
|
19
|
+
* the key signs, and approves or denies the request. A key that
|
|
20
|
+
* approval cannot sign holds the approval, and the screen states why.
|
|
21
|
+
*/
|
|
22
|
+
export function Approval(props: Approval.Props): ReactNode {
|
|
23
|
+
const Title = props.heading ?? 'h1'
|
|
24
|
+
const pending = props.approving || props.denying
|
|
25
|
+
const refusal = props.refusal ?? props.keyAuthorization?.refusal
|
|
26
|
+
return (
|
|
27
|
+
<div {...styles.column()}>
|
|
28
|
+
<header {...styles.header()}>
|
|
29
|
+
{/* Apps have no logos, so every app shows a globe in their place. */}
|
|
30
|
+
<span {...styles.avatar()}>
|
|
31
|
+
<Globe {...styles.avatarIcon()} aria-hidden />
|
|
32
|
+
</span>
|
|
33
|
+
<Title {...styles.title()}>Authorize this app</Title>
|
|
34
|
+
<p {...styles.description()}>
|
|
35
|
+
Approve to let{' '}
|
|
36
|
+
<span {...styles.app()}>
|
|
37
|
+
<strong>{props.app}</strong>{' '}
|
|
38
|
+
<Tooltip label="Verified app">
|
|
39
|
+
<BadgeCheck
|
|
40
|
+
{...styles.badge()}
|
|
41
|
+
aria-label="Verified"
|
|
42
|
+
role="img"
|
|
43
|
+
tabIndex={0}
|
|
44
|
+
/>
|
|
45
|
+
</Tooltip>
|
|
46
|
+
</span>{' '}
|
|
47
|
+
use your Tempo Account.
|
|
48
|
+
</p>
|
|
49
|
+
</header>
|
|
50
|
+
|
|
51
|
+
<div {...styles.stack()}>
|
|
52
|
+
{props.keyAuthorization ? (
|
|
53
|
+
<Grant
|
|
54
|
+
heading={props.heading === 'h4' ? 'h5' : 'h2'}
|
|
55
|
+
keyAuthorization={props.keyAuthorization}
|
|
56
|
+
/>
|
|
57
|
+
) : null}
|
|
58
|
+
{props.keyAuthorization?.challenge ? (
|
|
59
|
+
<div {...styles.challenge()} role="note">
|
|
60
|
+
<p {...styles.challengeTitle()}>
|
|
61
|
+
This sign-in also signs a message
|
|
62
|
+
</p>
|
|
63
|
+
<p {...styles.challengeText()}>
|
|
64
|
+
Approve only if you started this sign-in and expect this message.
|
|
65
|
+
</p>
|
|
66
|
+
<pre {...styles.message()}>{props.keyAuthorization.challenge}</pre>
|
|
67
|
+
</div>
|
|
68
|
+
) : null}
|
|
69
|
+
<Button
|
|
70
|
+
disabled={props.denying || Boolean(refusal)}
|
|
71
|
+
loading={props.approving}
|
|
72
|
+
onClick={props.onApprove}
|
|
73
|
+
>
|
|
74
|
+
Approve
|
|
75
|
+
</Button>
|
|
76
|
+
<Button
|
|
77
|
+
disabled={props.approving}
|
|
78
|
+
loading={props.denying}
|
|
79
|
+
onClick={props.onDeny}
|
|
80
|
+
variant="tertiary"
|
|
81
|
+
>
|
|
82
|
+
Deny
|
|
83
|
+
</Button>
|
|
84
|
+
<p {...styles.note()}>
|
|
85
|
+
Signed in as <strong>{props.email}</strong>. Either choice returns you
|
|
86
|
+
to <strong>{props.destination}</strong>.
|
|
87
|
+
</p>
|
|
88
|
+
<p {...styles.status()} aria-live="polite" role="status">
|
|
89
|
+
{pending ? `Returning to ${props.destination}.` : undefined}
|
|
90
|
+
</p>
|
|
91
|
+
</div>
|
|
92
|
+
{/* A failed decision outranks the refusal, whose only action is the denial that failed. */}
|
|
93
|
+
<ErrorMessage>
|
|
94
|
+
{props.error ?? (refusal ? refusals[refusal] : undefined)}
|
|
95
|
+
</ErrorMessage>
|
|
96
|
+
</div>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export declare namespace Approval {
|
|
101
|
+
type Props = {
|
|
102
|
+
/** The app's display name. */
|
|
103
|
+
app: string
|
|
104
|
+
/** Whether the approval is in progress, which holds both buttons. */
|
|
105
|
+
approving: boolean
|
|
106
|
+
/** Whether the denial is in progress, which holds both buttons. */
|
|
107
|
+
denying: boolean
|
|
108
|
+
/** The host of the app's redirect URI, or its scheme for a native app. */
|
|
109
|
+
destination: string
|
|
110
|
+
/** The signed-in user's address. */
|
|
111
|
+
email: string
|
|
112
|
+
/** Why the decision failed. */
|
|
113
|
+
error?: string | undefined
|
|
114
|
+
/** The level of the screen's title: `h1` by default, or `h4` on the flows canvas, below the canvas's own headings. */
|
|
115
|
+
heading?: 'h1' | 'h4' | undefined
|
|
116
|
+
/** The key that the app requests, if any. */
|
|
117
|
+
keyAuthorization?: Key | undefined
|
|
118
|
+
/** Approves the request. */
|
|
119
|
+
onApprove: () => void
|
|
120
|
+
/** Denies the request, which returns the browser to the app with `access_denied`. */
|
|
121
|
+
onDeny: () => void
|
|
122
|
+
/**
|
|
123
|
+
* Why approval cannot sign the key, which holds the approval. Takes the place of the key's own
|
|
124
|
+
* `refusal`, such as after an approval that the API refused.
|
|
125
|
+
*/
|
|
126
|
+
refusal?: Refusal | undefined
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** A key that the app requests, as the approval page shows it. */
|
|
130
|
+
type Key = KeyAuthorization.Description & {
|
|
131
|
+
/** The message that the key's witness binds, such as a sign-in challenge from the app. */
|
|
132
|
+
challenge?: string | undefined
|
|
133
|
+
/** Why approval cannot sign the key. Absent when it can. */
|
|
134
|
+
refusal?: Refusal | undefined
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Why approval cannot sign a key: a passkey that the page cannot use owns the account, the user
|
|
139
|
+
* holds no account, or the user's accounts could not be read.
|
|
140
|
+
*/
|
|
141
|
+
type Refusal = 'no_account' | 'passkey' | 'unavailable'
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** The screen for an authorization request that the approval page cannot show, with the reason. */
|
|
145
|
+
export function InvalidRequest(props: InvalidRequest.Props): ReactNode {
|
|
146
|
+
const Title = props.heading ?? 'h1'
|
|
147
|
+
return (
|
|
148
|
+
<div {...styles.column()}>
|
|
149
|
+
<header {...styles.header()}>
|
|
150
|
+
<Title {...styles.title()}>This sign-in request is invalid</Title>
|
|
151
|
+
<p {...styles.description()}>
|
|
152
|
+
The app sent a request Tempo ID cannot complete. Return to the app and
|
|
153
|
+
try again.
|
|
154
|
+
</p>
|
|
155
|
+
</header>
|
|
156
|
+
</div>
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export declare namespace InvalidRequest {
|
|
161
|
+
type Props = {
|
|
162
|
+
/** The level of the screen's title: `h1` by default, or `h4` on the flows canvas, below the canvas's own headings. */
|
|
163
|
+
heading?: 'h1' | 'h4' | undefined
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Why approval cannot sign a key, as the screen states it. */
|
|
168
|
+
const refusals: Record<Approval.Refusal, string> = {
|
|
169
|
+
no_account:
|
|
170
|
+
'You have no Tempo Account for this app yet, so no account can approve the key. Deny the request, create an account in the app, and try again.',
|
|
171
|
+
passkey:
|
|
172
|
+
'This Tempo Account signs with a passkey that this page cannot use. Deny the request, and return to the app.',
|
|
173
|
+
unavailable:
|
|
174
|
+
'Tempo ID cannot read your Tempo Account right now. Reload the page in a minute, or deny the request.',
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
namespace styles {
|
|
178
|
+
// The app's name and badge wrap as one word, so a hyphenated name never splits.
|
|
179
|
+
export const app = style({ whiteSpace: 'nowrap' })
|
|
180
|
+
|
|
181
|
+
export const avatar = style({
|
|
182
|
+
alignItems: 'center',
|
|
183
|
+
backgroundColor: 'background.surface',
|
|
184
|
+
border: '1px solid',
|
|
185
|
+
borderColor: 'gray.400',
|
|
186
|
+
borderRadius: 'full',
|
|
187
|
+
boxShadow: 'sm',
|
|
188
|
+
color: 'gray.900',
|
|
189
|
+
display: 'flex',
|
|
190
|
+
height: 14,
|
|
191
|
+
justifyContent: 'center',
|
|
192
|
+
marginBottom: 3,
|
|
193
|
+
width: 14,
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
export const avatarIcon = style({ height: 6, width: 6 })
|
|
197
|
+
|
|
198
|
+
export const badge = style({
|
|
199
|
+
display: 'inline',
|
|
200
|
+
height: 4,
|
|
201
|
+
outline: 'none',
|
|
202
|
+
verticalAlign: 'middle',
|
|
203
|
+
width: 4,
|
|
204
|
+
':focus-visible': {
|
|
205
|
+
outline: '2px solid',
|
|
206
|
+
outlineColor: 'blue.700',
|
|
207
|
+
outlineOffset: '2px',
|
|
208
|
+
},
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
export const challenge = style({
|
|
212
|
+
backgroundColor: 'amber.100',
|
|
213
|
+
borderRadius: '2xl',
|
|
214
|
+
display: 'grid',
|
|
215
|
+
gap: 2,
|
|
216
|
+
padding: 4,
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
export const challengeText = style({
|
|
220
|
+
color: 'foreground',
|
|
221
|
+
typography: 'copy.14',
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
export const challengeTitle = style({
|
|
225
|
+
color: 'amber.900',
|
|
226
|
+
typography: 'label.14',
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
export const column = style({
|
|
230
|
+
display: 'grid',
|
|
231
|
+
gap: 8,
|
|
232
|
+
maxWidth: 'sm',
|
|
233
|
+
width: 'full',
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
export const description = style({
|
|
237
|
+
color: 'gray.900',
|
|
238
|
+
textWrap: 'balance',
|
|
239
|
+
typography: 'copy.16',
|
|
240
|
+
'& strong': { color: 'foreground', fontWeight: 'medium' },
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
export const header = style({
|
|
244
|
+
display: 'grid',
|
|
245
|
+
gap: 2,
|
|
246
|
+
justifyItems: 'center',
|
|
247
|
+
textAlign: 'center',
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
export const message = style({
|
|
251
|
+
margin: 0,
|
|
252
|
+
overflowWrap: 'anywhere',
|
|
253
|
+
typography: 'copy.13.mono',
|
|
254
|
+
whiteSpace: 'pre-wrap',
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
export const note = style({
|
|
258
|
+
color: 'gray.900',
|
|
259
|
+
textAlign: 'center',
|
|
260
|
+
typography: 'copy.14',
|
|
261
|
+
'& strong': { color: 'foreground', fontWeight: 'medium' },
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
export const stack = style({ display: 'grid', gap: 4 })
|
|
265
|
+
|
|
266
|
+
export const status = style({
|
|
267
|
+
color: 'gray.900',
|
|
268
|
+
textAlign: 'center',
|
|
269
|
+
typography: 'copy.14',
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
export const title = style({
|
|
273
|
+
textWrap: 'balance',
|
|
274
|
+
typography: 'heading.24',
|
|
275
|
+
})
|
|
276
|
+
}
|