@cedros/login-react 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.
- package/LICENSE +21 -0
- package/README.md +1183 -0
- package/dist/EmailRegisterForm-D_uCEdX9.cjs +1 -0
- package/dist/EmailRegisterForm-D_uCEdX9.cjs.map +1 -0
- package/dist/EmailRegisterForm-m3rX3A6X.js +2923 -0
- package/dist/EmailRegisterForm-m3rX3A6X.js.map +1 -0
- package/dist/ErrorMessage-Bm1j5mBT.js +2042 -0
- package/dist/ErrorMessage-Bm1j5mBT.js.map +1 -0
- package/dist/ErrorMessage-CntMyn93.cjs +1 -0
- package/dist/ErrorMessage-CntMyn93.cjs.map +1 -0
- package/dist/GoogleLoginButton-CJNJ-THo.cjs +1 -0
- package/dist/GoogleLoginButton-CJNJ-THo.cjs.map +1 -0
- package/dist/GoogleLoginButton-CvDoOc-0.js +227 -0
- package/dist/GoogleLoginButton-CvDoOc-0.js.map +1 -0
- package/dist/SolanaLoginButton-BlSgPW50.cjs +1 -0
- package/dist/SolanaLoginButton-BlSgPW50.cjs.map +1 -0
- package/dist/SolanaLoginButton-h32xN2PQ.js +261 -0
- package/dist/SolanaLoginButton-h32xN2PQ.js.map +1 -0
- package/dist/assets/argon2Worker-Bi5TuQvD.js +1 -0
- package/dist/assets/argon2Worker-Bi5TuQvD.js.map +1 -0
- package/dist/components/LoginButton.d.ts +23 -0
- package/dist/components/LoginForm.d.ts +9 -0
- package/dist/components/LoginModal.d.ts +9 -0
- package/dist/components/admin/AdminUserDetail.d.ts +21 -0
- package/dist/components/admin/AdminUserList.d.ts +25 -0
- package/dist/components/admin/CedrosAdminDashboard.d.ts +48 -0
- package/dist/components/admin/SystemSettings.d.ts +19 -0
- package/dist/components/apple/AppleLoginButton.d.ts +29 -0
- package/dist/components/deposit/CreditBalance.d.ts +19 -0
- package/dist/components/deposit/DepositFlow.d.ts +118 -0
- package/dist/components/deposit/FeeConfigDisplay.d.ts +15 -0
- package/dist/components/deposit/History.d.ts +21 -0
- package/dist/components/deposit/TieredAmountSlider.d.ts +19 -0
- package/dist/components/deposit/TokenSelector.d.ts +23 -0
- package/dist/components/deposit/admin/AdminDepositList.d.ts +21 -0
- package/dist/components/deposit/admin/AdminDepositStats.d.ts +15 -0
- package/dist/components/deposit/admin/AdminPrivacyPeriodDeposits.d.ts +19 -0
- package/dist/components/deposit/admin/AdminWithdrawalHistory.d.ts +19 -0
- package/dist/components/deposit/admin/AdminWithdrawalQueue.d.ts +23 -0
- package/dist/components/deposit/admin/PrivacySystemStatus.d.ts +15 -0
- package/dist/components/deposit/admin/index.d.ts +17 -0
- package/dist/components/deposit/index.d.ts +12 -0
- package/dist/components/deposit/tierUtils.d.ts +8 -0
- package/dist/components/deposit/tokens.d.ts +19 -0
- package/dist/components/email/EmailLoginForm.d.ts +11 -0
- package/dist/components/email/EmailRegisterForm.d.ts +14 -0
- package/dist/components/email/ForgotPasswordForm.d.ts +17 -0
- package/dist/components/email/PasswordInput.d.ts +14 -0
- package/dist/components/email/ResetPasswordForm.d.ts +22 -0
- package/dist/components/google/GoogleLoginButton.d.ts +12 -0
- package/dist/components/invites/InviteForm.d.ts +38 -0
- package/dist/components/invites/InviteList.d.ts +40 -0
- package/dist/components/members/MemberList.d.ts +47 -0
- package/dist/components/org/CreateOrgForm.d.ts +7 -0
- package/dist/components/org/OrgAvatar.d.ts +7 -0
- package/dist/components/org/OrgListView.d.ts +9 -0
- package/dist/components/org/OrgSelector.d.ts +51 -0
- package/dist/components/org/OrgSwitcher.d.ts +47 -0
- package/dist/components/org/icons.d.ts +8 -0
- package/dist/components/sessions/SessionList.d.ts +33 -0
- package/dist/components/shared/ErrorBoundary.d.ts +38 -0
- package/dist/components/shared/ErrorMessage.d.ts +14 -0
- package/dist/components/shared/LoadingSpinner.d.ts +16 -0
- package/dist/components/solana/SolanaLoginButton.d.ts +49 -0
- package/dist/components/templates/FullPageLayout.d.ts +40 -0
- package/dist/components/templates/SplitPageLayout.d.ts +44 -0
- package/dist/components/templates/index.d.ts +4 -0
- package/dist/components/totp/OtpInput.d.ts +32 -0
- package/dist/components/totp/QrCode.d.ts +21 -0
- package/dist/components/totp/TotpSettings.d.ts +38 -0
- package/dist/components/totp/TotpSetup.d.ts +23 -0
- package/dist/components/totp/TotpVerify.d.ts +25 -0
- package/dist/components/totp/index.d.ts +10 -0
- package/dist/components/wallet/CapabilityWarning.d.ts +11 -0
- package/dist/components/wallet/PasskeyPrompt.d.ts +34 -0
- package/dist/components/wallet/RecoveryPhraseDisplay.d.ts +18 -0
- package/dist/components/wallet/RecoveryPhraseInput.d.ts +21 -0
- package/dist/components/wallet/WalletAddressRow.d.ts +10 -0
- package/dist/components/wallet/WalletEnrollment.d.ts +15 -0
- package/dist/components/wallet/WalletManager.d.ts +9 -0
- package/dist/components/wallet/WalletRecovery.d.ts +19 -0
- package/dist/components/wallet/WalletStatus.d.ts +28 -0
- package/dist/components/wallet/WalletUnlock.d.ts +23 -0
- package/dist/components/wallet/index.d.ts +23 -0
- package/dist/components/webauthn/PasskeyLoginButton.d.ts +8 -0
- package/dist/context/CedrosLoginContext.d.ts +24 -0
- package/dist/context/CedrosLoginProvider.d.ts +17 -0
- package/dist/context/EmbeddedWalletExposure.d.ts +19 -0
- package/dist/context/useCedrosLogin.d.ts +12 -0
- package/dist/crypto/aesGcm.d.ts +89 -0
- package/dist/crypto/argon2.d.ts +65 -0
- package/dist/crypto/argon2Worker.d.ts +1 -0
- package/dist/crypto/argon2WorkerClient.d.ts +28 -0
- package/dist/crypto/bip39.d.ts +106 -0
- package/dist/crypto/capabilities.d.ts +35 -0
- package/dist/crypto/entropy.d.ts +56 -0
- package/dist/crypto/hkdf.d.ts +38 -0
- package/dist/crypto/index.d.ts +30 -0
- package/dist/crypto/secureWipe.d.ts +90 -0
- package/dist/crypto/shamir.d.ts +52 -0
- package/dist/crypto/solanaKeypair.d.ts +63 -0
- package/dist/crypto/types.d.ts +134 -0
- package/dist/crypto/webauthnPrf.d.ts +118 -0
- package/dist/email-only.cjs +1 -0
- package/dist/email-only.cjs.map +1 -0
- package/dist/email-only.d.ts +16 -0
- package/dist/email-only.js +15 -0
- package/dist/email-only.js.map +1 -0
- package/dist/google-only.cjs +1 -0
- package/dist/google-only.cjs.map +1 -0
- package/dist/google-only.d.ts +13 -0
- package/dist/google-only.js +11 -0
- package/dist/google-only.js.map +1 -0
- package/dist/hooks/useAdminDeposits.d.ts +10 -0
- package/dist/hooks/useAdminUsers.d.ts +28 -0
- package/dist/hooks/useAppleAuth.d.ts +52 -0
- package/dist/hooks/useAuth.d.ts +34 -0
- package/dist/hooks/useAuthSession.d.ts +19 -0
- package/dist/hooks/useAuthorize.d.ts +62 -0
- package/dist/hooks/useCredits.d.ts +11 -0
- package/dist/hooks/useDeposit.d.ts +16 -0
- package/dist/hooks/useEmailAuth.d.ts +60 -0
- package/dist/hooks/useGoogleAuth.d.ts +67 -0
- package/dist/hooks/useInstantLink.d.ts +42 -0
- package/dist/hooks/useInvites.d.ts +57 -0
- package/dist/hooks/useMembers.d.ts +52 -0
- package/dist/hooks/useOrgs.d.ts +49 -0
- package/dist/hooks/usePasswordReset.d.ts +32 -0
- package/dist/hooks/usePendingRecovery.d.ts +34 -0
- package/dist/hooks/useRateLimiter.d.ts +58 -0
- package/dist/hooks/useSessions.d.ts +45 -0
- package/dist/hooks/useSolanaAuth.d.ts +30 -0
- package/dist/hooks/useSystemSettings.d.ts +47 -0
- package/dist/hooks/useThemeManager.d.ts +11 -0
- package/dist/hooks/useTotp.d.ts +52 -0
- package/dist/hooks/useTotpVerify.d.ts +38 -0
- package/dist/hooks/useTransactionSigning.d.ts +45 -0
- package/dist/hooks/useWallet.d.ts +10 -0
- package/dist/hooks/useWalletDiscovery.d.ts +24 -0
- package/dist/hooks/useWalletEnrollment.d.ts +9 -0
- package/dist/hooks/useWalletMaterial.d.ts +10 -0
- package/dist/hooks/useWalletRecovery.d.ts +9 -0
- package/dist/hooks/useWalletSigning.d.ts +31 -0
- package/dist/hooks/useWebAuthn.d.ts +25 -0
- package/dist/i18n/I18nProvider.d.ts +16 -0
- package/dist/i18n/context.d.ts +6 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/translations.d.ts +66 -0
- package/dist/i18n/useI18n.d.ts +9 -0
- package/dist/index.cjs +2061 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +126 -0
- package/dist/index.js +14910 -0
- package/dist/index.js.map +1 -0
- package/dist/login-react.css +1 -0
- package/dist/solana-only.cjs +1 -0
- package/dist/solana-only.cjs.map +1 -0
- package/dist/solana-only.d.ts +13 -0
- package/dist/solana-only.js +11 -0
- package/dist/solana-only.js.map +1 -0
- package/dist/style.cjs +1 -0
- package/dist/style.cjs.map +1 -0
- package/dist/style.js +1 -0
- package/dist/style.js.map +1 -0
- package/dist/types/adminUser.d.ts +112 -0
- package/dist/types/auth.d.ts +122 -0
- package/dist/types/config.d.ts +266 -0
- package/dist/types/deposit.d.ts +488 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/invite.d.ts +71 -0
- package/dist/types/member.d.ts +45 -0
- package/dist/types/org.d.ts +101 -0
- package/dist/types/session.d.ts +28 -0
- package/dist/types/systemSettings.d.ts +81 -0
- package/dist/types/totp.d.ts +52 -0
- package/dist/types/wallet.d.ts +309 -0
- package/dist/utils/adminUserApi.d.ts +51 -0
- package/dist/utils/apiClient.d.ts +78 -0
- package/dist/utils/cryptoShim.d.ts +17 -0
- package/dist/utils/csrf.d.ts +1 -0
- package/dist/utils/deviceDetection.d.ts +17 -0
- package/dist/utils/embeddedWallet.d.ts +75 -0
- package/dist/utils/inviteApi.d.ts +31 -0
- package/dist/utils/memberApi.d.ts +23 -0
- package/dist/utils/orgApi.d.ts +36 -0
- package/dist/utils/sanitization.d.ts +66 -0
- package/dist/utils/sessionApi.d.ts +16 -0
- package/dist/utils/silentWalletEnroll.d.ts +41 -0
- package/dist/utils/systemSettingsApi.d.ts +18 -0
- package/dist/utils/tabSync.d.ts +46 -0
- package/dist/utils/tokenManager.d.ts +107 -0
- package/dist/utils/unlockCredential.d.ts +5 -0
- package/dist/utils/validation.d.ts +48 -0
- package/dist/utils/walletDetection.d.ts +23 -0
- package/dist/utils/webauthnJson.d.ts +21 -0
- package/dist/validation-BeXIfuHB.cjs +1 -0
- package/dist/validation-BeXIfuHB.cjs.map +1 -0
- package/dist/validation-BebL7hMF.js +56 -0
- package/dist/validation-BebL7hMF.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/@scure/base/lib/esm/index.js","../node_modules/@scure/bip39/esm/index.js","../node_modules/@scure/bip39/esm/wordlists/english.js","../src/crypto/bip39.ts","../src/components/LoginButton.tsx","../src/hooks/usePasswordReset.ts","../src/components/email/ForgotPasswordForm.tsx","../src/hooks/useAppleAuth.ts","../src/utils/deviceDetection.ts","../src/components/apple/AppleLoginButton.tsx","../src/utils/webauthnJson.ts","../src/hooks/useWebAuthn.ts","../src/components/webauthn/PasskeyLoginButton.tsx","../src/components/LoginForm.tsx","../src/components/shared/ErrorBoundary.tsx","../src/components/LoginModal.tsx","../src/components/email/ResetPasswordForm.tsx","../src/components/org/OrgAvatar.tsx","../src/components/org/OrgSelector.tsx","../src/components/org/icons.tsx","../src/components/org/OrgListView.tsx","../src/components/org/CreateOrgForm.tsx","../src/components/org/OrgSwitcher.tsx","../src/components/members/MemberList.tsx","../src/components/invites/InviteForm.tsx","../src/components/invites/InviteList.tsx","../src/components/sessions/SessionList.tsx","../src/components/wallet/RecoveryPhraseDisplay.tsx","../src/components/wallet/RecoveryPhraseInput.tsx","../src/components/wallet/CapabilityWarning.tsx","../src/hooks/useWalletDiscovery.ts","../src/hooks/useWalletEnrollment.ts","../src/components/wallet/WalletEnrollment.tsx","../src/hooks/useWalletSigning.ts","../src/components/wallet/PasskeyPrompt.tsx","../src/components/wallet/WalletUnlock.tsx","../src/hooks/useWalletRecovery.ts","../src/components/wallet/WalletRecovery.tsx","../src/components/wallet/WalletAddressRow.tsx","../src/components/wallet/WalletStatus.tsx","../src/components/wallet/WalletManager.tsx","../src/utils/systemSettingsApi.ts","../src/hooks/useSystemSettings.ts","../src/components/admin/SystemSettings.tsx","../src/utils/orgApi.ts","../src/hooks/useOrgs.ts","../src/utils/memberApi.ts","../src/hooks/useMembers.ts","../src/utils/inviteApi.ts","../src/hooks/useInvites.ts","../src/hooks/useCredits.ts","../src/hooks/useAdminDeposits.ts","../src/components/deposit/admin/AdminDepositStats.tsx","../src/components/deposit/admin/AdminDepositList.tsx","../src/components/deposit/admin/AdminWithdrawalQueue.tsx","../src/components/deposit/admin/AdminPrivacyPeriodDeposits.tsx","../src/components/deposit/admin/AdminWithdrawalHistory.tsx","../src/components/deposit/admin/PrivacySystemStatus.tsx","../src/utils/adminUserApi.ts","../src/hooks/useAdminUsers.ts","../src/components/admin/AdminUserList.tsx","../src/components/admin/AdminUserDetail.tsx","../src/components/admin/CedrosAdminDashboard.tsx","../node_modules/qrcode/lib/can-promise.js","../node_modules/qrcode/lib/core/utils.js","../node_modules/qrcode/lib/core/error-correction-level.js","../node_modules/qrcode/lib/core/bit-buffer.js","../node_modules/qrcode/lib/core/bit-matrix.js","../node_modules/qrcode/lib/core/alignment-pattern.js","../node_modules/qrcode/lib/core/finder-pattern.js","../node_modules/qrcode/lib/core/mask-pattern.js","../node_modules/qrcode/lib/core/error-correction-code.js","../node_modules/qrcode/lib/core/galois-field.js","../node_modules/qrcode/lib/core/polynomial.js","../node_modules/qrcode/lib/core/reed-solomon-encoder.js","../node_modules/qrcode/lib/core/version-check.js","../node_modules/qrcode/lib/core/regex.js","../node_modules/qrcode/lib/core/mode.js","../node_modules/qrcode/lib/core/version.js","../node_modules/qrcode/lib/core/format-info.js","../node_modules/qrcode/lib/core/numeric-data.js","../node_modules/qrcode/lib/core/alphanumeric-data.js","../node_modules/qrcode/lib/core/byte-data.js","../node_modules/qrcode/lib/core/kanji-data.js","../node_modules/dijkstrajs/dijkstra.js","../node_modules/qrcode/lib/core/segments.js","../node_modules/qrcode/lib/core/qrcode.js","../node_modules/qrcode/lib/renderer/utils.js","../node_modules/qrcode/lib/renderer/canvas.js","../node_modules/qrcode/lib/renderer/svg-tag.js","../node_modules/qrcode/lib/browser.js","../src/components/totp/QrCode.tsx","../src/hooks/useTotp.ts","../src/components/totp/TotpSetup.tsx","../src/components/totp/TotpSettings.tsx","../src/hooks/useDeposit.ts","../src/components/deposit/TokenSelector.tsx","../src/components/deposit/tierUtils.ts","../src/assets/tokens/sol.webp","../src/components/deposit/TieredAmountSlider.tsx","../src/components/deposit/DepositFlow.tsx","../src/assets/tokens/bonk.webp","../src/assets/tokens/cash.webp","../src/assets/tokens/eurc.webp","../src/assets/tokens/ore.webp","../src/assets/tokens/pyusd.webp","../src/assets/tokens/usdc.webp","../src/assets/tokens/usdh.svg","../src/assets/tokens/usd1.webp","../src/assets/tokens/usdt.svg","../src/components/deposit/tokens.ts","../src/components/deposit/CreditBalance.tsx","../src/components/deposit/History.tsx","../src/components/templates/FullPageLayout.tsx","../src/components/templates/SplitPageLayout.tsx","../src/utils/sessionApi.ts","../src/hooks/useSessions.ts","../src/hooks/useAuthorize.ts","../src/hooks/usePendingRecovery.ts","../src/hooks/useTransactionSigning.ts","../src/i18n/context.ts","../src/i18n/translations.ts","../src/i18n/I18nProvider.tsx","../src/i18n/useI18n.ts"],"sourcesContent":["/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\nfunction isArrayOf(isString, arr) {\n if (!Array.isArray(arr))\n return false;\n if (arr.length === 0)\n return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n }\n else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n// no abytes: seems to have 10% slowdown. Why?!\nfunction afn(input) {\n if (typeof input !== 'function')\n throw new Error('function expected');\n return true;\n}\nfunction astr(label, input) {\n if (typeof input !== 'string')\n throw new Error(`${label}: string expected`);\n return true;\n}\nfunction anumber(n) {\n if (!Number.isSafeInteger(n))\n throw new Error(`invalid integer: ${n}`);\n}\nfunction aArr(input) {\n if (!Array.isArray(input))\n throw new Error('array expected');\n}\nfunction astrArr(label, input) {\n if (!isArrayOf(true, input))\n throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label, input) {\n if (!isArrayOf(false, input))\n throw new Error(`${label}: array of numbers expected`);\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain(...args) {\n const id = (a) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a, b) => (c) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters) {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(`alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`);\n return lettersA[i];\n });\n },\n decode: (input) => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = '') {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits, chr = '=') {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data) {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8)\n data.push(chr);\n return data;\n },\n decode(input) {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0)\n throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn) {\n afn(fn);\n return { encode: (from) => from, decode: (to) => fn(to) };\n}\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data, from, to) {\n // base 1 is impossible\n if (from < 2)\n throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2)\n throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length)\n return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from)\n throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i];\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (!Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done)\n continue;\n else if (!rounded)\n pos = i;\n else\n done = false;\n }\n res.push(carry);\n if (done)\n break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++)\n res.push(0);\n return res.reverse();\n}\nconst gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to));\nconst powers = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++)\n res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data, from, to, padding) {\n aArr(data);\n if (from <= 0 || from > 32)\n throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32)\n throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from];\n const mask = powers[to] - 1;\n const res = [];\n for (const n of data) {\n anumber(n);\n if (n >= max)\n throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32)\n throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to)\n res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined)\n throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from)\n throw new Error('Excess padding');\n if (!padding && carry > 0)\n throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0)\n res.push(carry >>> 0);\n return res;\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num) {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits, revPadding = false) {\n anumber(bits);\n if (bits <= 0 || bits > 32)\n throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\nfunction unsafeWrapper(fn) {\n afn(fn);\n return function (...args) {\n try {\n return fn.apply(null, args);\n }\n catch (e) { }\n };\n}\nfunction checksum(len, fn) {\n anumber(len);\n afn(fn);\n return {\n encode(data) {\n if (!isBytes(data))\n throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data) {\n if (!isBytes(data))\n throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i])\n throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n// prettier-ignore\nexport const utils = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n// RFC 4648 aka RFC 3548\n// ---------------------\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), join(''));\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), join(''));\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toBase64 === 'function' &&\n typeof Uint8Array.fromBase64 === 'function')();\nconst decodeBase64Builtin = (s, isUrl) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s))\n throw new Error('invalid base64');\n return Uint8Array.fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64 = hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), join(''));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url = hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), join(''));\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc) => chain(radix(58), alphabet(abc), join(''));\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr = {\n encode(data) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');\n }\n return res;\n },\n decode(str) {\n let res = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0)\n throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), base58);\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check = createBase58check;\nconst BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre) {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1)\n chk ^= POLYMOD_GENERATORS[i];\n }\n return chk;\n}\nfunction bechChecksum(prefix, words, encodingConst = 1) {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126)\n throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++)\n chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words)\n chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++)\n chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]], 30, 5, false));\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding) {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n function encode(prefix, words, limit = 90) {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words))\n words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0)\n throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;\n }\n function decode(str, limit = 90) {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6)\n throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum))\n throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n const decodeUnsafe = unsafeWrapper(decode);\n function decodeToBytes(str) {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n function encodeFromBytes(prefix, bytes) {\n return encode(prefix, toWords(bytes));\n }\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32 = genBech32('bech32');\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m = genBech32('bech32m');\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8 = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toHex === 'function' &&\n typeof Uint8Array.fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin = {\n encode(data) { abytes(data); return data.toHex(); },\n decode(s) { astr('hex', s); return Uint8Array.fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex = hasHexBuiltin\n ? hexBuiltin\n : chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);\n return s.toLowerCase();\n }));\n// prettier-ignore\nconst CODERS = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\nconst coderTypeError = 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n/** @deprecated */\nexport const bytesToString = (type, bytes) => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (!isBytes(bytes))\n throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n/** @deprecated */\nexport const str = bytesToString; // as in python, but for bytes only\n/** @deprecated */\nexport const stringToBytes = (type, str) => {\n if (!CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (typeof str !== 'string')\n throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes = stringToBytes;\n//# sourceMappingURL=index.js.map","/**\n * Audited & minimal JS implementation of\n * [BIP39 mnemonic phrases](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).\n * @module\n * @example\n```js\nimport * as bip39 from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nconst mn = bip39.generateMnemonic(wordlist);\nconsole.log(mn);\nconst ent = bip39.mnemonicToEntropy(mn, wordlist)\nbip39.entropyToMnemonic(ent, wordlist);\nbip39.validateMnemonic(mn, wordlist);\nawait bip39.mnemonicToSeed(mn, 'password');\nbip39.mnemonicToSeedSync(mn, 'password');\n\n// Wordlists\nimport { wordlist as czech } from '@scure/bip39/wordlists/czech';\nimport { wordlist as english } from '@scure/bip39/wordlists/english';\nimport { wordlist as french } from '@scure/bip39/wordlists/french';\nimport { wordlist as italian } from '@scure/bip39/wordlists/italian';\nimport { wordlist as japanese } from '@scure/bip39/wordlists/japanese';\nimport { wordlist as korean } from '@scure/bip39/wordlists/korean';\nimport { wordlist as portuguese } from '@scure/bip39/wordlists/portuguese';\nimport { wordlist as simplifiedChinese } from '@scure/bip39/wordlists/simplified-chinese';\nimport { wordlist as spanish } from '@scure/bip39/wordlists/spanish';\nimport { wordlist as traditionalChinese } from '@scure/bip39/wordlists/traditional-chinese';\n```\n */\n/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2';\nimport { sha256, sha512 } from '@noble/hashes/sha2';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent, 16, 20, 24, 28, 32);\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","export const wordlist = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo`.split('\\n');\n","/**\n * BIP-39 mnemonic encoding/decoding using @scure/bip39\n *\n * Used to encode Share C as a human-readable recovery phrase.\n *\n * Security:\n * - Uses the official BIP-39 English wordlist\n * - 12 words = 128 bits of entropy (16 bytes)\n * - Matches standard Solana wallet format (Phantom, Solflare, etc.)\n * - Includes checksum for error detection\n */\n\nimport {\n generateMnemonic,\n mnemonicToEntropy,\n entropyToMnemonic,\n validateMnemonic,\n} from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport type { Seed, ShamirShare } from './types';\nimport { toSeed, toShamirShare } from './types';\n\n/** Number of words in recovery phrase (12 = 128 bits, standard Solana format) */\nexport const MNEMONIC_WORD_COUNT = 12;\n\n/**\n * Encode a Shamir share as a BIP-39 mnemonic phrase\n *\n * @param share - 16-byte share to encode\n * @returns Array of 12 mnemonic words\n */\nexport function shareToMnemonic(share: ShamirShare): string[] {\n if (share.length !== 16) {\n throw new Error(`Invalid share length: expected 16, got ${share.length}`);\n }\n\n // entropyToMnemonic expects Uint8Array\n const mnemonic = entropyToMnemonic(share, wordlist);\n const words = mnemonic.split(' ');\n\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Unexpected word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n return words;\n}\n\n/**\n * Decode a BIP-39 mnemonic phrase back to a Shamir share\n *\n * @param words - Array of 12 mnemonic words\n * @returns 16-byte share\n * @throws Error if mnemonic is invalid\n */\nexport function mnemonicToShare(words: string[]): ShamirShare {\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Invalid word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n const mnemonic = words.join(' ').toLowerCase().trim();\n\n // Validate mnemonic checksum\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new Error('Invalid recovery phrase: checksum mismatch');\n }\n\n // Convert back to entropy (our share)\n const entropy = mnemonicToEntropy(mnemonic, wordlist);\n\n if (entropy.length !== 16) {\n throw new Error(`Invalid entropy length: expected 16, got ${entropy.length}`);\n }\n\n return toShamirShare(entropy);\n}\n\n/**\n * Encode a 16-byte seed as a BIP-39 mnemonic phrase\n *\n * This is used for the recovery phrase which encodes the FULL SEED\n * (not a Shamir share) to allow complete wallet recovery.\n *\n * @param seed - 16-byte seed to encode\n * @returns Array of 12 mnemonic words\n */\nexport function seedToMnemonic(seed: Seed): string[] {\n if (seed.length !== 16) {\n throw new Error(`Invalid seed length: expected 16, got ${seed.length}`);\n }\n\n const mnemonic = entropyToMnemonic(seed, wordlist);\n const words = mnemonic.split(' ');\n\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Unexpected word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n return words;\n}\n\n/**\n * Decode a BIP-39 mnemonic phrase back to a seed\n *\n * This is used during recovery to restore the full wallet seed.\n *\n * @param words - Array of 12 mnemonic words\n * @returns 16-byte seed\n * @throws Error if mnemonic is invalid\n */\nexport function mnemonicToSeed(words: string[]): Seed {\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Invalid word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n const mnemonic = words.join(' ').toLowerCase().trim();\n\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new Error('Invalid recovery phrase: checksum mismatch');\n }\n\n const entropy = mnemonicToEntropy(mnemonic, wordlist);\n\n if (entropy.length !== 16) {\n throw new Error(`Invalid entropy length: expected 16, got ${entropy.length}`);\n }\n\n return toSeed(entropy);\n}\n\n/**\n * Validate a mnemonic phrase without decoding\n *\n * @param words - Array of words to validate\n * @returns true if valid BIP-39 mnemonic\n */\nexport function isValidMnemonic(words: string[]): boolean {\n if (words.length !== MNEMONIC_WORD_COUNT) {\n return false;\n }\n\n const mnemonic = words.join(' ').toLowerCase().trim();\n return validateMnemonic(mnemonic, wordlist);\n}\n\n/**\n * Check if a single word is in the BIP-39 wordlist\n *\n * @param word - Word to check\n * @returns true if word is in the wordlist\n */\nexport function isValidWord(word: string): boolean {\n return wordlist.includes(word.toLowerCase().trim());\n}\n\n/**\n * Get word suggestions for autocomplete\n *\n * @param prefix - Partial word input\n * @param limit - Maximum number of suggestions\n * @returns Array of matching words from wordlist\n */\nexport function getWordSuggestions(prefix: string, limit: number = 5): string[] {\n const normalizedPrefix = prefix.toLowerCase().trim();\n\n if (normalizedPrefix.length === 0) {\n return [];\n }\n\n return wordlist.filter((word) => word.startsWith(normalizedPrefix)).slice(0, limit);\n}\n\n/**\n * Generate a random mnemonic for testing purposes\n *\n * WARNING: Do not use this for actual wallet generation.\n * Use the proper enrollment flow which generates a seed and splits it.\n *\n * @returns Array of 12 random words\n */\nexport function generateRandomMnemonic(): string[] {\n const mnemonic = generateMnemonic(wordlist, 128);\n return mnemonic.split(' ');\n}\n\n/**\n * Format mnemonic words for display (groups of 4)\n *\n * @param words - Array of mnemonic words\n * @returns Array of word groups\n */\nexport function formatMnemonicForDisplay(words: string[]): string[][] {\n const groups: string[][] = [];\n for (let i = 0; i < words.length; i += 4) {\n groups.push(words.slice(i, i + 4));\n }\n return groups;\n}\n\n/**\n * Parse user input into word array, handling various formats\n *\n * @param input - User input (space/comma/newline separated)\n * @returns Array of normalized words\n */\nexport function parseMnemonicInput(input: string): string[] {\n return input\n .toLowerCase()\n .replace(/[,\\n\\r\\t]+/g, ' ') // Replace separators with space\n .split(/\\s+/) // Split on whitespace\n .map((w) => w.trim())\n .filter((w) => w.length > 0);\n}\n\n/**\n * Securely wipe mnemonic array\n *\n * @security CRYPTO-2: This is BEST-EFFORT only. JavaScript strings are immutable\n * and the original word values WILL persist in memory until garbage collected.\n * See secureWipe.ts wipeString() for details on JS string wiping limitations.\n *\n * @param words - Array of words to wipe\n */\nexport function wipeMnemonic(words: string[]): void {\n // Replace all words with empty strings (best-effort - see CRYPTO-2)\n for (let i = 0; i < words.length; i++) {\n words[i] = '';\n }\n words.length = 0;\n}\n\n/**\n * Get the BIP-39 wordlist for UI purposes (e.g., validation indicators)\n *\n * @returns Copy of the wordlist\n */\nexport function getWordlist(): readonly string[] {\n return wordlist;\n}\n\n/**\n * Calculate the index of a word in the wordlist\n *\n * @param word - Word to look up\n * @returns Index (0-2047) or -1 if not found\n */\nexport function getWordIndex(word: string): number {\n return wordlist.indexOf(word.toLowerCase().trim());\n}\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useAuth } from '../hooks/useAuth';\nimport { LoadingSpinner } from './shared/LoadingSpinner';\nimport { sanitizeImageUrl } from '../utils/sanitization';\n\nexport interface MenuItemConfig {\n /** Label to display */\n label: string;\n /** Click handler */\n onClick: () => void;\n /** Optional icon element */\n icon?: React.ReactNode;\n}\n\nexport interface LoginButtonProps {\n className?: string;\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n children?: React.ReactNode;\n /** Custom menu items to show above \"Sign out\" */\n menuItems?: MenuItemConfig[];\n /** Hide the default \"Sign out\" item (default: false) */\n hideSignOut?: boolean;\n}\n\n/**\n * Login button that opens the login modal when clicked.\n * Shows user info when authenticated.\n */\nexport function LoginButton({\n className = '',\n variant = 'default',\n size = 'md',\n children,\n menuItems = [],\n hideSignOut = false,\n}: LoginButtonProps) {\n const { user, isAuthenticated, isLoading, openLoginModal, logout } = useAuth();\n // L-08: State for keyboard-accessible dropdown\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const menuRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Build list of all menu items (custom items + sign out)\n // Memoize to avoid recreating array on every render (fixes react-hooks/exhaustive-deps warning)\n const allMenuItems = useMemo(\n () => [...menuItems, ...(hideSignOut ? [] : [{ label: 'Sign out', onClick: logout }])],\n [menuItems, hideSignOut, logout]\n );\n\n // L-08: Close menu on outside click or Escape\n useEffect(() => {\n if (!isMenuOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n setFocusedIndex(-1);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsMenuOpen(false);\n setFocusedIndex(-1);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isMenuOpen]);\n\n // L-08: Keyboard navigation for menu\n const handleMenuKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isMenuOpen || allMenuItems.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setFocusedIndex((i) => (i + 1) % allMenuItems.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((i) => (i - 1 + allMenuItems.length) % allMenuItems.length);\n break;\n case 'Home':\n e.preventDefault();\n setFocusedIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setFocusedIndex(allMenuItems.length - 1);\n break;\n case 'Enter':\n case ' ':\n if (focusedIndex >= 0) {\n e.preventDefault();\n allMenuItems[focusedIndex].onClick();\n setIsMenuOpen(false);\n setFocusedIndex(-1);\n }\n break;\n }\n },\n [isMenuOpen, focusedIndex, allMenuItems]\n );\n\n const toggleMenu = useCallback(() => {\n if (allMenuItems.length === 0) return;\n setIsMenuOpen((open) => !open);\n setFocusedIndex(-1);\n }, [allMenuItems.length]);\n\n const sizeClasses = {\n sm: 'cedros-button-sm',\n md: 'cedros-button-md',\n lg: 'cedros-button-lg',\n };\n\n const variantClasses = {\n default: 'cedros-button-primary',\n outline: 'cedros-button-outline',\n ghost: 'cedros-button-ghost',\n };\n\n if (isLoading) {\n return (\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n disabled\n >\n <LoadingSpinner size=\"sm\" />\n </button>\n );\n }\n\n if (isAuthenticated && user) {\n const displayName = user.name || user.email || 'User';\n // COMP-07: Cache sanitized URL to avoid double-call and ensure consistent validation\n const sanitizedPicture = sanitizeImageUrl(user.picture);\n return (\n // L-08: Added keyboard handler and ref for accessibility\n <div className=\"cedros-user-menu\" ref={menuRef} onKeyDown={handleMenuKeyDown}>\n {/* M-13: Added ARIA attributes for accessibility */}\n <button\n ref={buttonRef}\n type=\"button\"\n className={`cedros-button cedros-user-button ${sizeClasses[size]} ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isMenuOpen}\n aria-label={`User menu for ${displayName}`}\n onClick={toggleMenu}\n >\n {sanitizedPicture ? (\n <img\n src={sanitizedPicture}\n alt={displayName}\n className=\"cedros-user-avatar\"\n referrerPolicy=\"no-referrer\"\n crossOrigin=\"anonymous\"\n />\n ) : (\n <div className=\"cedros-user-avatar-placeholder\">\n {(displayName[0] || '?').toUpperCase()}\n </div>\n )}\n <span className=\"cedros-user-name\">{displayName}</span>\n </button>\n {/* M-13: Added role=\"menu\" for ARIA menu pattern */}\n {/* L-08: Show/hide controlled by state, keyboard navigable */}\n {isMenuOpen && (\n <div className=\"cedros-dropdown cedros-dropdown-open\" role=\"menu\">\n {menuItems.map((item, index) => (\n <button\n key={index}\n type=\"button\"\n className={`cedros-dropdown-item ${focusedIndex === index ? 'cedros-dropdown-item-focused' : ''}`}\n role=\"menuitem\"\n tabIndex={focusedIndex === index ? 0 : -1}\n onClick={() => {\n item.onClick();\n setIsMenuOpen(false);\n }}\n >\n {item.icon && <span className=\"cedros-dropdown-icon\">{item.icon}</span>}\n {item.label}\n </button>\n ))}\n {menuItems.length > 0 && !hideSignOut && (\n <div className=\"cedros-dropdown-divider\" role=\"separator\" />\n )}\n {!hideSignOut && (\n <button\n type=\"button\"\n className={`cedros-dropdown-item cedros-dropdown-item-danger ${focusedIndex === menuItems.length ? 'cedros-dropdown-item-focused' : ''}`}\n role=\"menuitem\"\n tabIndex={focusedIndex === menuItems.length ? 0 : -1}\n onClick={() => {\n logout();\n setIsMenuOpen(false);\n }}\n >\n Sign out\n </button>\n )}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n onClick={openLoginModal}\n >\n {children || 'Sign in'}\n </button>\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { validateEmail } from '../utils/validation';\nimport { useRateLimiter } from './useRateLimiter';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type { AuthError } from '../types';\n\nexport interface UsePasswordResetReturn {\n forgotPassword: (email: string) => Promise<void>;\n resetPassword: (token: string, newPassword: string) => Promise<void>;\n isLoading: boolean;\n isSuccess: boolean;\n error: AuthError | null;\n clearError: () => void;\n reset: () => void;\n /** Number of remaining attempts before rate limiting */\n remainingAttempts: number;\n}\n\n/**\n * Hook for password reset functionality.\n *\n * @example\n * ```tsx\n * function ForgotPasswordForm() {\n * const { forgotPassword, isLoading, isSuccess, error } = usePasswordReset();\n *\n * const handleSubmit = async (e) => {\n * e.preventDefault();\n * await forgotPassword(email);\n * };\n *\n * if (isSuccess) {\n * return <p>Check your email for reset instructions</p>;\n * }\n * }\n * ```\n */\nexport function usePasswordReset(): UsePasswordResetReturn {\n const { config } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n // M-08: Use ApiClient for consistent error handling and timeout/retry\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n // Rate limiter for password reset attempts (3 attempts per 5 minutes)\n const { checkLimit, getRemainingAttempts } = useRateLimiter({\n maxAttempts: 3,\n windowMs: 300000,\n });\n\n const forgotPassword = useCallback(\n async (email: string): Promise<void> => {\n // Validate email format before API call\n if (!validateEmail(email)) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter a valid email address',\n };\n setError(validationError);\n throw validationError;\n }\n\n // Check rate limit before API call\n try {\n checkLimit();\n } catch (err) {\n const rateLimitError: AuthError = {\n code: 'RATE_LIMITED',\n message: err instanceof Error ? err.message : 'Too many attempts',\n };\n setError(rateLimitError);\n throw rateLimitError;\n }\n\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n // M-08: Use ApiClient for consistent error handling\n await apiClient.post('/forgot-password', { email });\n setIsSuccess(true);\n } catch (err) {\n const authError = handleApiError(err, 'Failed to send reset email');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, checkLimit]\n );\n\n const resetPassword = useCallback(\n async (token: string, newPassword: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n // M-08: Use ApiClient for consistent error handling\n await apiClient.post('/reset-password', { token, newPassword });\n setIsSuccess(true);\n } catch (err) {\n const authError = handleApiError(err, 'Failed to reset password');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n const reset = useCallback(() => {\n setError(null);\n setIsSuccess(false);\n setIsLoading(false);\n }, []);\n\n return {\n forgotPassword,\n resetPassword,\n isLoading,\n isSuccess,\n error,\n clearError,\n reset,\n remainingAttempts: getRemainingAttempts(),\n };\n}\n","import { useState, useId, type FormEvent } from 'react';\nimport { usePasswordReset } from '../../hooks/usePasswordReset';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\n\nexport interface ForgotPasswordFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n className?: string;\n}\n\n/**\n * Form for requesting a password reset email.\n *\n * @example\n * ```tsx\n * <ForgotPasswordForm\n * onSuccess={() => console.log('Email sent!')}\n * onCancel={() => setShowForgotPassword(false)}\n * />\n * ```\n */\nexport function ForgotPasswordForm({\n onSuccess,\n onCancel,\n className = '',\n}: ForgotPasswordFormProps) {\n const [email, setEmail] = useState('');\n const { forgotPassword, isLoading, isSuccess, error, clearError } = usePasswordReset();\n const emailId = useId();\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n try {\n await forgotPassword(email);\n onSuccess?.();\n } catch {\n // Error is already set in the hook\n }\n };\n\n if (isSuccess) {\n return (\n <div className={`cedros-forgot-password-success ${className}`}>\n <svg\n className=\"cedros-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"22\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M14 24l7 7 13-13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3 className=\"cedros-success-title\">Check your email</h3>\n <p className=\"cedros-success-message\">\n If an account exists for <strong>{email}</strong>, you will receive a password reset link\n shortly.\n </p>\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-outline\"\n onClick={onCancel}\n >\n Back to login\n </button>\n )}\n </div>\n );\n }\n\n return (\n <form className={`cedros-forgot-password-form ${className}`} onSubmit={handleSubmit}>\n <div className=\"cedros-form-header\">\n <h3 className=\"cedros-form-title\">Forgot password?</h3>\n <p className=\"cedros-form-subtitle\">\n Enter your email address and we'll send you a link to reset your password.\n </p>\n </div>\n\n <ErrorMessage error={error} onDismiss={clearError} />\n\n <div className=\"cedros-form-field\">\n <label htmlFor={emailId} className=\"cedros-label\">\n Email address\n </label>\n <input\n id={emailId}\n type=\"email\"\n className=\"cedros-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n disabled={isLoading}\n />\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-md cedros-button-primary cedros-button-full\"\n disabled={isLoading || !email}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n Sending...\n </>\n ) : (\n 'Send reset link'\n )}\n </button>\n\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-ghost cedros-button-full\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Back to login\n </button>\n )}\n </div>\n </form>\n );\n}\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type { AuthResponse, AuthError } from '../types';\n\n// Module-level singleton for Apple Sign In script loading\n// Prevents race conditions when multiple components mount simultaneously\nconst scriptLoader = {\n loading: false,\n loaded: false,\n error: null as Error | null,\n callbacks: [] as Array<{ resolve: () => void; reject: (err: Error) => void }>,\n\n load(): Promise<void> {\n if (this.loaded) {\n return Promise.resolve();\n }\n\n if (this.loading) {\n return new Promise((resolve, reject) => {\n this.callbacks.push({ resolve, reject });\n });\n }\n\n this.loading = true;\n return new Promise((resolve, reject) => {\n this.callbacks.push({ resolve, reject });\n\n const existingScript = document.getElementById('apple-signin-script');\n if (existingScript) {\n if (window.AppleID) {\n this.loaded = true;\n this.loading = false;\n this.callbacks.forEach((cb) => cb.resolve());\n this.callbacks = [];\n } else {\n existingScript.addEventListener('load', () => {\n this.loaded = true;\n this.loading = false;\n this.callbacks.forEach((cb) => cb.resolve());\n this.callbacks = [];\n });\n }\n return;\n }\n\n const script = document.createElement('script');\n script.src =\n 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js';\n script.async = true;\n script.defer = true;\n script.id = 'apple-signin-script';\n\n script.onload = () => {\n this.loaded = true;\n this.loading = false;\n this.callbacks.forEach((cb) => cb.resolve());\n this.callbacks = [];\n };\n\n script.onerror = () => {\n this.loading = false;\n // M-03: Remove failed script from DOM to allow retry on next load() call.\n // Without removal, retry finds existingScript and waits for a load event\n // that will never fire on an already-failed script.\n script.remove();\n const error = new Error('Failed to load Apple Sign In script');\n this.callbacks.forEach((cb) => cb.reject(error));\n this.callbacks = [];\n };\n\n document.head.appendChild(script);\n });\n },\n};\n\nexport interface UseAppleAuthReturn {\n signIn: () => Promise<AuthResponse>;\n isLoading: boolean;\n isInitialized: boolean;\n error: AuthError | null;\n clearError: () => void;\n}\n\n/**\n * Hook for Apple Sign In authentication.\n *\n * @example\n * ```tsx\n * function AppleButton() {\n * const { signIn, isLoading, isInitialized, error } = useAppleAuth();\n *\n * return (\n * <button onClick={signIn} disabled={!isInitialized || isLoading}>\n * {isLoading ? 'Signing in...' : 'Sign in with Apple'}\n * </button>\n * );\n * }\n * ```\n */\nexport function useAppleAuth(): UseAppleAuthReturn {\n const { config, _internal } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const configRef = useRef(config);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Initialize Apple Sign In SDK\n useEffect(() => {\n if (!config.appleClientId) {\n return;\n }\n\n let isMounted = true;\n\n const initializeAppleSignIn = () => {\n if (!isMounted) return;\n\n try {\n window.AppleID?.auth?.init({\n clientId: config.appleClientId!,\n scope: 'name email',\n redirectURI: window.location.origin,\n usePopup: true,\n });\n\n if (isMounted) {\n setIsInitialized(true);\n }\n } catch {\n if (isMounted) {\n setError({\n code: 'SERVER_ERROR',\n message: 'Failed to initialize Apple Sign In',\n });\n }\n }\n };\n\n scriptLoader\n .load()\n .then(() => {\n if (isMounted) {\n initializeAppleSignIn();\n }\n })\n .catch(() => {\n if (isMounted) {\n setError({\n code: 'SERVER_ERROR',\n message: 'Failed to load Apple Sign In',\n });\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [config.appleClientId]);\n\n const signIn = useCallback(async (): Promise<AuthResponse> => {\n if (!config.appleClientId) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Apple Client ID not configured',\n };\n setError(err);\n throw err;\n }\n\n if (!isInitialized) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Apple Sign In not initialized',\n };\n setError(err);\n throw err;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Trigger Apple Sign In popup\n const response = await window.AppleID!.auth!.signIn();\n\n // Apple returns authorization with id_token\n const idToken = response.authorization?.id_token;\n if (!idToken) {\n throw new Error('No ID token received from Apple');\n }\n\n // Apple only provides user info on first sign-in\n // The name comes from response.user (if available)\n const userName = response.user?.name\n ? `${response.user.name.firstName || ''} ${response.user.name.lastName || ''}`.trim()\n : undefined;\n\n // Send to our backend\n const data = await apiClient.post<AuthResponse>('/apple', {\n idToken,\n name: userName || undefined,\n });\n\n configRef.current.callbacks?.onLoginSuccess?.(data.user, 'apple');\n _internal?.handleLoginSuccess(data.user, data.tokens);\n setIsLoading(false);\n return data;\n } catch (err) {\n // Check if user cancelled\n const appleError = err as { error?: string };\n if (appleError.error === 'popup_closed_by_user') {\n const authError: AuthError = {\n code: 'SERVER_ERROR',\n message: 'Apple Sign In was cancelled',\n };\n setError(authError);\n setIsLoading(false);\n throw authError;\n }\n\n const authError = handleApiError(err, 'Apple sign-in failed');\n setError(authError);\n setIsLoading(false);\n throw authError;\n }\n }, [config.appleClientId, isInitialized, apiClient, _internal]);\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n signIn,\n isLoading,\n isInitialized,\n error,\n clearError,\n };\n}\n\n// Type declaration for Apple Sign In JS SDK\ndeclare global {\n interface Window {\n AppleID?: {\n auth?: {\n init: (config: {\n clientId: string;\n scope: string;\n redirectURI: string;\n usePopup?: boolean;\n }) => void;\n signIn: () => Promise<{\n authorization?: {\n id_token?: string;\n code?: string;\n };\n user?: {\n email?: string;\n name?: {\n firstName?: string;\n lastName?: string;\n };\n };\n }>;\n };\n };\n }\n}\n","/**\n * Device detection utilities\n */\n\n/**\n * Detects if the current device is an Apple device (macOS, iOS, iPadOS).\n * Apple Sign In is most useful on Apple devices where users have Apple ID readily available.\n *\n * @returns true if running on an Apple device\n *\n * @example\n * ```tsx\n * if (isAppleDevice()) {\n * // Show Apple Sign In button\n * }\n * ```\n */\nexport function isAppleDevice(): boolean {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n const platform = (navigator.platform || '').toLowerCase();\n\n // Check for iOS devices (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(userAgent)) {\n return true;\n }\n\n // Check for macOS\n if (platform.includes('mac') || /macintosh/.test(userAgent)) {\n return true;\n }\n\n // Check for iPad on iOS 13+ (reports as MacIntel but has touch)\n if (platform === 'macintel' && navigator.maxTouchPoints > 1) {\n return true;\n }\n\n return false;\n}\n","import { useState } from 'react';\nimport { useAppleAuth } from '../../hooks/useAppleAuth';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { isAppleDevice } from '../../utils/deviceDetection';\n\nexport interface AppleLoginButtonProps {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n variant?: 'default' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n disabled?: boolean;\n /**\n * Hide the button on non-Apple devices (macOS, iOS, iPadOS).\n * When true (default), button only renders on Apple devices.\n * When false, button always renders regardless of device.\n * @default true\n */\n hideOnNonApple?: boolean;\n}\n\n/**\n * Apple Sign In button\n *\n * Requires `appleClientId` to be configured in CedrosLoginProvider.\n *\n * @example\n * ```tsx\n * <AppleLoginButton\n * onSuccess={() => console.log('Logged in!')}\n * onError={(err) => console.error(err)}\n * />\n * ```\n */\nexport function AppleLoginButton({\n onSuccess,\n onError,\n className = '',\n variant = 'default',\n size = 'md',\n disabled = false,\n hideOnNonApple = true,\n}: AppleLoginButtonProps) {\n const { signIn, isLoading, isInitialized } = useAppleAuth();\n\n // Detect Apple device on initial render (lazy initializer avoids re-detection)\n const [isApple] = useState(() => isAppleDevice());\n\n // Hide button on non-Apple devices if hideOnNonApple is true\n if (hideOnNonApple && !isApple) {\n return null;\n }\n\n const handleClick = async () => {\n try {\n await signIn();\n onSuccess?.();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n }\n };\n\n const sizeClasses = {\n sm: 'cedros-button-sm',\n md: 'cedros-button-md',\n lg: 'cedros-button-lg',\n };\n\n const variantClasses = {\n default: 'cedros-button-apple',\n outline: 'cedros-button-apple-outline',\n };\n\n return (\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n onClick={handleClick}\n disabled={disabled || !isInitialized || isLoading}\n aria-label=\"Sign in with Apple\"\n >\n {isLoading ? (\n <LoadingSpinner size=\"sm\" />\n ) : (\n <svg\n className=\"cedros-button-icon\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\" />\n </svg>\n )}\n <span>Continue with Apple</span>\n </button>\n );\n}\n","// Minimal WebAuthn JSON helpers (no external deps).\n//\n// WebAuthn request/response objects contain ArrayBuffers, which can't be sent\n// over JSON. Server endpoints in this repo expose options with base64url fields\n// and expect credentials back with base64url fields.\n\ntype Base64UrlString = string;\n\nfunction assert(condition: unknown, message: string): asserts condition {\n if (!condition) throw new Error(message);\n}\n\nfunction normalizeBase64Url(input: string): string {\n // Browser encoders may return base64url without padding.\n return input.replace(/-/g, '+').replace(/_/g, '/');\n}\n\nexport function base64UrlToArrayBuffer(b64url: Base64UrlString): ArrayBuffer {\n assert(typeof b64url === 'string' && b64url.length > 0, 'Expected base64url string');\n const base64 = normalizeBase64Url(b64url);\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): Base64UrlString {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n const base64 = btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction mapCredentialDescriptor(desc: unknown): PublicKeyCredentialDescriptor {\n assert(typeof desc === 'object' && desc !== null, 'Invalid credential descriptor');\n const d = desc as Record<string, unknown>;\n assert(typeof d.type === 'string', 'Invalid credential descriptor type');\n assert(typeof d.id === 'string', 'Invalid credential descriptor id');\n\n return {\n type: d.type as PublicKeyCredentialType,\n id: base64UrlToArrayBuffer(d.id as string),\n transports: Array.isArray(d.transports) ? (d.transports as AuthenticatorTransport[]) : undefined,\n };\n}\n\nexport type ServerCreationOptions = {\n publicKey: Record<string, unknown>;\n};\n\nexport function parseCreationOptionsFromServer(\n options: ServerCreationOptions\n): PublicKeyCredentialCreationOptions {\n assert(options && typeof options === 'object', 'Missing creation options');\n const publicKey = options.publicKey as Record<string, unknown>;\n assert(publicKey && typeof publicKey === 'object', 'Missing creation options.publicKey');\n\n assert(typeof publicKey.challenge === 'string', 'Missing creation challenge');\n assert(typeof publicKey.rp === 'object' && publicKey.rp !== null, 'Missing rp');\n assert(typeof publicKey.user === 'object' && publicKey.user !== null, 'Missing user');\n\n const rp = publicKey.rp as Record<string, unknown>;\n const user = publicKey.user as Record<string, unknown>;\n\n assert(typeof rp.name === 'string', 'Missing rp.name');\n assert(typeof user.id === 'string', 'Missing user.id');\n assert(typeof user.name === 'string', 'Missing user.name');\n assert(typeof user.displayName === 'string', 'Missing user.displayName');\n\n const exclude = Array.isArray(publicKey.excludeCredentials)\n ? (publicKey.excludeCredentials as unknown[]).map(mapCredentialDescriptor)\n : undefined;\n\n const pubKeyCredParams = Array.isArray(publicKey.pubKeyCredParams)\n ? (publicKey.pubKeyCredParams as Array<{ type: string; alg: number }>).map((p) => ({\n type: p.type as PublicKeyCredentialType,\n alg: p.alg,\n }))\n : [];\n\n return {\n challenge: base64UrlToArrayBuffer(publicKey.challenge as string),\n rp: {\n name: rp.name as string,\n id: typeof rp.id === 'string' ? (rp.id as string) : undefined,\n },\n user: {\n id: base64UrlToArrayBuffer(user.id as string),\n name: user.name as string,\n displayName: user.displayName as string,\n },\n pubKeyCredParams,\n timeout: typeof publicKey.timeout === 'number' ? (publicKey.timeout as number) : undefined,\n attestation: typeof publicKey.attestation === 'string' ? (publicKey.attestation as AttestationConveyancePreference) : undefined,\n authenticatorSelection:\n typeof publicKey.authenticatorSelection === 'object' && publicKey.authenticatorSelection !== null\n ? (publicKey.authenticatorSelection as AuthenticatorSelectionCriteria)\n : undefined,\n excludeCredentials: exclude,\n extensions:\n typeof publicKey.extensions === 'object' && publicKey.extensions !== null\n ? (publicKey.extensions as AuthenticationExtensionsClientInputs)\n : undefined,\n };\n}\n\nexport type ServerRequestOptions = {\n publicKey: Record<string, unknown>;\n};\n\nexport function parseRequestOptionsFromServer(\n options: ServerRequestOptions\n): PublicKeyCredentialRequestOptions {\n assert(options && typeof options === 'object', 'Missing request options');\n const publicKey = options.publicKey as Record<string, unknown>;\n assert(publicKey && typeof publicKey === 'object', 'Missing request options.publicKey');\n\n assert(typeof publicKey.challenge === 'string', 'Missing request challenge');\n\n const allow = Array.isArray(publicKey.allowCredentials)\n ? (publicKey.allowCredentials as unknown[]).map(mapCredentialDescriptor)\n : undefined;\n\n return {\n challenge: base64UrlToArrayBuffer(publicKey.challenge as string),\n rpId: typeof publicKey.rpId === 'string' ? (publicKey.rpId as string) : undefined,\n timeout: typeof publicKey.timeout === 'number' ? (publicKey.timeout as number) : undefined,\n userVerification:\n typeof publicKey.userVerification === 'string'\n ? (publicKey.userVerification as UserVerificationRequirement)\n : undefined,\n allowCredentials: allow,\n extensions:\n typeof publicKey.extensions === 'object' && publicKey.extensions !== null\n ? (publicKey.extensions as AuthenticationExtensionsClientInputs)\n : undefined,\n };\n}\n\nexport type PublicKeyCredentialJSON = {\n id: string;\n rawId: string;\n type: string;\n authenticatorAttachment?: string;\n clientExtensionResults?: AuthenticationExtensionsClientOutputs;\n response: Record<string, unknown>;\n};\n\nexport function credentialToServerJson(cred: PublicKeyCredential): PublicKeyCredentialJSON {\n const rawId = arrayBufferToBase64Url(cred.rawId);\n const response = cred.response as AuthenticatorResponse;\n\n const common = {\n clientDataJSON: arrayBufferToBase64Url(response.clientDataJSON),\n };\n\n const responseJson: Record<string, unknown> = { ...common };\n\n // Registration\n if ('attestationObject' in response) {\n const att = response as AuthenticatorAttestationResponse;\n responseJson.attestationObject = arrayBufferToBase64Url(att.attestationObject);\n if (typeof att.getTransports === 'function') {\n try {\n responseJson.transports = att.getTransports();\n } catch {\n // ignore\n }\n }\n }\n\n // Authentication\n if ('authenticatorData' in response) {\n const asr = response as AuthenticatorAssertionResponse;\n responseJson.authenticatorData = arrayBufferToBase64Url(asr.authenticatorData);\n responseJson.signature = arrayBufferToBase64Url(asr.signature);\n if (asr.userHandle) {\n responseJson.userHandle = arrayBufferToBase64Url(asr.userHandle);\n }\n }\n\n return {\n id: cred.id,\n rawId,\n type: cred.type,\n authenticatorAttachment: cred.authenticatorAttachment ?? undefined,\n clientExtensionResults: cred.getClientExtensionResults?.() ?? {},\n response: responseJson,\n };\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type { AuthError, AuthResponse } from '../types';\nimport {\n credentialToServerJson,\n parseCreationOptionsFromServer,\n parseRequestOptionsFromServer,\n} from '../utils/webauthnJson';\n\ntype WebAuthnOptionsResponse = {\n challengeId: string;\n options: {\n publicKey: Record<string, unknown>;\n };\n};\n\nexport interface UseWebAuthnReturn {\n isSupported: boolean;\n isLoading: boolean;\n error: AuthError | null;\n clearError: () => void;\n\n /** Start a server-managed WebAuthn authentication ceremony (login). */\n authenticatePasskey: (params?: { email?: string }) => Promise<AuthResponse>;\n /** Register a new passkey for the currently authenticated user. */\n registerPasskey: (params?: { label?: string }) => Promise<{ credentialId: string; label?: string }>;\n}\n\nfunction isWebAuthnAvailable(): boolean {\n if (typeof window !== 'undefined') {\n const hostname = window.location?.hostname;\n const isLocalhost = hostname === 'localhost' || hostname === '127.0.0.1' || hostname?.endsWith('.localhost');\n const isSecure = (window as unknown as { isSecureContext?: boolean }).isSecureContext === true;\n if (!isSecure && !isLocalhost) {\n return false;\n }\n }\n return (\n typeof window !== 'undefined' &&\n typeof window.PublicKeyCredential !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n typeof navigator.credentials !== 'undefined'\n );\n}\n\nfunction mapWebAuthnDomError(err: unknown): AuthError | null {\n if (!(err instanceof Error)) return null;\n // DOMExceptions inherit from Error in modern browsers.\n const name = err.name;\n\n // User cancelled, dismissed, timed out, or no available credential.\n if (name === 'NotAllowedError') {\n return { code: 'SERVER_ERROR', message: 'Passkey operation was cancelled or timed out' };\n }\n\n // Common for trying to create a credential that already exists (or unusable state).\n if (name === 'InvalidStateError') {\n return { code: 'VALIDATION_ERROR', message: 'Passkey is not available for this operation' };\n }\n\n // Thrown for non-secure contexts, or RP ID / origin mismatches.\n if (name === 'SecurityError') {\n return {\n code: 'VALIDATION_ERROR',\n message:\n 'Passkeys require HTTPS and a correctly configured relying party (WEBAUTHN_RP_ID / WEBAUTHN_RP_ORIGIN)',\n };\n }\n\n return null;\n}\n\n/**\n * Server-managed WebAuthn (passkey) authentication + registration.\n *\n * - Login: /webauthn/auth/options -> navigator.credentials.get -> /webauthn/auth/verify\n * - Registration: /webauthn/register/options -> navigator.credentials.create -> /webauthn/register/verify\n */\nexport function useWebAuthn(): UseWebAuthnReturn {\n const { config, _internal } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n // Needed for authenticated registration endpoints when cookie auth is disabled\n getAccessToken: _internal?.getAccessToken,\n }),\n [_internal?.getAccessToken, config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n const isSupported = isWebAuthnAvailable();\n\n const authenticatePasskey = useCallback(\n async (params?: { email?: string }): Promise<AuthResponse> => {\n if (!isSupported) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Passkeys are not supported in this browser',\n };\n setError(err);\n throw err;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const optionsResponse = await apiClient.post<WebAuthnOptionsResponse>(\n '/webauthn/auth/options',\n { email: params?.email }\n );\n\n const publicKey = parseRequestOptionsFromServer(optionsResponse.options);\n\n const assertion = (await navigator.credentials.get({\n publicKey,\n })) as PublicKeyCredential | null;\n\n if (!assertion) {\n throw new Error('Passkey authentication returned no credential');\n }\n\n const data = await apiClient.post<AuthResponse>('/webauthn/auth/verify', {\n challengeId: optionsResponse.challengeId,\n credential: credentialToServerJson(assertion),\n });\n\n config.callbacks?.onLoginSuccess?.(data.user, 'webauthn');\n _internal?.handleLoginSuccess(data.user, data.tokens);\n\n return data;\n } catch (err) {\n const domMapped = mapWebAuthnDomError(err);\n const authError = domMapped ?? handleApiError(err, 'Passkey sign-in failed');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, config.callbacks, _internal, isSupported]\n );\n\n const registerPasskey = useCallback(\n async (params?: { label?: string }): Promise<{ credentialId: string; label?: string }> => {\n if (!isSupported) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Passkeys are not supported in this browser',\n };\n setError(err);\n throw err;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const optionsResponse = await apiClient.post<WebAuthnOptionsResponse>(\n '/webauthn/register/options',\n {}\n );\n\n const publicKey = parseCreationOptionsFromServer(optionsResponse.options);\n\n const created = (await navigator.credentials.create({\n publicKey,\n })) as PublicKeyCredential | null;\n\n if (!created) {\n throw new Error('Passkey registration returned no credential');\n }\n\n const result = await apiClient.post<{ success: boolean; credentialId: string; label?: string }>(\n '/webauthn/register/verify',\n {\n challengeId: optionsResponse.challengeId,\n credential: credentialToServerJson(created),\n label: params?.label,\n }\n );\n\n if (!result.success) {\n throw new Error('Passkey registration failed');\n }\n\n return { credentialId: result.credentialId, label: result.label };\n } catch (err) {\n const domMapped = mapWebAuthnDomError(err);\n const authError = domMapped ?? handleApiError(err, 'Passkey registration failed');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, isSupported]\n );\n\n return {\n isSupported,\n isLoading,\n error,\n clearError,\n authenticatePasskey,\n registerPasskey,\n };\n}\n","import type { ReactNode } from 'react';\nimport { useWebAuthn } from '../../hooks/useWebAuthn';\n\nexport interface PasskeyLoginButtonProps {\n onSuccess?: () => void;\n className?: string;\n children?: ReactNode;\n disabled?: boolean;\n}\n\nexport function PasskeyLoginButton({\n onSuccess,\n className = '',\n children,\n disabled,\n}: PasskeyLoginButtonProps) {\n const { authenticatePasskey, isLoading, isSupported } = useWebAuthn();\n\n const isDisabled = disabled || !isSupported || isLoading;\n\n return (\n <button\n type=\"button\"\n className={`cedros-button cedros-button-social ${className}`}\n onClick={async () => {\n await authenticatePasskey();\n onSuccess?.();\n }}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n >\n <span className=\"cedros-social-icon\" aria-hidden=\"true\">\n <PasskeyIcon />\n </span>\n <span>{children ?? (isLoading ? 'Continuing...' : 'Continue with Passkey')}</span>\n </button>\n );\n}\n\nfunction PasskeyIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n <path d=\"M2 12a10 10 0 0 1 18-6\" />\n <path d=\"M2 16h.01\" />\n <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n <path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" />\n <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n <path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" />\n </svg>\n );\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { EmailLoginForm } from './email/EmailLoginForm';\nimport { EmailRegisterForm } from './email/EmailRegisterForm';\nimport { ForgotPasswordForm } from './email/ForgotPasswordForm';\nimport { GoogleLoginButton } from './google/GoogleLoginButton';\nimport { AppleLoginButton } from './apple/AppleLoginButton';\nimport { SolanaLoginButton } from './solana/SolanaLoginButton';\nimport { PasskeyLoginButton } from './webauthn/PasskeyLoginButton';\nimport { detectSolanaWallets } from '../utils/walletDetection';\nimport { isAppleDevice } from '../utils/deviceDetection';\n\ntype TabValue = 'login' | 'register';\ntype ViewState = 'form' | 'forgotPassword';\nconst TABS: TabValue[] = ['login', 'register'];\n\nexport interface LoginFormProps {\n onSuccess?: () => void;\n className?: string;\n defaultTab?: 'login' | 'register';\n}\n\n/**\n * Combined login form with all enabled auth methods\n */\nexport function LoginForm({ onSuccess, className = '', defaultTab = 'login' }: LoginFormProps) {\n const { config } = useCedrosLogin();\n const [activeTab, setActiveTab] = useState<TabValue>(defaultTab);\n const [viewState, setViewState] = useState<ViewState>('form');\n // Detect wallets on initial render and re-check on window load/focus\n const [hasWallets, setHasWallets] = useState(() => detectSolanaWallets());\n const [isApple] = useState(() => isAppleDevice());\n\n useEffect(() => {\n const updateWallets = () => setHasWallets(detectSolanaWallets());\n updateWallets();\n window.addEventListener('load', updateWallets);\n window.addEventListener('focus', updateWallets);\n return () => {\n window.removeEventListener('load', updateWallets);\n window.removeEventListener('focus', updateWallets);\n };\n }, []);\n\n // Get forgot password mode from config (only show link in 'reset' mode - instantLink is handled inline)\n const forgotPasswordMode = config.forms?.forgotPassword?.mode ?? 'reset';\n\n // UI-04: Handle Arrow key navigation for tabs (ARIA tabs pattern)\n const handleTabKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const currentIndex = TABS.indexOf(activeTab);\n let newIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n // Move to previous tab (wrapping to end)\n newIndex = currentIndex === 0 ? TABS.length - 1 : currentIndex - 1;\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n // Move to next tab (wrapping to start)\n newIndex = currentIndex === TABS.length - 1 ? 0 : currentIndex + 1;\n break;\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = TABS.length - 1;\n break;\n default:\n return; // Don't prevent default for other keys\n }\n\n e.preventDefault();\n const newTab = TABS[newIndex];\n setActiveTab(newTab);\n // Focus the new tab button\n const newButton = document.getElementById(`cedros-tab-${newTab}`);\n newButton?.focus();\n },\n [activeTab]\n );\n\n const features = config.features ?? {\n email: true,\n google: true,\n apple: true,\n solana: true,\n webauthn: true,\n };\n const showEmail = features.email !== false;\n const showGoogle = features.google !== false && config.googleClientId;\n // Only show Apple button if feature enabled, clientId configured, AND on Apple device\n const showApple = features.apple !== false && config.appleClientId && isApple;\n // Only show Solana button if feature enabled AND wallets are installed\n const showSolana = features.solana !== false && hasWallets;\n const showPasskey = features.webauthn !== false;\n\n const showDivider = showEmail && (showGoogle || showApple || showSolana || showPasskey);\n\n // Show forgot password form\n if (viewState === 'forgotPassword') {\n return (\n <div className={`cedros-login-form ${className}`}>\n <ForgotPasswordForm onCancel={() => setViewState('form')} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-login-form ${className}`}>\n {/* Social login buttons */}\n {(showPasskey || showGoogle || showApple || showSolana) && (\n <div className=\"cedros-social-buttons\">\n {showPasskey && <PasskeyLoginButton onSuccess={onSuccess} />}\n {showGoogle && <GoogleLoginButton onSuccess={onSuccess} />}\n {showApple && <AppleLoginButton onSuccess={onSuccess} />}\n {showSolana && <SolanaLoginButton onSuccess={onSuccess} />}\n </div>\n )}\n\n {/* Divider */}\n {showDivider && (\n <div className=\"cedros-divider\">\n <span>Or continue with</span>\n </div>\n )}\n\n {/* Email forms */}\n {showEmail && (\n <>\n {/* Tabs */}\n <div className=\"cedros-tabs\" role=\"tablist\" aria-label=\"Authentication method\">\n <button\n type=\"button\"\n role=\"tab\"\n id=\"cedros-tab-login\"\n className={`cedros-tab ${activeTab === 'login' ? 'cedros-tab-active' : ''}`}\n onClick={() => setActiveTab('login')}\n onKeyDown={handleTabKeyDown}\n aria-selected={activeTab === 'login'}\n aria-controls=\"cedros-tabpanel-login\"\n tabIndex={activeTab === 'login' ? 0 : -1}\n >\n Sign in\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n id=\"cedros-tab-register\"\n className={`cedros-tab ${activeTab === 'register' ? 'cedros-tab-active' : ''}`}\n onClick={() => setActiveTab('register')}\n onKeyDown={handleTabKeyDown}\n aria-selected={activeTab === 'register'}\n aria-controls=\"cedros-tabpanel-register\"\n tabIndex={activeTab === 'register' ? 0 : -1}\n >\n Sign up\n </button>\n </div>\n\n {/* Tab panels */}\n <div\n role=\"tabpanel\"\n id={`cedros-tabpanel-${activeTab}`}\n aria-labelledby={`cedros-tab-${activeTab}`}\n >\n {activeTab === 'login' ? (\n <EmailLoginForm\n onSuccess={onSuccess}\n onSwitchToRegister={() => setActiveTab('register')}\n onForgotPassword={\n forgotPasswordMode === 'reset' ? () => setViewState('forgotPassword') : undefined\n }\n />\n ) : (\n <EmailRegisterForm\n onSuccess={onSuccess}\n onSwitchToLogin={() => setActiveTab('login')}\n />\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\n\nexport interface ErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode;\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Whether to show error details (useful for development) */\n showDetails?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n/**\n * Error Boundary component that catches JavaScript errors in child components.\n * Prevents the entire app from crashing and shows a fallback UI.\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={<div>Something went wrong</div>}\n * onError={(error) => logError(error)}\n * >\n * <LoginForm />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.setState({ errorInfo });\n\n // Log error to console in development\n if (process.env.NODE_ENV === 'development') {\n console.error('[Cedros Login] Error caught by ErrorBoundary:', error);\n console.error('[Cedros Login] Component stack:', errorInfo.componentStack);\n }\n\n // Call optional error callback\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n render(): ReactNode {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, showDetails = false } = this.props;\n\n if (hasError) {\n // Custom fallback provided\n if (fallback) {\n return fallback;\n }\n\n // Default fallback UI\n return (\n <div className=\"cedros-error-boundary\" role=\"alert\" aria-live=\"assertive\">\n <div className=\"cedros-error-boundary-content\">\n <svg\n className=\"cedros-error-boundary-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n\n <h2 className=\"cedros-error-boundary-title\">Something went wrong</h2>\n\n <p className=\"cedros-error-boundary-message\">\n We encountered an unexpected error. Please try again.\n </p>\n\n {showDetails && error && (\n <details className=\"cedros-error-boundary-details\">\n <summary>Error details</summary>\n <pre>\n {error.toString()}\n {errorInfo?.componentStack}\n </pre>\n </details>\n )}\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={this.handleRetry}\n >\n Try again\n </button>\n </div>\n </div>\n );\n }\n\n return children;\n }\n}\n","import { useEffect, useRef } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { LoginForm } from './LoginForm';\nimport { ErrorBoundary } from './shared/ErrorBoundary';\n\nexport interface LoginModalProps {\n className?: string;\n title?: string;\n}\n\n/**\n * Modal containing the login form.\n * Controlled by the CedrosLoginProvider context.\n */\nexport function LoginModal({ className = '', title = 'Sign in to your account' }: LoginModalProps) {\n const { isModalOpen, closeModal } = useCedrosLogin();\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<Element | null>(null);\n\n // C-03: Use ref to avoid closeModal in effect dependencies\n // Prevents event listener leak when closeModal identity changes\n const closeModalRef = useRef(closeModal);\n useEffect(() => {\n closeModalRef.current = closeModal;\n }, [closeModal]);\n\n // Handle escape key and focus trapping\n useEffect(() => {\n if (!isModalOpen) return;\n\n // Store currently focused element\n previousActiveElement.current = document.activeElement;\n\n // Focus the modal\n modalRef.current?.focus();\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModalRef.current();\n }\n\n // Focus trap\n if (e.key === 'Tab' && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n // Prevent body scroll\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.overflow = previousOverflow;\n\n // Restore focus\n if (previousActiveElement.current instanceof HTMLElement) {\n previousActiveElement.current.focus();\n }\n };\n }, [isModalOpen]);\n\n if (!isModalOpen) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n closeModal();\n }\n };\n\n return (\n <div\n className={`cedros-modal-backdrop ${className}`}\n onClick={handleBackdropClick}\n role=\"presentation\"\n >\n <div\n ref={modalRef}\n className=\"cedros-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"cedros-modal-title\"\n tabIndex={-1}\n >\n <div className=\"cedros-modal-header\">\n <h2 id=\"cedros-modal-title\" className=\"cedros-modal-title\">\n {title}\n </h2>\n <button\n type=\"button\"\n className=\"cedros-modal-close\"\n onClick={closeModal}\n aria-label=\"Close\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n {/* M-06: ErrorBoundary catches rendering errors in login form */}\n <div className=\"cedros-modal-content\">\n <ErrorBoundary>\n <LoginForm onSuccess={closeModal} />\n </ErrorBoundary>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { usePasswordReset } from '../../hooks/usePasswordReset';\nimport { PasswordInput } from './PasswordInput';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { validatePassword } from '../../utils/validation';\nimport type { PasswordValidation } from '../../types';\n\nexport interface ResetPasswordFormProps {\n token: string;\n onSuccess?: () => void;\n onLoginClick?: () => void;\n className?: string;\n}\n\n/**\n * Form for resetting password using a reset token.\n *\n * @example\n * ```tsx\n * // Get token from URL params\n * const token = new URLSearchParams(location.search).get('token');\n *\n * <ResetPasswordForm\n * token={token}\n * onSuccess={() => navigate('/login')}\n * onLoginClick={() => navigate('/login')}\n * />\n * ```\n */\nexport function ResetPasswordForm({\n token,\n onSuccess,\n onLoginClick,\n className = '',\n}: ResetPasswordFormProps) {\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [validation, setValidation] = useState<PasswordValidation | null>(null);\n const { resetPassword, isLoading, isSuccess, error, clearError } = usePasswordReset();\n\n const passwordsMatch = password === confirmPassword;\n const isValid = validation?.isValid && passwordsMatch && password.length > 0;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!isValid) return;\n\n try {\n await resetPassword(token, password);\n onSuccess?.();\n } catch {\n // Error is already set in the hook\n }\n };\n\n if (isSuccess) {\n return (\n <div className={`cedros-reset-password-success ${className}`}>\n <svg\n className=\"cedros-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"22\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M14 24l7 7 13-13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3 className=\"cedros-success-title\">Password reset successful</h3>\n <p className=\"cedros-success-message\">\n Your password has been reset. You can now log in with your new password.\n </p>\n {onLoginClick && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-primary\"\n onClick={onLoginClick}\n >\n Go to login\n </button>\n )}\n </div>\n );\n }\n\n return (\n <form className={`cedros-reset-password-form ${className}`} onSubmit={handleSubmit}>\n <div className=\"cedros-form-header\">\n <h3 className=\"cedros-form-title\">Reset your password</h3>\n <p className=\"cedros-form-subtitle\">Enter your new password below.</p>\n </div>\n\n <ErrorMessage error={error} onDismiss={clearError} />\n\n <div className=\"cedros-form-field\">\n <PasswordInput\n label=\"New password\"\n value={password}\n onChange={(e) => {\n setPassword(e.target.value);\n setValidation(validatePassword(e.target.value));\n }}\n showStrengthMeter\n onValidationChange={setValidation}\n disabled={isLoading}\n autoComplete=\"new-password\"\n error={\n validation && !validation.isValid\n ? Object.values(validation.errors).find(Boolean)\n : undefined\n }\n />\n </div>\n\n <div className=\"cedros-form-field\">\n <PasswordInput\n label=\"Confirm password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n disabled={isLoading}\n autoComplete=\"new-password\"\n error={confirmPassword && !passwordsMatch ? 'Passwords do not match' : undefined}\n />\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-md cedros-button-primary cedros-button-full\"\n disabled={isLoading || !isValid}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n Resetting...\n </>\n ) : (\n 'Reset password'\n )}\n </button>\n\n {onLoginClick && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-ghost cedros-button-full\"\n onClick={onLoginClick}\n disabled={isLoading}\n >\n Back to login\n </button>\n )}\n </div>\n </form>\n );\n}\n","/**\n * Organization avatar component\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\nimport type { OrgWithMembership } from '../../types';\nimport { sanitizeImageUrl } from '../../utils/sanitization';\n\nexport interface OrgAvatarProps {\n org: OrgWithMembership;\n size?: 'sm' | 'lg';\n className?: string;\n}\n\nexport function OrgAvatar({ org, size = 'lg', className = '' }: OrgAvatarProps) {\n const sanitizedLogoUrl = sanitizeImageUrl(org.logoUrl);\n const sizeClass = size === 'lg' ? 'cedros-org-avatar-lg' : '';\n const imageClassName = ['cedros-org-avatar', sizeClass, className].filter(Boolean).join(' ');\n const placeholderClassName = ['cedros-org-avatar-placeholder', sizeClass, className]\n .filter(Boolean)\n .join(' ');\n if (sanitizedLogoUrl) {\n return (\n <img\n src={sanitizedLogoUrl}\n alt={org.name}\n className={imageClassName}\n referrerPolicy=\"no-referrer\"\n />\n );\n }\n\n return <div className={placeholderClassName}>{org.name[0]?.toUpperCase() || '?'}</div>;\n}\n","import { useCallback, useState, useRef, useEffect } from 'react';\nimport type { OrgWithMembership } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { OrgAvatar } from './OrgAvatar';\n\nexport interface OrgSelectorProps {\n /** List of organizations to display */\n orgs: OrgWithMembership[];\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** Loading state */\n isLoading?: boolean;\n /** Callback when organization is selected */\n onSelect: (orgId: string) => void;\n /** Callback when \"Create organization\" is clicked */\n onCreateClick?: () => void;\n /** Additional CSS class */\n className?: string;\n /** Placeholder when no orgs */\n placeholder?: string;\n}\n\n/**\n * Dropdown selector for switching between organizations.\n *\n * ## A11Y-02: Keyboard Navigation Limitation\n *\n * Currently supports:\n * - Tab/Shift+Tab: Move focus between trigger and items\n * - Escape: Close dropdown\n * - Enter/Space: Select focused item\n *\n * TODO: Implement arrow key navigation for better accessibility:\n * - ArrowUp/ArrowDown: Navigate between items in the list\n * - Home/End: Jump to first/last item\n * - Type-ahead: Focus item starting with typed character\n *\n * See WAI-ARIA Listbox Pattern for reference implementation.\n *\n * @example\n * ```tsx\n * function Header() {\n * const { orgs, activeOrg, switchOrg } = useOrgs();\n *\n * return (\n * <OrgSelector\n * orgs={orgs}\n * activeOrg={activeOrg}\n * onSelect={switchOrg}\n * onCreateClick={() => setShowCreateModal(true)}\n * />\n * );\n * }\n * ```\n */\nexport function OrgSelector({\n orgs,\n activeOrg,\n isLoading = false,\n onSelect,\n onCreateClick,\n className = '',\n placeholder = 'Select organization',\n}: OrgSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const handleSelect = useCallback(\n (orgId: string) => {\n onSelect(orgId);\n setIsOpen(false);\n },\n [onSelect]\n );\n\n const handleCreateClick = useCallback(() => {\n setIsOpen(false);\n onCreateClick?.();\n }, [onCreateClick]);\n\n const toggleDropdown = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n if (isLoading) {\n return (\n <div\n className={`cedros-org-selector cedros-org-selector-loading ${className}`}\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <LoadingSpinner size=\"sm\" />\n <span>Loading...</span>\n </div>\n );\n }\n\n return (\n <div ref={dropdownRef} className={`cedros-org-selector ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-org-selector-trigger\"\n onClick={toggleDropdown}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n >\n {activeOrg ? (\n <>\n <OrgAvatar org={activeOrg} size=\"sm\" />\n <span className=\"cedros-org-selector-name\">{activeOrg.name}</span>\n <RoleBadge role={activeOrg.membership.role} />\n </>\n ) : (\n <span className=\"cedros-org-selector-placeholder\">{placeholder}</span>\n )}\n <ChevronIcon isOpen={isOpen} />\n </button>\n\n {isOpen && (\n <div className=\"cedros-org-selector-dropdown\" role=\"listbox\">\n {orgs.length === 0 ? (\n <div className=\"cedros-org-selector-empty\">No organizations</div>\n ) : (\n <ul className=\"cedros-org-selector-list\">\n {orgs.map((org) => (\n <li key={org.id}>\n <button\n type=\"button\"\n className={`cedros-org-selector-item ${\n org.id === activeOrg?.id ? 'cedros-org-selector-item-active' : ''\n }`}\n onClick={() => handleSelect(org.id)}\n role=\"option\"\n aria-selected={org.id === activeOrg?.id}\n >\n <OrgAvatar org={org} size=\"sm\" />\n <span className=\"cedros-org-selector-item-name\">{org.name}</span>\n <RoleBadge role={org.membership.role} />\n {org.id === activeOrg?.id && <CheckIcon />}\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {onCreateClick && (\n <>\n <div className=\"cedros-org-selector-divider\" />\n <button\n type=\"button\"\n className=\"cedros-org-selector-create\"\n onClick={handleCreateClick}\n >\n <PlusIcon />\n <span>Create organization</span>\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// Helper components\nfunction RoleBadge({ role }: { role: string }) {\n return <span className={`cedros-org-role cedros-org-role-${role}`}>{role}</span>;\n}\n\nfunction ChevronIcon({ isOpen }: { isOpen: boolean }) {\n return (\n <svg\n className={`cedros-org-chevron ${isOpen ? 'cedros-org-chevron-open' : ''}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"cedros-org-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8L6 11L13 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction PlusIcon() {\n return (\n <svg\n className=\"cedros-org-plus\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 3V13M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Icon components for organization UI\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\n\nexport function CloseIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 5L15 15M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CheckIcon() {\n return (\n <svg\n className=\"cedros-org-check\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 10L8 14L16 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function PlusIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 4V16M4 10H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Organization list view component\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\nimport type { OrgWithMembership } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { OrgAvatar } from './OrgAvatar';\nimport { CheckIcon, PlusIcon } from './icons';\n\nexport interface OrgListViewProps {\n orgs: OrgWithMembership[];\n activeOrg: OrgWithMembership | null;\n isLoading: boolean;\n onSelect: (orgId: string) => void;\n onCreateClick?: () => void;\n}\n\nexport function OrgListView({\n orgs,\n activeOrg,\n isLoading,\n onSelect,\n onCreateClick,\n}: OrgListViewProps) {\n if (isLoading) {\n return (\n <div className=\"cedros-org-switcher-loading\">\n <LoadingSpinner />\n <span>Loading organizations...</span>\n </div>\n );\n }\n\n return (\n <>\n {orgs.length === 0 ? (\n <div className=\"cedros-org-switcher-empty\">\n <p>You don't belong to any organizations yet.</p>\n </div>\n ) : (\n <ul className=\"cedros-org-switcher-list\">\n {orgs.map((org) => (\n <li key={org.id}>\n <button\n type=\"button\"\n className={`cedros-org-switcher-item ${\n org.id === activeOrg?.id ? 'cedros-org-switcher-item-active' : ''\n }`}\n onClick={() => onSelect(org.id)}\n >\n <OrgAvatar org={org} />\n <div className=\"cedros-org-switcher-item-content\">\n <span className=\"cedros-org-switcher-item-name\">{org.name}</span>\n <span className=\"cedros-org-switcher-item-slug\">@{org.slug}</span>\n </div>\n <div className=\"cedros-org-switcher-item-meta\">\n <span className={`cedros-org-role cedros-org-role-${org.membership.role}`}>\n {org.membership.role}\n </span>\n {org.isPersonal && <span className=\"cedros-org-personal-badge\">Personal</span>}\n </div>\n {org.id === activeOrg?.id && <CheckIcon />}\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {onCreateClick && (\n <button type=\"button\" className=\"cedros-org-switcher-create\" onClick={onCreateClick}>\n <PlusIcon />\n <span>Create new organization</span>\n </button>\n )}\n </>\n );\n}\n","/**\n * Create organization form component\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\nimport { useState, useCallback } from 'react';\nimport type { CreateOrgRequest } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface CreateOrgFormProps {\n isLoading: boolean;\n onSubmit: (data: CreateOrgRequest) => Promise<void>;\n onCancel: () => void;\n}\n\nexport function CreateOrgForm({ isLoading, onSubmit, onCancel }: CreateOrgFormProps) {\n const [name, setName] = useState('');\n const [slug, setSlug] = useState('');\n const [formError, setFormError] = useState<string | null>(null);\n\n // Auto-generate slug from name\n const handleNameChange = useCallback((value: string) => {\n setName(value);\n // Generate slug: lowercase, replace spaces with hyphens, remove special chars\n const generatedSlug = value\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .substring(0, 50);\n setSlug(generatedSlug);\n }, []);\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent) => {\n event.preventDefault();\n setFormError(null);\n\n if (!name.trim()) {\n setFormError('Organization name is required');\n return;\n }\n\n if (!slug.trim()) {\n setFormError('Organization slug is required');\n return;\n }\n\n try {\n await onSubmit({ name: name.trim(), slug: slug.trim() });\n } catch (err) {\n setFormError((err as Error).message || 'Failed to create organization');\n }\n },\n [name, slug, onSubmit]\n );\n\n return (\n <form className=\"cedros-org-create-form\" onSubmit={handleSubmit}>\n {formError && <ErrorMessage error={formError} />}\n\n <div className=\"cedros-form-group\">\n <label htmlFor=\"org-name\" className=\"cedros-form-label\">\n Organization Name\n </label>\n <input\n id=\"org-name\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={name}\n onChange={(e) => handleNameChange(e.target.value)}\n placeholder=\"My Organization\"\n maxLength={255}\n disabled={isLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label htmlFor=\"org-slug\" className=\"cedros-form-label\">\n URL Slug\n </label>\n <div className=\"cedros-form-input-prefix\">\n <span className=\"cedros-form-prefix\">@</span>\n <input\n id=\"org-slug\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={slug}\n onChange={(e) => setSlug(e.target.value.toLowerCase())}\n placeholder=\"my-organization\"\n maxLength={100}\n pattern=\"[a-z0-9-]+\"\n disabled={isLoading}\n />\n </div>\n <span className=\"cedros-form-hint\">Only lowercase letters, numbers, and hyphens</span>\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isLoading || !name.trim() || !slug.trim()}\n >\n {isLoading ? <LoadingSpinner size=\"sm\" /> : 'Create Organization'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Organization switcher modal component\n *\n * Refactored to extract sub-components (F-02):\n * - CreateOrgForm -> ./CreateOrgForm.tsx\n * - OrgListView -> ./OrgListView.tsx\n * - OrgAvatar -> ./OrgAvatar.tsx\n * - Icons -> ./icons.tsx\n */\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { OrgWithMembership, CreateOrgRequest, DisplayError } from '../../types';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { OrgListView } from './OrgListView';\nimport { CreateOrgForm } from './CreateOrgForm';\nimport { CloseIcon } from './icons';\n\nexport interface OrgSwitcherProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** List of organizations */\n orgs: OrgWithMembership[];\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Callback when organization is selected */\n onSelect: (orgId: string) => void;\n /** Callback when new organization is created */\n onCreate?: (data: CreateOrgRequest) => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\ntype ViewMode = 'list' | 'create';\n\n/**\n * Modal for switching organizations and creating new ones.\n *\n * @example\n * ```tsx\n * function App() {\n * const [isOpen, setIsOpen] = useState(false);\n * const { orgs, activeOrg, switchOrg, createOrg } = useOrgs();\n *\n * return (\n * <>\n * <button onClick={() => setIsOpen(true)}>Switch org</button>\n * <OrgSwitcher\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * orgs={orgs}\n * activeOrg={activeOrg}\n * onSelect={switchOrg}\n * onCreate={createOrg}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function OrgSwitcher({\n isOpen,\n onClose,\n orgs,\n activeOrg,\n isLoading = false,\n error,\n onSelect,\n onCreate,\n className = '',\n}: OrgSwitcherProps) {\n // Render null when closed - inner content unmounts, resetting state naturally\n if (!isOpen) return null;\n\n return (\n <OrgSwitcherModal\n onClose={onClose}\n orgs={orgs}\n activeOrg={activeOrg}\n isLoading={isLoading}\n error={error}\n onSelect={onSelect}\n onCreate={onCreate}\n className={className}\n />\n );\n}\n\n// Inner modal component - unmounts when modal closes, resetting viewMode state\nfunction OrgSwitcherModal({\n onClose,\n orgs,\n activeOrg,\n isLoading = false,\n error,\n onSelect,\n onCreate,\n className,\n}: Omit<OrgSwitcherProps, 'isOpen'>) {\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const modalRef = useRef<HTMLDivElement>(null);\n // UI-05: Store previously focused element for restoration\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // UI-05: Focus trap and restoration\n useEffect(() => {\n // Save currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Focus the close button when modal opens\n const closeButton = modalRef.current?.querySelector<HTMLElement>('.cedros-modal-close');\n closeButton?.focus();\n\n return () => {\n // Restore focus when modal closes\n previousFocusRef.current?.focus();\n };\n }, []);\n\n // Close on escape key - runs unconditionally since component only mounts when modal is open\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n return;\n }\n\n // UI-05: Focus trap - Tab/Shift+Tab within modal\n if (event.key === 'Tab' && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift+Tab: wrap from first to last\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n // Tab: wrap from last to first\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n },\n [onClose]\n );\n\n const handleSelect = useCallback(\n (orgId: string) => {\n onSelect(orgId);\n onClose();\n },\n [onSelect, onClose]\n );\n\n const handleCreate = useCallback(\n async (data: CreateOrgRequest) => {\n await onCreate?.(data);\n onClose();\n },\n [onCreate, onClose]\n );\n\n return (\n <div className=\"cedros-modal-backdrop\" onClick={handleBackdropClick}>\n <div\n ref={modalRef}\n className={`cedros-modal cedros-org-switcher ${className}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"org-switcher-title\"\n >\n <div className=\"cedros-modal-header\">\n <h2 id=\"org-switcher-title\" className=\"cedros-modal-title\">\n {viewMode === 'list' ? 'Switch Organization' : 'Create Organization'}\n </h2>\n <button type=\"button\" className=\"cedros-modal-close\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n\n <div className=\"cedros-modal-body\">\n {error && <ErrorMessage error={error} />}\n\n {viewMode === 'list' ? (\n <OrgListView\n orgs={orgs}\n activeOrg={activeOrg}\n isLoading={isLoading}\n onSelect={handleSelect}\n onCreateClick={onCreate ? () => setViewMode('create') : undefined}\n />\n ) : (\n <CreateOrgForm\n isLoading={isLoading}\n onSubmit={handleCreate}\n onCancel={() => setViewMode('list')}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback } from 'react';\nimport type { Member, OrgRole, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { sanitizeImageUrl } from '../../utils/sanitization';\n\nexport interface MemberListProps {\n /** List of members to display */\n members: Member[];\n /** Current user's ID (to prevent self-actions) */\n currentUserId?: string;\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Whether the current user can manage members */\n canManage?: boolean;\n /** Whether the current user can change roles */\n canChangeRoles?: boolean;\n /** Callback when role is updated */\n onUpdateRole?: (userId: string, role: OrgRole) => Promise<void>;\n /** Callback when member is removed */\n onRemove?: (userId: string) => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\nconst ROLE_OPTIONS: OrgRole[] = ['owner', 'admin', 'member', 'viewer'];\n\n/**\n * Display and manage organization members.\n *\n * @example\n * ```tsx\n * function TeamMembers() {\n * const { activeOrg, hasPermission } = useOrgs();\n * const { members, isLoading, error, updateMemberRole, removeMember } = useMembers(activeOrg?.id);\n * const { user } = useAuth();\n *\n * return (\n * <MemberList\n * members={members}\n * currentUserId={user?.id}\n * isLoading={isLoading}\n * error={error?.message}\n * canManage={hasPermission('member:remove')}\n * canChangeRoles={hasPermission('member:role_change')}\n * onUpdateRole={updateMemberRole}\n * onRemove={removeMember}\n * />\n * );\n * }\n * ```\n */\nexport function MemberList({\n members,\n currentUserId,\n isLoading = false,\n error,\n canManage = false,\n canChangeRoles = false,\n onUpdateRole,\n onRemove,\n className = '',\n}: MemberListProps) {\n if (isLoading && members.length === 0) {\n return (\n <div className={`cedros-member-list cedros-member-list-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading members...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-member-list ${className}`}>\n <ErrorMessage error={error} />\n </div>\n );\n }\n\n if (members.length === 0) {\n return (\n <div className={`cedros-member-list cedros-member-list-empty ${className}`}>\n <p>No members found.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-member-list ${className}`}>\n <table className=\"cedros-member-table\">\n <thead>\n <tr>\n <th>Member</th>\n <th>Role</th>\n <th>Joined</th>\n {(canManage || canChangeRoles) && <th>Actions</th>}\n </tr>\n </thead>\n <tbody>\n {members.map((member) => (\n <MemberRow\n key={member.id}\n member={member}\n isCurrentUser={member.userId === currentUserId}\n canManage={canManage}\n canChangeRoles={canChangeRoles}\n onUpdateRole={onUpdateRole}\n onRemove={onRemove}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Member row component\ninterface MemberRowProps {\n member: Member;\n isCurrentUser: boolean;\n canManage: boolean;\n canChangeRoles: boolean;\n onUpdateRole?: (userId: string, role: OrgRole) => Promise<void>;\n onRemove?: (userId: string) => Promise<void>;\n}\n\nfunction MemberRow({\n member,\n isCurrentUser,\n canManage,\n canChangeRoles,\n onUpdateRole,\n onRemove,\n}: MemberRowProps) {\n const [isUpdating, setIsUpdating] = useState(false);\n const [selectedRole, setSelectedRole] = useState<OrgRole>(member.role);\n\n const handleRoleChange = useCallback(\n async (newRole: OrgRole) => {\n if (!onUpdateRole || newRole === member.role) return;\n\n setIsUpdating(true);\n try {\n await onUpdateRole(member.userId, newRole);\n setSelectedRole(newRole);\n } catch {\n // Revert on error\n setSelectedRole(member.role);\n } finally {\n setIsUpdating(false);\n }\n },\n [member.userId, member.role, onUpdateRole]\n );\n\n const handleRemove = useCallback(async () => {\n if (!onRemove) return;\n\n const confirmed = window.confirm(\n `Are you sure you want to remove ${member.user.name || member.user.email} from this organization?`\n );\n if (!confirmed) return;\n\n setIsUpdating(true);\n try {\n await onRemove(member.userId);\n } finally {\n setIsUpdating(false);\n }\n }, [member.userId, member.user.name, member.user.email, onRemove]);\n\n const isOwner = member.role === 'owner';\n const canModify = !isCurrentUser && !isOwner;\n\n return (\n <tr className={`cedros-member-row ${isCurrentUser ? 'cedros-member-row-current' : ''}`}>\n <td className=\"cedros-member-info\">\n <MemberAvatar user={member.user} />\n <div className=\"cedros-member-details\">\n <span className=\"cedros-member-name\">\n {member.user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-member-you\">(you)</span>}\n </span>\n <span className=\"cedros-member-email\">{member.user.email}</span>\n </div>\n </td>\n <td className=\"cedros-member-role\">\n {canChangeRoles && canModify && onUpdateRole ? (\n <select\n value={selectedRole}\n onChange={(e) => handleRoleChange(e.target.value as OrgRole)}\n disabled={isUpdating}\n className=\"cedros-role-select\"\n >\n {ROLE_OPTIONS.map((role) => (\n <option key={role} value={role}>\n {role.charAt(0).toUpperCase() + role.slice(1)}\n </option>\n ))}\n </select>\n ) : (\n <span className={`cedros-role-badge cedros-role-badge-${member.role}`}>\n {member.role.charAt(0).toUpperCase() + member.role.slice(1)}\n </span>\n )}\n </td>\n <td className=\"cedros-member-joined\">{formatDate(member.joinedAt)}</td>\n {(canManage || canChangeRoles) && (\n <td className=\"cedros-member-actions\">\n {canManage && canModify && onRemove && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger cedros-button-sm\"\n onClick={handleRemove}\n disabled={isUpdating}\n aria-label={`Remove ${member.user.name || member.user.email}`}\n >\n {isUpdating ? <LoadingSpinner size=\"sm\" /> : 'Remove'}\n </button>\n )}\n </td>\n )}\n </tr>\n );\n}\n\n// Helper components\nfunction MemberAvatar({ user }: { user: Member['user'] }) {\n // COMP-06: Cache sanitized URL and verify before use (blocks dangerous protocols)\n const sanitizedPicture = sanitizeImageUrl(user.picture);\n if (sanitizedPicture) {\n return (\n <img\n src={sanitizedPicture}\n alt={user.name || user.email || 'Member'}\n className=\"cedros-member-avatar\"\n referrerPolicy=\"no-referrer\"\n />\n );\n }\n\n const initial = (user.name?.[0] || user.email?.[0] || '?').toUpperCase();\n return <div className=\"cedros-member-avatar-placeholder\">{initial}</div>;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport type { OrgRole, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { validateEmail } from '../../utils/validation';\n\ntype InviteRole = Exclude<OrgRole, 'owner'>;\n\nexport interface InviteFormProps {\n /** Callback when invite is submitted */\n onSubmit: (email: string, role: InviteRole) => Promise<void>;\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Available roles for invite (default: admin, member, viewer) */\n availableRoles?: InviteRole[];\n /** Default role for new invites */\n defaultRole?: InviteRole;\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_ROLES: InviteRole[] = ['admin', 'member', 'viewer'];\n\n/**\n * Form for inviting new members to an organization.\n *\n * @example\n * ```tsx\n * function InviteManager() {\n * const { activeOrg } = useOrgs();\n * const { createInvite, isLoading, error } = useInvites(activeOrg?.id);\n *\n * return (\n * <InviteForm\n * onSubmit={createInvite}\n * isLoading={isLoading}\n * error={error?.message}\n * defaultRole=\"member\"\n * />\n * );\n * }\n * ```\n */\nexport function InviteForm({\n onSubmit,\n isLoading = false,\n error,\n availableRoles = DEFAULT_ROLES,\n defaultRole = 'member',\n className = '',\n}: InviteFormProps) {\n const [email, setEmail] = useState('');\n const [role, setRole] = useState<InviteRole>(defaultRole);\n const [formError, setFormError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n const successTimerRef = useRef<number | null>(null);\n // UI-03: Track mounted state to prevent state updates after unmount\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n if (successTimerRef.current !== null) {\n window.clearTimeout(successTimerRef.current);\n successTimerRef.current = null;\n }\n };\n }, []);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n setFormError(null);\n setSuccess(false);\n\n const trimmedEmail = email.trim();\n\n if (!trimmedEmail) {\n setFormError('Email is required');\n return;\n }\n\n if (!validateEmail(trimmedEmail)) {\n setFormError('Please enter a valid email address');\n return;\n }\n\n try {\n await onSubmit(trimmedEmail, role);\n setEmail('');\n setRole(defaultRole);\n setSuccess(true);\n // Clear success message after 3 seconds\n if (successTimerRef.current !== null) {\n window.clearTimeout(successTimerRef.current);\n }\n successTimerRef.current = window.setTimeout(() => {\n // UI-03: Check mounted before state update to prevent memory leak warnings\n if (isMountedRef.current) {\n setSuccess(false);\n }\n successTimerRef.current = null;\n }, 3000);\n } catch {\n // H-05: Error handling is delegated to parent component.\n // Parent's onSubmit throws -> parent catches -> sets error prop -> ErrorMessage displays it.\n // This pattern allows the parent to control error display and retry logic.\n }\n },\n [email, role, defaultRole, onSubmit]\n );\n\n return (\n <form className={`cedros-invite-form ${className}`} onSubmit={handleSubmit}>\n {(error || formError) && <ErrorMessage error={formError ?? error ?? null} />}\n\n {success && (\n <div className=\"cedros-invite-success\" role=\"status\">\n <CheckIcon />\n <span>Invitation sent successfully!</span>\n </div>\n )}\n\n <div className=\"cedros-invite-form-row\">\n <div className=\"cedros-form-group cedros-invite-email-group\">\n <label htmlFor=\"invite-email\" className=\"cedros-form-label\">\n Email Address\n </label>\n <input\n id=\"invite-email\"\n type=\"email\"\n className=\"cedros-form-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"colleague@example.com\"\n disabled={isLoading}\n autoComplete=\"email\"\n />\n </div>\n\n <div className=\"cedros-form-group cedros-invite-role-group\">\n <label htmlFor=\"invite-role\" className=\"cedros-form-label\">\n Role\n </label>\n <select\n id=\"invite-role\"\n className=\"cedros-form-select\"\n value={role}\n onChange={(e) => setRole(e.target.value as InviteRole)}\n disabled={isLoading}\n >\n {availableRoles.map((r) => (\n <option key={r} value={r}>\n {r.charAt(0).toUpperCase() + r.slice(1)}\n </option>\n ))}\n </select>\n </div>\n\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary cedros-invite-submit\"\n disabled={isLoading || !email.trim()}\n >\n {isLoading ? <LoadingSpinner size=\"sm\" /> : 'Send Invite'}\n </button>\n </div>\n\n <p className=\"cedros-form-hint\">\n The invited user will receive an email with a link to join your organization.\n </p>\n </form>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"cedros-invite-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8L6 11L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport type { Invite, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface InviteListProps {\n /** List of pending invites */\n invites: Invite[];\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Whether the current user can manage invites */\n canManage?: boolean;\n /** Callback when invite is cancelled */\n onCancel?: (inviteId: string) => Promise<void>;\n /** Callback when invite is resent */\n onResend?: (inviteId: string) => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Display and manage pending organization invites.\n *\n * @example\n * ```tsx\n * function PendingInvites() {\n * const { activeOrg, hasPermission } = useOrgs();\n * const { invites, isLoading, error, cancelInvite, resendInvite } = useInvites(activeOrg?.id);\n *\n * return (\n * <InviteList\n * invites={invites}\n * isLoading={isLoading}\n * error={error?.message}\n * canManage={hasPermission('invite:cancel')}\n * onCancel={cancelInvite}\n * onResend={resendInvite}\n * />\n * );\n * }\n * ```\n */\nexport function InviteList({\n invites,\n isLoading = false,\n error,\n canManage = false,\n onCancel,\n onResend,\n className = '',\n}: InviteListProps) {\n if (isLoading && invites.length === 0) {\n return (\n <div className={`cedros-invite-list cedros-invite-list-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading invites...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-invite-list ${className}`}>\n <ErrorMessage error={error} />\n </div>\n );\n }\n\n if (invites.length === 0) {\n return (\n <div className={`cedros-invite-list cedros-invite-list-empty ${className}`}>\n <p>No pending invites.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-invite-list ${className}`}>\n <ul className=\"cedros-invite-items\">\n {invites.map((invite) => (\n <InviteItem\n key={invite.id}\n invite={invite}\n canManage={canManage}\n onCancel={onCancel}\n onResend={onResend}\n />\n ))}\n </ul>\n </div>\n );\n}\n\n// Invite item component\ninterface InviteItemProps {\n invite: Invite;\n canManage: boolean;\n onCancel?: (inviteId: string) => Promise<void>;\n onResend?: (inviteId: string) => Promise<void>;\n}\n\nfunction InviteItem({ invite, canManage, onCancel, onResend }: InviteItemProps) {\n const [isUpdating, setIsUpdating] = useState(false);\n const [resendSuccess, setResendSuccess] = useState(false);\n const resendTimerRef = useRef<number | null>(null);\n\n const isExpired = new Date(invite.expiresAt) < new Date();\n\n const handleCancel = useCallback(async () => {\n if (!onCancel) return;\n\n const confirmed = window.confirm(\n `Are you sure you want to cancel the invite for ${invite.email}?`\n );\n if (!confirmed) return;\n\n setIsUpdating(true);\n try {\n await onCancel(invite.id);\n } finally {\n setIsUpdating(false);\n }\n }, [invite.id, invite.email, onCancel]);\n\n const handleResend = useCallback(async () => {\n if (!onResend) return;\n\n setIsUpdating(true);\n setResendSuccess(false);\n try {\n await onResend(invite.id);\n setResendSuccess(true);\n if (resendTimerRef.current !== null) {\n window.clearTimeout(resendTimerRef.current);\n }\n resendTimerRef.current = window.setTimeout(() => {\n setResendSuccess(false);\n resendTimerRef.current = null;\n }, 3000);\n } finally {\n setIsUpdating(false);\n }\n }, [invite.id, onResend]);\n\n useEffect(() => {\n return () => {\n if (resendTimerRef.current !== null) {\n window.clearTimeout(resendTimerRef.current);\n resendTimerRef.current = null;\n }\n };\n }, []);\n\n return (\n <li className={`cedros-invite-item ${isExpired ? 'cedros-invite-item-expired' : ''}`}>\n <div className=\"cedros-invite-item-info\">\n <div className=\"cedros-invite-item-main\">\n <span className=\"cedros-invite-item-email\">{invite.email}</span>\n <span className={`cedros-role-badge cedros-role-badge-${invite.role}`}>\n {invite.role.charAt(0).toUpperCase() + invite.role.slice(1)}\n </span>\n {isExpired && <span className=\"cedros-invite-expired-badge\">Expired</span>}\n </div>\n <div className=\"cedros-invite-item-meta\">\n <span className=\"cedros-invite-item-date\">\n {/* TYPE-05: invitedByName removed - backend doesn't populate it */}\n Invited {formatDate(invite.createdAt)}\n </span>\n {!isExpired && (\n <span className=\"cedros-invite-item-expires\">\n Expires {formatRelativeTime(invite.expiresAt)}\n </span>\n )}\n </div>\n </div>\n\n {canManage && (\n <div className=\"cedros-invite-item-actions\">\n {resendSuccess && <span className=\"cedros-invite-resend-success\">Sent!</span>}\n {onResend && !isExpired && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={handleResend}\n disabled={isUpdating}\n aria-label={`Resend invite to ${invite.email}`}\n >\n {isUpdating ? <LoadingSpinner size=\"sm\" /> : 'Resend'}\n </button>\n )}\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger cedros-button-sm\"\n onClick={handleCancel}\n disabled={isUpdating}\n aria-label={`Cancel invite for ${invite.email}`}\n >\n Cancel\n </button>\n )}\n </div>\n )}\n </li>\n );\n}\n\n// Helper functions\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n return 'expired';\n } else if (diffDays === 0) {\n return 'today';\n } else if (diffDays === 1) {\n return 'tomorrow';\n } else if (diffDays < 7) {\n return `in ${diffDays} days`;\n } else {\n return formatDate(dateString);\n }\n}\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport type { Session, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface SessionListProps {\n /** List of active sessions */\n sessions: Session[];\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Callback to revoke all other sessions */\n onRevokeAll?: () => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Display active sessions and allow revoking all other sessions.\n *\n * @example\n * ```tsx\n * function SecuritySettings() {\n * const { sessions, isLoading, error, revokeAllSessions } = useSessions();\n *\n * return (\n * <SessionList\n * sessions={sessions}\n * isLoading={isLoading}\n * error={error?.message}\n * onRevokeAll={revokeAllSessions}\n * />\n * );\n * }\n * ```\n */\nexport function SessionList({\n sessions,\n isLoading = false,\n error,\n onRevokeAll,\n className = '',\n}: SessionListProps) {\n const [isRevoking, setIsRevoking] = useState(false);\n const [revokeSuccess, setRevokeSuccess] = useState(false);\n const revokeTimerRef = useRef<number | null>(null);\n\n // PERF-05: Memoize filtered count to avoid O(n) filter on every render.\n // This count is used in the button text and handleRevokeAll callback.\n const otherSessionCount = useMemo(() => sessions.filter((s) => !s.isCurrent).length, [sessions]);\n\n const handleRevokeAll = useCallback(async () => {\n if (!onRevokeAll) return;\n\n // M-09: Recalculate count inside handler to avoid stale closure.\n // If sessions change between callback creation and confirm dialog,\n // we want the confirm message to show the current count.\n const currentOtherCount = sessions.filter((s) => !s.isCurrent).length;\n if (currentOtherCount === 0) return;\n\n const confirmed = window.confirm(\n `Are you sure you want to sign out of ${currentOtherCount} other device(s)? This will log you out everywhere except this browser.`\n );\n if (!confirmed) return;\n\n setIsRevoking(true);\n setRevokeSuccess(false);\n\n try {\n await onRevokeAll();\n setRevokeSuccess(true);\n if (revokeTimerRef.current !== null) {\n window.clearTimeout(revokeTimerRef.current);\n }\n revokeTimerRef.current = window.setTimeout(() => {\n setRevokeSuccess(false);\n revokeTimerRef.current = null;\n }, 3000);\n } finally {\n setIsRevoking(false);\n }\n }, [onRevokeAll, sessions]);\n\n useEffect(() => {\n return () => {\n if (revokeTimerRef.current !== null) {\n window.clearTimeout(revokeTimerRef.current);\n revokeTimerRef.current = null;\n }\n };\n }, []);\n\n if (isLoading && sessions.length === 0) {\n return (\n <div className={`cedros-session-list cedros-session-list-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading sessions...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-session-list ${className}`}>\n <ErrorMessage error={error} />\n </div>\n );\n }\n\n if (sessions.length === 0) {\n return (\n <div className={`cedros-session-list cedros-session-list-empty ${className}`}>\n <p>No active sessions found.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-session-list ${className}`}>\n {revokeSuccess && (\n <div className=\"cedros-session-success\" role=\"status\">\n <CheckIcon />\n <span>All other sessions have been revoked.</span>\n </div>\n )}\n\n <ul className=\"cedros-session-items\">\n {sessions.map((session) => (\n <SessionItem key={session.id} session={session} />\n ))}\n </ul>\n\n {onRevokeAll && otherSessionCount > 0 && (\n <div className=\"cedros-session-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger\"\n onClick={handleRevokeAll}\n disabled={isRevoking}\n >\n {isRevoking ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Signing out...</span>\n </>\n ) : (\n `Sign out of ${otherSessionCount} other device${otherSessionCount > 1 ? 's' : ''}`\n )}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// Session item component\nfunction SessionItem({ session }: { session: Session }) {\n const browserInfo = parseUserAgent(session.userAgent);\n const isExpiringSoon = isSessionExpiringSoon(session.expiresAt);\n\n return (\n <li className={`cedros-session-item ${session.isCurrent ? 'cedros-session-item-current' : ''}`}>\n <div className=\"cedros-session-item-icon\">\n <DeviceIcon userAgent={session.userAgent} />\n </div>\n <div className=\"cedros-session-item-info\">\n <div className=\"cedros-session-item-main\">\n <span className=\"cedros-session-item-device\">\n {browserInfo.browser} on {browserInfo.os}\n </span>\n {session.isCurrent && (\n <span className=\"cedros-session-current-badge\">Current session</span>\n )}\n </div>\n <div className=\"cedros-session-item-meta\">\n {session.ipAddress && (\n <span className=\"cedros-session-item-ip\">IP: {session.ipAddress}</span>\n )}\n <span className=\"cedros-session-item-created\">\n Started {formatRelativeTime(session.createdAt)}\n </span>\n {isExpiringSoon && <span className=\"cedros-session-expiring\">Expires soon</span>}\n </div>\n </div>\n </li>\n );\n}\n\n// Helper functions\ninterface BrowserInfo {\n browser: string;\n os: string;\n}\n\nfunction parseUserAgent(userAgent?: string): BrowserInfo {\n if (!userAgent) {\n return { browser: 'Unknown browser', os: 'Unknown device' };\n }\n\n // Simple browser detection\n let browser = 'Unknown browser';\n if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) {\n browser = 'Chrome';\n } else if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) {\n browser = 'Safari';\n } else if (userAgent.includes('Firefox')) {\n browser = 'Firefox';\n } else if (userAgent.includes('Edg')) {\n browser = 'Edge';\n }\n\n // Simple OS detection\n let os = 'Unknown device';\n if (userAgent.includes('Windows')) {\n os = 'Windows';\n } else if (userAgent.includes('Mac')) {\n os = 'macOS';\n } else if (userAgent.includes('Linux')) {\n os = 'Linux';\n } else if (userAgent.includes('iPhone') || userAgent.includes('iPad')) {\n os = 'iOS';\n } else if (userAgent.includes('Android')) {\n os = 'Android';\n }\n\n return { browser, os };\n}\n\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / (1000 * 60));\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffMins < 1) {\n return 'just now';\n } else if (diffMins < 60) {\n return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`;\n } else if (diffHours < 24) {\n return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n } else if (diffDays < 7) {\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n } else {\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n}\n\nfunction isSessionExpiringSoon(expiresAt: string): boolean {\n const expires = new Date(expiresAt);\n const now = new Date();\n const hourInMs = 60 * 60 * 1000;\n return expires.getTime() - now.getTime() < hourInMs;\n}\n\n// Icon components\nfunction DeviceIcon({ userAgent }: { userAgent?: string }) {\n const isMobile =\n userAgent?.includes('iPhone') || userAgent?.includes('iPad') || userAgent?.includes('Android');\n\n if (isMobile) {\n return (\n <svg\n className=\"cedros-session-device-icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"12\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n }\n\n return (\n <svg\n className=\"cedros-session-device-icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 21H16\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M12 18V21\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"cedros-session-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8L6 11L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Component to display BIP-39 recovery phrase\n *\n * Shows 12 words in a grid format with copy functionality.\n * Includes security warnings about storing the phrase safely.\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { formatMnemonicForDisplay } from '../../crypto';\n\nexport interface RecoveryPhraseDisplayProps {\n /** Array of 12 mnemonic words */\n words: string[];\n /** Callback when user confirms they've saved the phrase */\n onConfirm: () => void;\n /** Optional class name */\n className?: string;\n}\n\n/**\n * Display recovery phrase with security warnings\n */\nexport function RecoveryPhraseDisplay({\n words,\n onConfirm,\n className = '',\n}: RecoveryPhraseDisplayProps) {\n const [copied, setCopied] = useState(false);\n const [confirmed, setConfirmed] = useState(false);\n const copyTimerRef = useRef<number | null>(null);\n\n const wordGroups = formatMnemonicForDisplay(words);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(words.join(' '));\n setCopied(true);\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n }, [words]);\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n copyTimerRef.current = null;\n }\n };\n }, []);\n\n // COMP-02: The `confirmed` check is defense-in-depth - button is disabled when\n // !confirmed, but check guards against CSS/JS injection enabling the button\n const handleConfirm = useCallback(() => {\n if (confirmed) {\n onConfirm();\n }\n }, [confirmed, onConfirm]);\n\n return (\n <div className={`cedros-recovery-phrase-display ${className}`}>\n <div className=\"cedros-recovery-header\">\n <h3 className=\"cedros-recovery-title\">Recovery Phrase</h3>\n <p className=\"cedros-recovery-warning\">\n Write down these 12 words in order and store them securely. This is the only way to\n recover your wallet if you lose access.\n </p>\n </div>\n\n <div className=\"cedros-recovery-grid\">\n {wordGroups.map((group, groupIndex) => (\n <div key={groupIndex} className=\"cedros-word-group\">\n {group.map((word, wordIndex) => {\n const number = groupIndex * 4 + wordIndex + 1;\n return (\n <div key={number} className=\"cedros-word-item\">\n <span className=\"cedros-word-number\">{number}.</span>\n <span className=\"cedros-word-text\">{word}</span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary cedros-copy-btn\"\n onClick={handleCopy}\n >\n {copied ? 'Copied!' : 'Copy to Clipboard'}\n </button>\n\n <div className=\"cedros-recovery-security\">\n <div className=\"cedros-warning-box\">\n <svg\n className=\"cedros-warning-icon\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10 6v4m0 4h.01M19 10a9 9 0 11-18 0 9 9 0 0118 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <div className=\"cedros-warning-content\">\n <strong>Security Warning</strong>\n <ul>\n <li>Never share this phrase with anyone</li>\n <li>Store it offline in a secure location</li>\n <li>Anyone with this phrase can access your wallet</li>\n <li>Cedros cannot recover this phrase for you</li>\n </ul>\n </div>\n </div>\n </div>\n\n <div className=\"cedros-recovery-confirm\">\n <label className=\"cedros-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={confirmed}\n onChange={(e) => setConfirmed(e.target.checked)}\n className=\"cedros-checkbox\"\n />\n <span>I have written down and securely stored my recovery phrase</span>\n </label>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleConfirm}\n disabled={!confirmed}\n >\n Continue\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Component for entering BIP-39 recovery phrase\n *\n * Provides input fields for 12 words with validation and autocomplete.\n */\n\nimport { useState, useCallback, useId, useRef, useEffect } from 'react';\nimport {\n isValidWord,\n getWordSuggestions,\n parseMnemonicInput,\n isValidMnemonic,\n MNEMONIC_WORD_COUNT,\n} from '../../crypto';\n\nexport interface RecoveryPhraseInputProps {\n /** Callback when valid phrase is entered */\n onSubmit: (words: string[]) => void;\n /** Callback to cancel */\n onCancel?: () => void;\n /** Whether submission is in progress */\n isSubmitting?: boolean;\n /** Error message to display */\n error?: string;\n /** Optional class name */\n className?: string;\n}\n\n/**\n * Input form for recovery phrase\n */\nexport function RecoveryPhraseInput({\n onSubmit,\n onCancel,\n isSubmitting = false,\n error,\n className = '',\n}: RecoveryPhraseInputProps) {\n const [words, setWords] = useState<string[]>(Array(MNEMONIC_WORD_COUNT).fill(''));\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [validationError, setValidationError] = useState<string | null>(null);\n const inputId = useId();\n const suggestionsTimerRef = useRef<number | null>(null);\n\n const handleWordChange = useCallback(\n (index: number, value: string) => {\n const newWords = [...words];\n newWords[index] = value.toLowerCase().trim();\n setWords(newWords);\n\n // Update suggestions\n if (value.length > 0) {\n const newSuggestions = getWordSuggestions(value, 5);\n setSuggestions(newSuggestions);\n } else {\n setSuggestions([]);\n }\n\n // Clear validation error while typing\n setValidationError(null);\n },\n [words]\n );\n\n const handleWordFocus = useCallback((index: number) => {\n setActiveIndex(index);\n setSuggestions([]);\n }, []);\n\n const handleWordBlur = useCallback(\n (index: number) => {\n // Validate word on blur\n const word = words[index];\n if (word && !isValidWord(word)) {\n setValidationError(`Word ${index + 1} is not in the wordlist`);\n }\n\n // Clear suggestions after a delay (allows clicking suggestions)\n if (suggestionsTimerRef.current !== null) {\n window.clearTimeout(suggestionsTimerRef.current);\n }\n suggestionsTimerRef.current = window.setTimeout(() => {\n if (activeIndex === index) {\n setSuggestions([]);\n }\n }, 200);\n },\n [words, activeIndex]\n );\n\n useEffect(() => {\n return () => {\n if (suggestionsTimerRef.current !== null) {\n window.clearTimeout(suggestionsTimerRef.current);\n suggestionsTimerRef.current = null;\n }\n };\n }, []);\n\n const handleSuggestionClick = useCallback(\n (suggestion: string) => {\n if (activeIndex !== null) {\n const newWords = [...words];\n newWords[activeIndex] = suggestion;\n setWords(newWords);\n setSuggestions([]);\n\n // Move to next input\n const nextInput = document.querySelector<HTMLInputElement>(\n `[data-word-index=\"${activeIndex + 1}\"]`\n );\n nextInput?.focus();\n }\n },\n [activeIndex, words]\n );\n\n const handlePaste = useCallback((e: React.ClipboardEvent) => {\n const pastedText = e.clipboardData.getData('text');\n const parsedWords = parseMnemonicInput(pastedText);\n\n if (parsedWords.length === MNEMONIC_WORD_COUNT) {\n e.preventDefault();\n setWords(parsedWords);\n setValidationError(null);\n }\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate all words are filled\n const emptyCount = words.filter((w) => !w).length;\n if (emptyCount > 0) {\n setValidationError(`Please enter all ${MNEMONIC_WORD_COUNT} words`);\n return;\n }\n\n // Validate each word is in wordlist\n const invalidWords = words\n .map((w, i) => ({ word: w, index: i + 1 }))\n .filter(({ word }) => !isValidWord(word));\n\n if (invalidWords.length > 0) {\n setValidationError(`Invalid words: ${invalidWords.map((w) => `#${w.index}`).join(', ')}`);\n return;\n }\n\n // Validate checksum\n if (!isValidMnemonic(words)) {\n setValidationError('Invalid recovery phrase - please check your words');\n return;\n }\n\n onSubmit(words);\n },\n [words, onSubmit]\n );\n\n const displayError = error || validationError;\n\n return (\n <form\n className={`cedros-recovery-phrase-input ${className}`}\n onSubmit={handleSubmit}\n onPaste={handlePaste}\n >\n <div className=\"cedros-recovery-input-header\">\n <h3 className=\"cedros-recovery-input-title\">Enter Recovery Phrase</h3>\n <p className=\"cedros-recovery-input-description\">\n Enter your 12-word recovery phrase. You can paste the entire phrase at once.\n </p>\n </div>\n\n <div className=\"cedros-word-inputs\">\n {Array.from({ length: MNEMONIC_WORD_COUNT }, (_, index) => (\n <div key={index} className=\"cedros-word-input-wrapper\">\n <label className=\"cedros-word-label\">{index + 1}.</label>\n <input\n type=\"text\"\n className={`cedros-word-input ${\n words[index] && !isValidWord(words[index])\n ? 'cedros-word-invalid'\n : words[index] && isValidWord(words[index])\n ? 'cedros-word-valid'\n : ''\n }`}\n value={words[index]}\n onChange={(e) => handleWordChange(index, e.target.value)}\n onFocus={() => handleWordFocus(index)}\n onBlur={() => handleWordBlur(index)}\n data-word-index={index}\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n spellCheck={false}\n disabled={isSubmitting}\n aria-label={`Word ${index + 1}`}\n />\n </div>\n ))}\n </div>\n\n {activeIndex !== null && suggestions.length > 0 && (\n <div className=\"cedros-suggestions\" role=\"listbox\" id={`${inputId}-suggestions`}>\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"cedros-suggestion\"\n onClick={() => handleSuggestionClick(suggestion)}\n role=\"option\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n\n {displayError && (\n <p className=\"cedros-input-error\" role=\"alert\">\n {displayError}\n </p>\n )}\n\n <div className=\"cedros-recovery-input-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n Cancel\n </button>\n )}\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Recovering...' : 'Recover Wallet'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Component to display warnings about missing crypto capabilities\n */\n\nimport { getMissingCapabilitiesMessage, getBrowserSupportInfo } from '../../crypto';\nimport type { CryptoCapabilities } from '../../crypto';\n\nexport interface CapabilityWarningProps {\n /** Capability check results */\n capabilities: CryptoCapabilities;\n /** Optional class name */\n className?: string;\n}\n\n/**\n * Warning display for missing capabilities\n */\nexport function CapabilityWarning({ capabilities, className = '' }: CapabilityWarningProps) {\n if (capabilities.allSupported) {\n return null;\n }\n\n const message = getMissingCapabilitiesMessage(capabilities);\n const browserInfo = getBrowserSupportInfo();\n\n return (\n <div className={`cedros-capability-warning ${className}`} role=\"alert\">\n <div className=\"cedros-warning-header\">\n <svg\n className=\"cedros-warning-icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 9v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <h3 className=\"cedros-warning-title\">Wallet Feature Unavailable</h3>\n </div>\n\n <p className=\"cedros-warning-message\">{message}</p>\n\n <div className=\"cedros-capability-details\">\n <h4>Browser Compatibility</h4>\n <p>\n Detected: {browserInfo.browser} {browserInfo.version}\n {browserInfo.likelySupported ? ' (likely supported)' : ' (may not be supported)'}\n </p>\n\n <h4>Required Features</h4>\n <ul className=\"cedros-capability-list\">\n <li className={capabilities.webCrypto ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n Web Crypto API: {capabilities.webCrypto ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.aesGcm ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n AES-GCM Encryption: {capabilities.aesGcm ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.hkdf ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n HKDF Key Derivation: {capabilities.hkdf ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.webAuthn ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n WebAuthn/Passkeys: {capabilities.webAuthn ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.webAuthnPrf ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n WebAuthn PRF Extension: {capabilities.webAuthnPrf ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.argon2 ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n Argon2 Password Hashing: {capabilities.argon2 ? 'Available' : 'Missing'}\n </li>\n </ul>\n </div>\n\n <div className=\"cedros-capability-help\">\n <h4>Recommended Browsers</h4>\n <ul>\n <li>Chrome 116+ on Windows, macOS, or Android</li>\n <li>Safari 17+ on macOS or iOS</li>\n <li>Edge 116+ on Windows</li>\n </ul>\n <p className=\"cedros-capability-note\">\n A platform authenticator (Touch ID, Face ID, or Windows Hello) is required.\n </p>\n </div>\n </div>\n );\n}\n","/**\n * Hook to fetch wallet discovery config from server\n *\n * Fetches wallet configuration from the discovery endpoint to determine\n * recovery mode and other wallet settings.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient } from '../utils/apiClient';\nimport type { WalletDiscoveryConfig, WalletRecoveryMode } from '../types/wallet';\n\n/** Discovery endpoint response */\ninterface DiscoveryResponse {\n wallet?: {\n enabled: boolean;\n recoveryMode: string;\n unlockTtlSeconds: number;\n };\n}\n\nconst VALID_RECOVERY_MODES: WalletRecoveryMode[] = ['share_c_only', 'full_seed', 'none'];\n\nfunction normalizeRecoveryMode(mode: string | undefined): WalletRecoveryMode {\n if (!mode) return 'share_c_only';\n return VALID_RECOVERY_MODES.includes(mode as WalletRecoveryMode)\n ? (mode as WalletRecoveryMode)\n : 'share_c_only';\n}\n\n/** Return type for useWalletDiscovery hook */\nexport interface UseWalletDiscoveryReturn {\n /** Whether wallet feature is enabled on server */\n walletEnabled: boolean;\n /** Recovery mode: share_c_only or full_seed */\n recoveryMode: WalletRecoveryMode;\n /** Session unlock TTL in seconds */\n unlockTtlSeconds: number;\n /** Whether config is still loading */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n /** Refetch the config */\n refetch: () => Promise<void>;\n}\n\n/** Default return value when outside provider context */\nconst DEFAULT_RETURN: UseWalletDiscoveryReturn = {\n walletEnabled: false,\n recoveryMode: 'share_c_only',\n unlockTtlSeconds: 900,\n isLoading: false,\n error: null,\n refetch: async () => {},\n};\n\n/**\n * Hook to fetch wallet discovery configuration from server\n *\n * Automatically fetches on mount and caches the result.\n * Default values are used if fetch fails or wallet is not enabled.\n * Returns defaults when used outside CedrosLoginProvider.\n */\nexport function useWalletDiscovery(): UseWalletDiscoveryReturn {\n const context = useCedrosLoginOptional();\n\n const [walletConfig, setWalletConfig] = useState<WalletDiscoveryConfig | null>(null);\n const [isLoading, setIsLoading] = useState(!!context);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n });\n }, [context]);\n\n const fetchConfig = useCallback(async () => {\n if (!apiClient) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.get<DiscoveryResponse>('/discovery');\n\n if (response.wallet) {\n setWalletConfig({\n enabled: response.wallet.enabled,\n recoveryMode: normalizeRecoveryMode(response.wallet.recoveryMode),\n unlockTtlSeconds: response.wallet.unlockTtlSeconds,\n });\n } else {\n // Wallet not configured on server\n setWalletConfig({\n enabled: false,\n recoveryMode: 'share_c_only',\n unlockTtlSeconds: 900,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch wallet config';\n setError(message);\n // Use defaults on error\n setWalletConfig({\n enabled: false,\n recoveryMode: 'share_c_only',\n unlockTtlSeconds: 900,\n });\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n useEffect(() => {\n if (apiClient) {\n fetchConfig();\n }\n }, [apiClient, fetchConfig]);\n\n // Return defaults when outside provider\n if (!context) {\n return DEFAULT_RETURN;\n }\n\n return {\n walletEnabled: walletConfig?.enabled ?? false,\n recoveryMode: walletConfig?.recoveryMode ?? 'share_c_only',\n unlockTtlSeconds: walletConfig?.unlockTtlSeconds ?? 900,\n isLoading,\n error,\n refetch: fetchConfig,\n };\n}\n","/**\n * Hook for wallet enrollment flow (server-side signing)\n *\n * Orchestrates the complete enrollment process:\n * 1. Generate 32-byte seed\n * 2. Split into 3 Shamir shares\n * 3. Encrypt Share A with password/PIN or passkey PRF\n * 4. Derive Solana public key from seed\n * 5. Upload encrypted Share A + plaintext Share B to server\n * 6. Display recovery phrase (Share C or full seed based on config)\n *\n * Recovery modes:\n * - share_c_only: User gets Share C. Recovery within app only (not portable).\n * - full_seed: User gets full seed. Can use wallet elsewhere (portable).\n *\n * Share B is sent as plaintext (SSS math protects it - 1 share reveals nothing).\n * Passkey PRF is used only for passkey auth method. Server combines shares for signing.\n *\n * H-03: Security Note - Recovery Phrase Visibility\n * The recovery phrase is stored in React state during the 'showing_recovery' step.\n * This is intentional - the user MUST see the phrase to back it up. The phrase:\n * - Is visible in React DevTools during enrollment\n * - Is cleared from state when the component unmounts or enrollment completes\n * - Byte arrays (seed, shares) are securely wiped via sensitiveData ref\n * - String mnemonics cannot be securely wiped (JS string immutability)\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport {\n generateSeed,\n generateArgon2Salt,\n generatePrfSalt,\n splitSecret,\n argon2DeriveInWorker,\n aesGcmEncryptToBase64,\n uint8ArrayToBase64,\n authenticateWithDiscoverablePrf,\n registerPasskeyWithPrf,\n deriveKeyFromPrf,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n seedToMnemonic,\n shareToMnemonic,\n wipeAll,\n toEncryptionKey,\n toShamirShare,\n DEFAULT_KDF_PARAMS,\n} from '../crypto';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport { useWalletDiscovery } from './useWalletDiscovery';\nimport type {\n UseWalletEnrollmentReturn,\n EnrollmentState,\n WalletEnrollRequest,\n ShareAAuthMethod,\n} from '../types/wallet';\n\n/**\n * Hook for wallet enrollment\n *\n * Supports auth methods:\n * - password: User sets a wallet password (Argon2id KDF)\n * - passkey: Uses passkey PRF extension\n */\nexport function useWalletEnrollment(): UseWalletEnrollmentReturn {\n const { user } = useCedrosLogin();\n const { enroll } = useWalletMaterial();\n const { recoveryMode } = useWalletDiscovery();\n\n const [state, setState] = useState<EnrollmentState>({ step: 'idle' });\n const [isEnrolling, setIsEnrolling] = useState(false);\n\n // Store sensitive data for cleanup\n const sensitiveData = useRef<Uint8Array[]>([]);\n\n const cleanup = useCallback(() => {\n wipeAll(...sensitiveData.current);\n sensitiveData.current = [];\n }, []);\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n /**\n * Core enrollment logic shared by all auth methods\n */\n const doEnrollment = useCallback(\n async (\n authMethod: ShareAAuthMethod,\n encryptionKey: Uint8Array,\n kdfSalt?: Uint8Array,\n prfSalt?: string\n ): Promise<void> => {\n // Step 1: Generate seed\n setState({ step: 'generating_seed' });\n const seed = generateSeed();\n sensitiveData.current.push(seed);\n\n // Step 2: Split into shares\n setState({ step: 'splitting_shares' });\n const { shareA, shareB, shareC } = splitSecret(seed);\n sensitiveData.current.push(shareA, shareB, shareC);\n\n // Step 3: Encrypt Share A\n setState({ step: 'encrypting_shares' });\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(encryptionKey));\n\n // Step 4: Derive Solana public key\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 5: Upload to server\n setState({ step: 'uploading' });\n\n const request: WalletEnrollRequest = {\n solanaPubkey,\n shareAAuthMethod: authMethod,\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n // Share B is now plaintext (SSS math protects it)\n shareB: uint8ArrayToBase64(shareB),\n };\n\n // Add auth-method-specific fields\n if (authMethod === 'password') {\n if (!kdfSalt) throw new Error('KDF salt required for password method');\n request.shareAKdfSalt = uint8ArrayToBase64(kdfSalt);\n request.shareAKdfParams = DEFAULT_KDF_PARAMS;\n }\n\n if (authMethod === 'passkey' && prfSalt) {\n request.prfSalt = prfSalt;\n }\n\n await enroll(request);\n\n // Step 6: Show recovery phrase based on recovery mode\n // - share_c_only: Show Share C (app-locked, not portable)\n // - full_seed: Show full seed (portable to other wallets)\n // - none: Skip recovery phrase entirely (Privacy Cash mode)\n if (recoveryMode === 'none') {\n // No recovery option - go straight to complete\n cleanup();\n setState({\n step: 'complete',\n solanaPubkey,\n });\n } else {\n const recoveryPhrase =\n recoveryMode === 'full_seed'\n ? seedToMnemonic(seed)\n : shareToMnemonic(toShamirShare(shareC));\n\n setState({\n step: 'showing_recovery',\n recoveryPhrase,\n solanaPubkey,\n });\n }\n },\n [enroll, recoveryMode, cleanup]\n );\n\n /**\n * Start enrollment with password (email users)\n * Uses user's login password for Share A encryption\n */\n const startEnrollmentWithPassword = useCallback(\n async (password: string): Promise<void> => {\n if (!user) {\n setState({ step: 'error', error: 'User not authenticated' });\n return;\n }\n\n setIsEnrolling(true);\n cleanup();\n\n try {\n // Derive key from password using Argon2id\n const salt = generateArgon2Salt();\n const key = await argon2DeriveInWorker(password, salt, DEFAULT_KDF_PARAMS);\n sensitiveData.current.push(key);\n\n await doEnrollment('password', key, salt);\n } catch (err) {\n setState({\n step: 'error',\n error: err instanceof Error ? err.message : 'Enrollment failed',\n });\n } finally {\n setIsEnrolling(false);\n }\n },\n [user, cleanup, doEnrollment]\n );\n\n /**\n * Start enrollment with passkey PRF\n * Uses WebAuthn PRF extension for Share A encryption\n */\n const startEnrollmentWithPasskey = useCallback(async (): Promise<void> => {\n if (!user) {\n setState({ step: 'error', error: 'User not authenticated' });\n return;\n }\n\n setIsEnrolling(true);\n cleanup();\n\n try {\n // Generate PRF salt\n const prfSalt = generatePrfSalt();\n const prfSaltBase64 = uint8ArrayToBase64(prfSalt);\n\n // Register passkey with PRF; fallback to authenticate if credential exists\n setState({ step: 'registering_passkey' });\n let prfOutput: Uint8Array;\n try {\n const userIdBytes = new TextEncoder().encode(user.id);\n const displayName = user.name ?? user.email ?? 'User';\n const userName = user.email ?? user.id;\n const registration = await registerPasskeyWithPrf(\n userIdBytes,\n userName,\n displayName,\n prfSalt\n );\n prfOutput = registration.prfOutput;\n } catch (err) {\n const error = err as DOMException;\n if (error?.name !== 'InvalidStateError') {\n throw err;\n }\n const prfResult = await authenticateWithDiscoverablePrf(prfSaltBase64);\n prfOutput = prfResult.prfOutput;\n }\n sensitiveData.current.push(prfOutput);\n\n // Derive key from PRF output\n const key = await deriveKeyFromPrf(prfOutput, prfSalt);\n sensitiveData.current.push(key);\n\n await doEnrollment('passkey', key, undefined, prfSaltBase64);\n } catch (err) {\n setState({\n step: 'error',\n error: err instanceof Error ? err.message : 'Enrollment failed',\n });\n } finally {\n setIsEnrolling(false);\n }\n }, [user, cleanup, doEnrollment]);\n\n const confirmRecoveryPhrase = useCallback(() => {\n // User confirmed they saved the recovery phrase\n const solanaPubkey = state.solanaPubkey;\n cleanup();\n\n setState({\n step: 'complete',\n solanaPubkey,\n });\n }, [state.solanaPubkey, cleanup]);\n\n const cancel = useCallback(() => {\n cleanup();\n setState({ step: 'idle' });\n setIsEnrolling(false);\n }, [cleanup]);\n\n return {\n state,\n startEnrollmentWithPassword,\n startEnrollmentWithPasskey,\n confirmRecoveryPhrase,\n cancel,\n isEnrolling,\n };\n}\n","/**\n * Wallet enrollment wizard component (server-side signing)\n *\n * Guides user through the complete wallet enrollment process:\n * 1. Choose authentication method (password/passkey)\n * 2. Enter credentials for Share A encryption\n * 3. Display and confirm recovery phrase\n *\n * Share B is stored as plaintext on the server (SSS math protects it).\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useCedrosLogin } from '../../context/useCedrosLogin';\nimport { useWalletEnrollment } from '../../hooks/useWalletEnrollment';\nimport { PasswordInput } from '../email/PasswordInput';\nimport { RecoveryPhraseDisplay } from './RecoveryPhraseDisplay';\nimport type { ShareAAuthMethod } from '../../types/wallet';\n\nexport interface WalletEnrollmentProps {\n /** Callback when enrollment completes */\n onComplete?: (solanaPubkey: string) => void;\n /** Callback to cancel enrollment */\n onCancel?: () => void;\n /** Optional class name */\n className?: string;\n /** Force a specific auth method (otherwise auto-detected) */\n forceAuthMethod?: ShareAAuthMethod;\n}\n\n/**\n * Wallet enrollment wizard\n */\nexport function WalletEnrollment({\n onComplete,\n onCancel,\n className = '',\n forceAuthMethod,\n}: WalletEnrollmentProps) {\n const { user } = useCedrosLogin();\n const {\n state,\n startEnrollmentWithPassword,\n startEnrollmentWithPasskey,\n confirmRecoveryPhrase,\n cancel,\n isEnrolling,\n } = useWalletEnrollment();\n\n // Determine default auth method based on user type\n const getDefaultAuthMethod = (): ShareAAuthMethod => {\n if (forceAuthMethod) return forceAuthMethod;\n return 'password';\n };\n\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod>(getDefaultAuthMethod);\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [passwordError, setPasswordError] = useState<string | null>(null);\n\n // MAINT-02: Update authMethod when user changes (e.g., different login)\n useEffect(() => {\n setAuthMethod(getDefaultAuthMethod());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id, forceAuthMethod]);\n\n const handlePasswordSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate passwords match\n if (password !== confirmPassword) {\n setPasswordError('Passwords do not match');\n return;\n }\n\n // Validate password strength (minimum 8 characters)\n if (password.length < 8) {\n setPasswordError('Password must be at least 8 characters');\n return;\n }\n\n setPasswordError(null);\n await startEnrollmentWithPassword(password);\n },\n [password, confirmPassword, startEnrollmentWithPassword]\n );\n\n const handlePasskeySubmit = useCallback(async () => {\n await startEnrollmentWithPasskey();\n }, [startEnrollmentWithPasskey]);\n\n const handleRecoveryConfirm = useCallback(() => {\n confirmRecoveryPhrase();\n if (state.solanaPubkey) {\n onComplete?.(state.solanaPubkey);\n }\n }, [confirmRecoveryPhrase, state.solanaPubkey, onComplete]);\n\n const handleCancel = useCallback(() => {\n cancel();\n onCancel?.();\n }, [cancel, onCancel]);\n\n // Show loading/progress indicator during enrollment steps\n // A11Y-03: aria-busy indicates async operation in progress\n if (state.step === 'generating_seed' || state.step === 'splitting_shares') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-spinner\" aria-hidden=\"true\" />\n <p>Generating secure wallet...</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'encrypting_shares') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-spinner\" aria-hidden=\"true\" />\n <p>Encrypting wallet shares...</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'registering_passkey') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-passkey-prompt\">\n <svg\n className=\"cedros-passkey-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"8\"\n y=\"16\"\n width=\"32\"\n height=\"24\"\n rx=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n <circle cx=\"24\" cy=\"28\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 32v4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n <h3>Authenticate with Passkey</h3>\n <p>Follow your browser's prompt to use your passkey.</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (state.step === 'uploading') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-spinner\" aria-hidden=\"true\" />\n <p>Saving wallet...</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'showing_recovery' && state.recoveryPhrase) {\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <RecoveryPhraseDisplay words={state.recoveryPhrase} onConfirm={handleRecoveryConfirm} />\n </div>\n );\n }\n\n if (state.step === 'complete') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <div className=\"cedros-enrollment-complete\">\n <svg\n className=\"cedros-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"20\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M16 24l6 6 12-12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3>Wallet Created!</h3>\n <p className=\"cedros-pubkey\">\n <strong>Address:</strong> {state.solanaPubkey}\n </p>\n <p>Your non-custodial Solana wallet is ready to use.</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'error') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <div className=\"cedros-enrollment-error\">\n <svg\n className=\"cedros-error-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"20\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M24 16v12m0 6h.01\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <h3>Enrollment Failed</h3>\n <p className=\"cedros-error-message\">{state.error}</p>\n <div className=\"cedros-error-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={() => cancel()}\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Default: credential entry form\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <div className=\"cedros-enrollment-header\">\n <h2>Create Wallet</h2>\n <p>Secure your wallet with a {authMethod === 'passkey' ? 'passkey' : 'password'}.</p>\n </div>\n\n {/* Auth method selector (only show if not forced) */}\n {!forceAuthMethod && (\n <div className=\"cedros-auth-method-selector\">\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"password\"\n checked={authMethod === 'password'}\n onChange={() => setAuthMethod('password')}\n disabled={isEnrolling}\n />\n <span>Password</span>\n </label>\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"passkey\"\n checked={authMethod === 'passkey'}\n onChange={() => setAuthMethod('passkey')}\n disabled={isEnrolling}\n />\n <span>Passkey</span>\n </label>\n </div>\n )}\n\n {/* Password form */}\n {authMethod === 'password' && (\n <form onSubmit={handlePasswordSubmit} className=\"cedros-enrollment-form\">\n <PasswordInput\n label=\"Password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n showStrengthMeter\n disabled={isEnrolling}\n required\n minLength={8}\n placeholder=\"Enter a strong password\"\n />\n\n <PasswordInput\n label=\"Confirm Password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n error={passwordError ?? undefined}\n disabled={isEnrolling}\n required\n minLength={8}\n placeholder=\"Confirm your password\"\n />\n\n <div className=\"cedros-password-info\">\n <p>This password will be used to sign transactions.</p>\n </div>\n\n <div className=\"cedros-enrollment-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n disabled={isEnrolling}\n >\n Cancel\n </button>\n )}\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isEnrolling || !password || !confirmPassword}\n >\n {isEnrolling ? 'Creating...' : 'Continue'}\n </button>\n </div>\n </form>\n )}\n\n {/* Passkey form */}\n {authMethod === 'passkey' && (\n <div className=\"cedros-enrollment-form\">\n <div className=\"cedros-passkey-info\">\n <svg\n className=\"cedros-passkey-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"8\"\n y=\"16\"\n width=\"32\"\n height=\"24\"\n rx=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n <circle cx=\"24\" cy=\"28\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 32v4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n <p>Use your passkey (Touch ID, Face ID, or Windows Hello) to secure your wallet.</p>\n <p>You'll use the same passkey to sign transactions.</p>\n </div>\n\n <div className=\"cedros-enrollment-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n disabled={isEnrolling}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handlePasskeySubmit}\n disabled={isEnrolling}\n >\n {isEnrolling ? 'Creating...' : 'Use Passkey'}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Hook for wallet transaction signing (server-side signing)\n *\n * Signing happens server-side:\n * - User provides unlock credential (password/PIN/passkey PRF)\n * - Server decrypts Share A, combines with Share B, signs, wipes\n * - Client just sends credential and transaction, receives signature\n */\n\nimport { useState, useCallback } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport { authenticateWithDiscoverablePrf, base64ToUint8Array, uint8ArrayToBase64 } from '../crypto';\nimport type { UseWalletSigningReturn, UnlockCredential } from '../types/wallet';\nimport { toCredentialRequest } from '../utils/unlockCredential';\n\n/**\n * Hook for wallet transaction signing\n *\n * Usage:\n * ```tsx\n * const { signTransaction, isSigning, error } = useWalletSigning();\n *\n * // Sign with password\n * const signature = await signTransaction(txBytes, { type: 'password', password: 'xxx' });\n *\n * // Sign with PIN\n * const signature = await signTransaction(txBytes, { type: 'password', password: 'secret' });\n *\n * // Sign with passkey (PRF)\n * const signature = await signTransaction(txBytes, { type: 'prfOutput', prfOutput: 'base64...' });\n * ```\n */\nexport function useWalletSigning(): UseWalletSigningReturn {\n const { user } = useCedrosLogin();\n const { signTransaction: apiSignTransaction } = useWalletMaterial();\n\n const [isSigning, setIsSigning] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Sign a transaction with the wallet\n *\n * @param transaction - Transaction bytes to sign\n * @param credential - Unlock credential (password, PIN, or PRF output)\n * @returns Ed25519 signature (64 bytes)\n */\n const signTransaction = useCallback(\n async (transaction: Uint8Array, credential?: UnlockCredential): Promise<Uint8Array> => {\n if (!user) {\n const msg = 'User not authenticated';\n setError(msg);\n throw new Error(msg);\n }\n\n setIsSigning(true);\n setError(null);\n\n try {\n const request = {\n transaction: uint8ArrayToBase64(transaction),\n ...(credential ? { credential: toCredentialRequest(credential) } : {}),\n };\n\n const response = await apiSignTransaction(request);\n\n // Decode signature from base64\n return base64ToUint8Array(response.signature);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Signing failed';\n setError(msg);\n throw err;\n } finally {\n setIsSigning(false);\n }\n },\n [user, apiSignTransaction]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n signTransaction,\n isSigning,\n error,\n clearError,\n };\n}\n\n/**\n * Helper hook to get PRF output for passkey signing\n *\n * This handles the WebAuthn PRF flow and returns a credential\n * that can be used with useWalletSigning.\n */\nexport function usePasskeySigning() {\n const { getMaterial } = useWalletMaterial();\n const [isAuthenticating, setIsAuthenticating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Get PRF output from passkey for wallet signing\n *\n * @returns UnlockCredential with PRF output, or null if cancelled\n */\n const getPasskeyCredential = useCallback(async (): Promise<UnlockCredential | null> => {\n setIsAuthenticating(true);\n setError(null);\n\n try {\n // Get wallet material to get PRF salt\n const material = await getMaterial();\n if (!material) {\n throw new Error('No wallet enrolled');\n }\n\n if (material.shareAAuthMethod !== 'passkey') {\n throw new Error('Wallet is not configured for passkey authentication');\n }\n\n if (!material.prfSalt) {\n throw new Error('No PRF salt configured for wallet');\n }\n\n // Authenticate with passkey and get PRF output\n const result = await authenticateWithDiscoverablePrf(material.prfSalt);\n\n return {\n type: 'prfOutput',\n prfOutput: uint8ArrayToBase64(result.prfOutput),\n };\n } catch (err) {\n // User cancelled or error occurred\n const msg = err instanceof Error ? err.message : 'Passkey authentication failed';\n setError(msg);\n return null;\n } finally {\n setIsAuthenticating(false);\n }\n }, [getMaterial]);\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n getPasskeyCredential,\n isAuthenticating,\n error,\n clearError,\n };\n}\n","/**\n * Passkey prompt component for WebAuthn interactions\n *\n * Provides visual feedback during WebAuthn ceremonies:\n * - Registration of new passkeys\n * - Authentication with existing passkeys\n * - PRF extension operations\n */\n\nimport { useCallback } from 'react';\n\nexport interface PasskeyPromptProps {\n /** Type of WebAuthn operation */\n mode: 'register' | 'authenticate';\n /** Whether the operation is in progress */\n isLoading?: boolean;\n /** Error message if operation failed */\n error?: string;\n /** Callback to trigger the operation */\n onPrompt?: () => void;\n /** Callback to retry after error */\n onRetry?: () => void;\n /** Callback to cancel the operation */\n onCancel?: () => void;\n /** Optional custom title */\n title?: string;\n /** Optional custom description */\n description?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * WebAuthn passkey interaction prompt\n *\n * Displays appropriate UI and messaging for passkey operations.\n */\nexport function PasskeyPrompt({\n mode,\n isLoading = false,\n error,\n onPrompt,\n onRetry,\n onCancel,\n title,\n description,\n className = '',\n}: PasskeyPromptProps) {\n const handlePrompt = useCallback(() => {\n if (!isLoading) {\n onPrompt?.();\n }\n }, [isLoading, onPrompt]);\n\n const handleRetry = useCallback(() => {\n onRetry?.();\n }, [onRetry]);\n\n const defaultTitle = mode === 'register' ? 'Set Up Passkey' : 'Verify with Passkey';\n\n const defaultDescription =\n mode === 'register'\n ? 'Create a passkey to securely encrypt your wallet on this device. You will use your fingerprint, face, or device PIN.'\n : 'Use your passkey to unlock your wallet. You will be prompted for biometric verification.';\n\n return (\n <div className={`cedros-passkey-prompt ${className}`}>\n <div className=\"cedros-passkey-icon\">\n {isLoading ? <LoadingSpinner /> : error ? <ErrorIcon /> : <PasskeyIcon />}\n </div>\n\n <h3 className=\"cedros-passkey-title\">{title ?? defaultTitle}</h3>\n\n <p className=\"cedros-passkey-description\">{description ?? defaultDescription}</p>\n\n {error && (\n <div className=\"cedros-passkey-error\" role=\"alert\">\n <p>{error}</p>\n </div>\n )}\n\n <div className=\"cedros-passkey-actions\">\n {error ? (\n <>\n {onRetry && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n )}\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n </>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handlePrompt}\n disabled={isLoading}\n >\n {isLoading ? (\n <>\n <span className=\"cedros-button-spinner\" aria-hidden=\"true\" />\n Waiting for passkey...\n </>\n ) : mode === 'register' ? (\n 'Create Passkey'\n ) : (\n 'Use Passkey'\n )}\n </button>\n {onCancel && !isLoading && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n </>\n )}\n </div>\n\n {isLoading && (\n <p className=\"cedros-passkey-hint\">\n Follow the prompts on your device to {mode === 'register' ? 'create' : 'verify'} your\n passkey.\n </p>\n )}\n </div>\n );\n}\n\n/** Fingerprint icon for passkey */\nfunction PasskeyIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n <path d=\"M2 12a10 10 0 0 1 18-6\" />\n <path d=\"M2 16h.01\" />\n <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n <path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" />\n <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n <path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" />\n </svg>\n );\n}\n\n/** Loading spinner icon */\nfunction LoadingSpinner() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"cedros-spinner\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.25\" />\n <path d=\"M12 3a9 9 0 0 1 9 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\n/** Error icon */\nfunction ErrorIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" />\n </svg>\n );\n}\n","/**\n * Wallet unlock component (v2 - server-side signing)\n *\n * Provides the UI for unlocking an enrolled wallet.\n * User enters their credential (password or passkey),\n * server validates and caches the derived key for session signing.\n *\n * No client-side share reconstruction - server handles everything.\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { FormEvent } from 'react';\nimport { useWalletMaterial } from '../../hooks/useWalletMaterial';\nimport { usePasskeySigning } from '../../hooks/useWalletSigning';\nimport { useCedrosLogin } from '../../context/useCedrosLogin';\nimport { PasskeyPrompt } from './PasskeyPrompt';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { PasswordInput } from '../email/PasswordInput';\nimport type { ShareAAuthMethod, UnlockCredential } from '../../types/wallet';\n\nexport interface WalletUnlockProps {\n /** Callback when wallet is successfully unlocked */\n onUnlock?: () => void;\n /** Callback when unlock is cancelled */\n onCancel?: () => void;\n /** Whether to show the cancel button */\n showCancel?: boolean;\n /** The wallet's auth method (if known) */\n authMethod?: ShareAAuthMethod;\n /** Additional CSS classes */\n className?: string;\n}\n\ntype UnlockPhase = 'idle' | 'credential' | 'unlocking' | 'unlocked' | 'error';\n\n/**\n * Wallet unlock form\n *\n * Simple single-credential flow:\n * - Password users: Enter password\n * - Passkey users: Authenticate with passkey\n *\n * Server validates credential and caches derived key for session signing.\n */\nexport function WalletUnlock({\n onUnlock,\n onCancel,\n showCancel = true,\n authMethod: propAuthMethod,\n className = '',\n}: WalletUnlockProps) {\n useCedrosLogin(); // Ensure user is authenticated\n const { unlock, getMaterial, isLoading } = useWalletMaterial();\n const { getPasskeyCredential, isAuthenticating } = usePasskeySigning();\n\n const [phase, setPhase] = useState<UnlockPhase>('idle');\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod | null>(propAuthMethod ?? null);\n const [credential, setCredential] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // MAINT-01: Sync authMethod state when prop changes\n useEffect(() => {\n if (propAuthMethod !== undefined) {\n setAuthMethod(propAuthMethod);\n }\n }, [propAuthMethod]);\n\n // Determine credential type based on auth method\n const isPasswordAuth = authMethod === 'password';\n const isPasskeyAuth = authMethod === 'passkey';\n\n // Start the unlock flow - fetch material to get auth method\n const startUnlock = useCallback(async () => {\n setPhase('credential');\n setError(null);\n\n if (!authMethod) {\n try {\n const material = await getMaterial();\n if (material) {\n setAuthMethod(material.shareAAuthMethod);\n } else {\n setError('No wallet enrolled');\n setPhase('error');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to get wallet info');\n setPhase('error');\n }\n }\n }, [authMethod, getMaterial]);\n\n // Handle credential submission\n const handleSubmit = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n setPhase('unlocking');\n\n try {\n let unlockCredential: UnlockCredential;\n\n if (isPasswordAuth) {\n unlockCredential = { type: 'password', password: credential };\n } else {\n throw new Error('Invalid auth method');\n }\n\n await unlock(unlockCredential);\n setPhase('unlocked');\n onUnlock?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to unlock wallet');\n setPhase('error');\n }\n },\n [isPasswordAuth, credential, unlock, onUnlock]\n );\n\n // Handle passkey authentication\n const handlePasskeyUnlock = useCallback(async () => {\n setError(null);\n setPhase('unlocking');\n\n try {\n const passkeyCredential = await getPasskeyCredential();\n if (!passkeyCredential) {\n setPhase('credential');\n return;\n }\n\n await unlock(passkeyCredential);\n setPhase('unlocked');\n onUnlock?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to unlock wallet');\n setPhase('error');\n }\n }, [getPasskeyCredential, unlock, onUnlock]);\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n setCredential('');\n setPhase('idle');\n setError(null);\n onCancel?.();\n }, [onCancel]);\n\n // Retry from error state\n const handleRetry = useCallback(() => {\n setCredential('');\n setPhase('credential');\n setError(null);\n }, []);\n\n const isProcessing = isLoading || isAuthenticating;\n\n // Render based on phase\n const renderContent = () => {\n switch (phase) {\n case 'idle':\n return (\n <div className=\"cedros-wallet-unlock-idle\">\n <div className=\"cedros-wallet-unlock-icon\">\n <LockIcon />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Wallet Locked</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Unlock your wallet to sign transactions.\n </p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={startUnlock}\n >\n Unlock Wallet\n </button>\n </div>\n );\n\n case 'credential':\n // Password form\n if (isPasswordAuth) {\n return (\n <form className=\"cedros-wallet-unlock-form\" onSubmit={handleSubmit}>\n <h3 className=\"cedros-wallet-unlock-title\">Enter Password</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Enter your wallet password to unlock.\n </p>\n\n <PasswordInput\n label=\"Password\"\n value={credential}\n onChange={(e) => setCredential(e.target.value)}\n disabled={isProcessing}\n autoComplete=\"current-password\"\n error={error ?? undefined}\n />\n\n <div className=\"cedros-wallet-unlock-actions\">\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isProcessing || credential.length === 0}\n >\n {isProcessing ? 'Unlocking...' : 'Unlock'}\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n disabled={isProcessing}\n >\n Cancel\n </button>\n )}\n </div>\n </form>\n );\n }\n\n // Passkey authentication\n if (isPasskeyAuth) {\n return (\n <div className=\"cedros-wallet-unlock-passkey\">\n <h3 className=\"cedros-wallet-unlock-title\">Verify with Passkey</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Use your passkey to unlock your wallet.\n </p>\n\n <PasskeyPrompt\n mode=\"authenticate\"\n isLoading={isProcessing}\n error={error ?? undefined}\n onPrompt={handlePasskeyUnlock}\n onRetry={handlePasskeyUnlock}\n onCancel={showCancel ? handleCancel : undefined}\n />\n </div>\n );\n }\n\n // Loading auth method\n return (\n <div className=\"cedros-wallet-unlock-loading\">\n <LoadingSpinner size=\"xl\" />\n <p>Loading wallet info...</p>\n </div>\n );\n\n case 'unlocking':\n return (\n <div className=\"cedros-wallet-unlock-progress\">\n <div className=\"cedros-wallet-unlock-icon\">\n <LoadingSpinner size=\"xl\" />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Unlocking Wallet</h3>\n <p className=\"cedros-wallet-unlock-description\">Verifying your credentials...</p>\n </div>\n );\n\n case 'unlocked':\n return (\n <div className=\"cedros-wallet-unlock-success\">\n <div className=\"cedros-wallet-unlock-icon\">\n <SuccessIcon />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Wallet Unlocked</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Your wallet is ready to sign transactions.\n </p>\n </div>\n );\n\n case 'error':\n return (\n <div className=\"cedros-wallet-unlock-error\">\n <div className=\"cedros-wallet-unlock-icon\">\n <ErrorIcon />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Unlock Failed</h3>\n <p className=\"cedros-wallet-unlock-description\">\n {error ?? 'Failed to unlock wallet. Please try again.'}\n </p>\n <div className=\"cedros-wallet-unlock-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n )}\n </div>\n </div>\n );\n }\n };\n\n return <div className={`cedros-wallet-unlock ${className}`}>{renderContent()}</div>;\n}\n\n// Icon components\nfunction LockIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <rect\n x=\"10\"\n y=\"22\"\n width=\"28\"\n height=\"20\"\n rx=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-muted, #f3f4f6)\"\n />\n <path d=\"M16 22V16a8 8 0 1 1 16 0v6\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\n <circle cx=\"24\" cy=\"32\" r=\"3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SuccessIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-success-light, #dcfce7)\"\n />\n <path\n d=\"M16 24l6 6 10-10\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nfunction ErrorIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-destructive-light, #fee2e2)\"\n />\n <path\n d=\"M24 16v10M24 30v2\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Hook for wallet recovery flow\n *\n * Handles recovery using the BIP-39 mnemonic (recovery phrase):\n *\n * Two recovery modes supported:\n * - full_seed: User enters 12-word full seed mnemonic (portable to other wallets)\n * - share_c_only: User enters 12-word Share C mnemonic (app-locked recovery)\n *\n * Recovery flow:\n * 1. User enters 12-word recovery phrase\n * 2. Validate and decode to seed (or Share C → fetch Share B → combine)\n * 3. Re-derive Solana pubkey (proves ownership)\n * 4. Re-split seed into new Shamir shares\n * 5. Encrypt Share A with new credential\n * 6. Send to server (pubkey match verifies ownership)\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n mnemonicToSeed,\n mnemonicToShare,\n isValidMnemonic,\n combineShares,\n splitSecret,\n generateArgon2Salt,\n generatePrfSalt,\n argon2DeriveInWorker,\n authenticateWithDiscoverablePrf,\n deriveKeyFromPrf,\n aesGcmEncryptToBase64,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n wipeAll,\n toEncryptionKey,\n toShamirShare,\n DEFAULT_KDF_PARAMS,\n base64ToUint8Array,\n uint8ArrayToBase64,\n type Seed,\n type Argon2Salt,\n} from '../crypto';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport { useWalletDiscovery } from './useWalletDiscovery';\nimport type {\n UseWalletRecoveryReturn,\n RecoveryState,\n WalletRecoverRequest,\n ShareAAuthMethod,\n} from '../types/wallet';\n\n/**\n * Hook for wallet recovery\n *\n * Supports two recovery modes based on server config:\n * - full_seed: User enters the full 12-word seed phrase (portable)\n * - share_c_only: User enters 12-word Share C phrase, server provides Share B (app-locked)\n */\nexport function useWalletRecovery(): UseWalletRecoveryReturn {\n const { recover, getShareBForRecovery } = useWalletMaterial();\n const { recoveryMode } = useWalletDiscovery();\n\n const [state, setState] = useState<RecoveryState>({ step: 'idle' });\n const [isRecovering, setIsRecovering] = useState(false);\n\n // Store sensitive data for cleanup\n const sensitiveData = useRef<Uint8Array[]>([]);\n\n const cleanup = useCallback(() => {\n wipeAll(...sensitiveData.current);\n sensitiveData.current = [];\n }, []);\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n /**\n * Start and complete recovery in one step\n *\n * @param words - 12-word recovery phrase (full seed or Share C based on mode)\n * @param method - New auth method (password or passkey)\n * @param credential - New password (ignored for passkey)\n */\n const startRecovery = useCallback(\n async (words: string[], method: ShareAAuthMethod, credential: string): Promise<void> => {\n setIsRecovering(true);\n cleanup();\n\n try {\n // Step 1: Validate mnemonic\n setState({ step: 'validating' });\n\n if (!isValidMnemonic(words)) {\n throw new Error('Invalid recovery phrase. Please check your words.');\n }\n\n let seed: Seed;\n\n if (recoveryMode === 'share_c_only') {\n // Share C mode: decode to Share C, fetch Share B, combine\n const shareC = mnemonicToShare(words);\n sensitiveData.current.push(shareC);\n\n // Send Share C to server to get Share B\n const shareCBase64 = uint8ArrayToBase64(shareC);\n const response = await getShareBForRecovery({ shareC: shareCBase64 });\n\n // Decode Share B from response\n const shareB = base64ToUint8Array(response.shareB);\n sensitiveData.current.push(shareB);\n\n // Combine Share B + Share C to reconstruct seed\n seed = combineShares(toShamirShare(shareB), toShamirShare(shareC));\n sensitiveData.current.push(seed);\n } else {\n // Full seed mode: decode mnemonic directly to seed\n seed = mnemonicToSeed(words);\n sensitiveData.current.push(seed);\n }\n\n // Step 3: Derive Solana pubkey (proves ownership when server verifies match)\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 4: Re-split seed into new shares\n const { shareA, shareB } = splitSecret(seed);\n sensitiveData.current.push(shareA, shareB);\n\n // Step 5: Encrypt Share A with new credential\n setState({ step: 'encrypting' });\n\n let encryptionKey: Uint8Array;\n let kdfSalt: Argon2Salt | undefined;\n let prfSaltBase64: string | undefined;\n\n if (method === 'passkey') {\n // Passkey method: authenticate and derive key from PRF\n const prfSalt = generatePrfSalt();\n prfSaltBase64 = uint8ArrayToBase64(prfSalt);\n\n const prfResult = await authenticateWithDiscoverablePrf(prfSaltBase64);\n sensitiveData.current.push(prfResult.prfOutput);\n\n encryptionKey = await deriveKeyFromPrf(prfResult.prfOutput, prfSalt);\n sensitiveData.current.push(encryptionKey);\n } else {\n // Password method: derive key with Argon2id\n kdfSalt = generateArgon2Salt();\n encryptionKey = await argon2DeriveInWorker(credential, kdfSalt, DEFAULT_KDF_PARAMS);\n sensitiveData.current.push(encryptionKey);\n }\n\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(encryptionKey));\n\n // Step 6: Build request and send to server\n setState({ step: 'uploading' });\n\n const request: WalletRecoverRequest = {\n solanaPubkey,\n shareAAuthMethod: method,\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n shareB: uint8ArrayToBase64(shareB),\n };\n\n // Add method-specific fields\n if (method === 'password') {\n request.shareAKdfSalt = uint8ArrayToBase64(kdfSalt!);\n request.shareAKdfParams = DEFAULT_KDF_PARAMS;\n }\n\n if (method === 'passkey') {\n request.prfSalt = prfSaltBase64;\n }\n\n await recover(request);\n\n // Success\n cleanup();\n setState({ step: 'complete' });\n } catch (err) {\n cleanup();\n setState({\n step: 'error',\n error: err instanceof Error ? err.message : 'Recovery failed',\n });\n } finally {\n setIsRecovering(false);\n }\n },\n [recover, getShareBForRecovery, recoveryMode, cleanup]\n );\n\n const cancel = useCallback(() => {\n cleanup();\n setState({ step: 'idle' });\n setIsRecovering(false);\n }, [cleanup]);\n\n return {\n state,\n startRecovery,\n cancel,\n isRecovering,\n };\n}\n","/**\n * Wallet recovery wizard component\n *\n * Guides users through wallet recovery using their BIP-39 recovery phrase:\n * 1. Enter 12-word recovery phrase\n * 2. Choose new auth method (password/passkey)\n * 3. Enter new credential\n * 4. Submit to re-encrypt and replace wallet material\n */\n\nimport { useState, useCallback } from 'react';\nimport type { FormEvent } from 'react';\nimport { useWalletRecovery } from '../../hooks/useWalletRecovery';\nimport { RecoveryPhraseInput } from './RecoveryPhraseInput';\nimport type { ShareAAuthMethod } from '../../types/wallet';\n\nexport interface WalletRecoveryProps {\n /** Callback when recovery completes successfully */\n onComplete?: () => void;\n /** Callback when user cancels recovery */\n onCancel?: () => void;\n /** Additional CSS classes */\n className?: string;\n /** Default auth method (optional) */\n defaultAuthMethod?: ShareAAuthMethod;\n}\n\n/**\n * Wallet recovery wizard\n *\n * Two-phase flow:\n * 1. Enter recovery phrase\n * 2. Enter new credential (password/passkey)\n */\nexport function WalletRecovery({\n onComplete,\n onCancel,\n className = '',\n defaultAuthMethod = 'password',\n}: WalletRecoveryProps) {\n const { state, startRecovery, cancel, isRecovering } = useWalletRecovery();\n\n // Phase 1: Recovery phrase\n const [words, setWords] = useState<string[]>([]);\n const [phraseValidated, setPhraseValidated] = useState(false);\n\n // Phase 2: New credential\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod>(defaultAuthMethod);\n const [credential, setCredential] = useState('');\n const [confirmCredential, setConfirmCredential] = useState('');\n const [credentialError, setCredentialError] = useState<string | null>(null);\n\n // Handle phrase submission (phase 1 complete)\n const handlePhraseSubmit = useCallback((submittedWords: string[]) => {\n setWords(submittedWords);\n setPhraseValidated(true);\n }, []);\n\n // Handle credential submission (phase 2 complete)\n const handleCredentialSubmit = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n setCredentialError(null);\n\n // Passkey doesn't need confirmation\n if (authMethod !== 'passkey') {\n if (credential !== confirmCredential) {\n setCredentialError('Passwords do not match');\n return;\n }\n\n if (authMethod === 'password' && credential.length < 8) {\n setCredentialError('Password must be at least 8 characters');\n return;\n }\n }\n\n await startRecovery(words, authMethod, credential);\n },\n [words, authMethod, credential, confirmCredential, startRecovery]\n );\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n cancel();\n setWords([]);\n setPhraseValidated(false);\n setCredential('');\n setConfirmCredential('');\n onCancel?.();\n }, [cancel, onCancel]);\n\n // Handle back to phrase entry\n const handleBack = useCallback(() => {\n setPhraseValidated(false);\n setCredential('');\n setConfirmCredential('');\n }, []);\n\n // Handle completion\n const handleComplete = useCallback(() => {\n onComplete?.();\n }, [onComplete]);\n\n // Render based on state\n if (state.step === 'validating' || state.step === 'encrypting' || state.step === 'uploading') {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-progress\">\n <div className=\"cedros-wallet-recovery-icon\">\n <LoadingSpinner />\n </div>\n <h3 className=\"cedros-wallet-recovery-title\">\n {state.step === 'validating' && 'Validating Recovery Phrase'}\n {state.step === 'encrypting' && 'Encrypting Wallet'}\n {state.step === 'uploading' && 'Saving to Server'}\n </h3>\n <p className=\"cedros-wallet-recovery-description\">\n {state.step === 'validating' && 'Checking your recovery phrase...'}\n {state.step === 'encrypting' && 'Securing your wallet with new encryption...'}\n {state.step === 'uploading' && 'Uploading encrypted wallet data...'}\n </p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'complete') {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-success\">\n <div className=\"cedros-wallet-recovery-icon\">\n <SuccessIcon />\n </div>\n <h3 className=\"cedros-wallet-recovery-title\">Wallet Recovered</h3>\n <p className=\"cedros-wallet-recovery-description\">\n Your wallet has been successfully recovered and secured with your new{' '}\n {authMethod === 'passkey' ? 'passkey' : 'password'}.\n </p>\n <div className=\"cedros-wallet-recovery-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleComplete}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n if (state.step === 'error') {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-error\">\n <div className=\"cedros-wallet-recovery-icon\">\n <ErrorIcon />\n </div>\n <h3 className=\"cedros-wallet-recovery-title\">Recovery Failed</h3>\n <p className=\"cedros-wallet-recovery-description\">\n {state.error ?? 'An error occurred during recovery. Please try again.'}\n </p>\n <div className=\"cedros-wallet-recovery-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleCancel}\n >\n Start Over\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Phase 1: Enter recovery phrase\n if (!phraseValidated) {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-phrase\">\n <div className=\"cedros-wallet-recovery-header\">\n <h3 className=\"cedros-wallet-recovery-title\">Recover Your Wallet</h3>\n <p className=\"cedros-wallet-recovery-description\">\n Enter your 12-word recovery phrase to restore your wallet.\n </p>\n </div>\n\n <RecoveryPhraseInput\n onSubmit={handlePhraseSubmit}\n onCancel={handleCancel}\n isSubmitting={false}\n />\n </div>\n </div>\n );\n }\n\n // Phase 2: Enter new credential\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <form className=\"cedros-wallet-recovery-credential\" onSubmit={handleCredentialSubmit}>\n <div className=\"cedros-wallet-recovery-header\">\n <h3 className=\"cedros-wallet-recovery-title\">Set New Security</h3>\n <p className=\"cedros-wallet-recovery-description\">\n Choose how to secure your recovered wallet.\n </p>\n </div>\n\n {/* Auth method selector */}\n <div className=\"cedros-auth-method-selector\">\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"password\"\n checked={authMethod === 'password'}\n onChange={() => setAuthMethod('password')}\n disabled={isRecovering}\n />\n <span>Password</span>\n </label>\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"passkey\"\n checked={authMethod === 'passkey'}\n onChange={() => setAuthMethod('passkey')}\n disabled={isRecovering}\n />\n <span>Passkey</span>\n </label>\n </div>\n\n {/* Password input */}\n {authMethod === 'password' && (\n <>\n <div className=\"cedros-password-input\">\n <label htmlFor=\"recovery-password\" className=\"cedros-label\">\n New Password\n </label>\n <input\n id=\"recovery-password\"\n type=\"password\"\n className=\"cedros-input\"\n value={credential}\n onChange={(e) => setCredential(e.target.value)}\n disabled={isRecovering}\n minLength={8}\n placeholder=\"Enter a strong password\"\n />\n </div>\n <div className=\"cedros-password-input\">\n <label htmlFor=\"recovery-password-confirm\" className=\"cedros-label\">\n Confirm Password\n </label>\n <input\n id=\"recovery-password-confirm\"\n type=\"password\"\n className=\"cedros-input\"\n value={confirmCredential}\n onChange={(e) => setConfirmCredential(e.target.value)}\n disabled={isRecovering}\n aria-invalid={credentialError ? 'true' : undefined}\n placeholder=\"Confirm your password\"\n />\n {credentialError && (\n <p className=\"cedros-input-error\" role=\"alert\">\n {credentialError}\n </p>\n )}\n </div>\n </>\n )}\n\n {/* Passkey info */}\n {authMethod === 'passkey' && (\n <div className=\"cedros-passkey-info\">\n <PasskeyIcon />\n <p>Use your passkey (Touch ID, Face ID, or Windows Hello) to secure your wallet.</p>\n </div>\n )}\n\n <div className=\"cedros-wallet-recovery-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleBack}\n disabled={isRecovering}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={\n isRecovering ||\n (authMethod !== 'passkey' &&\n (credential.length === 0 || confirmCredential.length === 0))\n }\n >\n {isRecovering ? 'Recovering...' : 'Recover Wallet'}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\n// Icon components\nfunction LoadingSpinner() {\n return (\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"cedros-spinner\"\n >\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-muted, #e5e7eb)\"\n strokeWidth=\"3\"\n fill=\"none\"\n />\n <path\n d=\"M24 4a20 20 0 0 1 20 20\"\n stroke=\"var(--cedros-primary, #6366f1)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nfunction SuccessIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-success-light, #dcfce7)\"\n />\n <path\n d=\"M16 24l6 6 10-10\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nfunction ErrorIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-destructive-light, #fee2e2)\"\n />\n <path\n d=\"M24 16v10M24 30v2\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction PasskeyIcon() {\n return (\n <svg\n className=\"cedros-passkey-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect x=\"8\" y=\"16\" width=\"32\" height=\"24\" rx=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"24\" cy=\"28\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 32v4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useCedrosLoginOptional } from '../../context/useCedrosLogin';\n\nexport interface WalletAddressRowProps {\n address: string;\n label?: string;\n showCopy?: boolean;\n showExplorerLink?: boolean;\n /** If address is long, show a truncated preview with a reveal toggle. */\n allowReveal?: boolean;\n className?: string;\n}\n\nexport function WalletAddressRow({\n address,\n label = 'Wallet Address',\n showCopy = true,\n showExplorerLink = true,\n allowReveal = true,\n className = '',\n}: WalletAddressRowProps) {\n const context = useCedrosLoginOptional();\n const [copied, setCopied] = useState(false);\n const [copyError, setCopyError] = useState<string | null>(null);\n const [revealFull, setRevealFull] = useState(false);\n const copyTimerRef = useRef<number | null>(null);\n\n const network = context?.config.solana?.network ?? 'mainnet-beta';\n const explorerHref = useMemo(() => {\n const base = `https://explorer.solana.com/address/${address}`;\n if (network === 'mainnet-beta') return base;\n return `${base}?cluster=${encodeURIComponent(network)}`;\n }, [address, network]);\n\n const isTruncatable = allowReveal && address.length > 18;\n\n const displayAddress = useMemo(() => {\n if (!isTruncatable || revealFull) return address;\n return `${address.slice(0, 8)}...${address.slice(-8)}`;\n }, [address, isTruncatable, revealFull]);\n\n const handleCopy = useCallback(async () => {\n try {\n setCopyError(null);\n await navigator.clipboard.writeText(address);\n setCopied(true);\n\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => {\n setCopied(false);\n copyTimerRef.current = null;\n }, 2000);\n } catch (err) {\n setCopied(false);\n setCopyError(err instanceof Error ? err.message : 'Copy failed');\n }\n }, [address]);\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n copyTimerRef.current = null;\n }\n };\n }, []);\n\n return (\n <div className={`cedros-wallet-address-row ${className}`}>\n <div className=\"cedros-wallet-address-row-header\">\n <span className=\"cedros-wallet-status-pubkey-label\">{label}</span>\n <div className=\"cedros-wallet-address-row-actions\">\n {isTruncatable && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-ghost\"\n onClick={() => setRevealFull((v) => !v)}\n aria-label={revealFull ? 'Hide full wallet address' : 'Show full wallet address'}\n >\n {revealFull ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.7 10.7a3 3 0 0 0 4.24 4.24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.88 5.09A10.94 10.94 0 0 1 12 5c5 0 9.27 3.11 11 7-0.55 1.23-1.32 2.33-2.27 3.25\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.61 6.61C4.4 7.9 2.74 9.8 1 12c1.73 3.89 6 7 11 7 1.14 0 2.25-0.16 3.3-0.46\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7S1 12 1 12Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n {showExplorerLink && (\n <a\n className=\"cedros-button cedros-button-sm cedros-button-ghost\"\n href={explorerHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Explorer\n </a>\n )}\n {showCopy && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-outline\"\n onClick={handleCopy}\n aria-label=\"Copy wallet address\"\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n )}\n </div>\n </div>\n <code className=\"cedros-wallet-status-pubkey-value\" title={address}>\n {displayAddress}\n </code>\n {copyError && (\n <p className=\"cedros-input-hint\" role=\"status\">\n {copyError}\n </p>\n )}\n </div>\n );\n}\n","/**\n * Wallet status indicator component\n *\n * Displays the current state of the user's wallet:\n * - Loading: Checking wallet status\n * - Not enrolled: No wallet created yet\n * - Enrolled (locked): Wallet exists but needs unlock\n * - Enrolled (unlocked): Wallet ready for transactions\n * - Error: Something went wrong\n *\n * Supports two modes:\n * - Uncontrolled (default): Gets status from useWallet() hook\n * - Controlled: Accepts status/publicKey props (useful for stories/demos)\n */\n\nimport { useWallet } from '../../hooks/useWallet';\nimport type { WalletStatus as WalletStatusType } from '../../types/wallet';\nimport { WalletAddressRow } from './WalletAddressRow';\n\nexport interface WalletStatusProps {\n /** Controlled mode: Override wallet status (for demos/stories) */\n status?: WalletStatusType;\n /** Controlled mode: Override public key display */\n publicKey?: string;\n /** Controlled mode: Override lock state */\n onLock?: () => void;\n /** Callback when user wants to create a wallet */\n onEnroll?: () => void;\n /** Callback when user wants to unlock wallet */\n onUnlock?: () => void;\n /** Callback when user wants to recover wallet */\n onRecover?: () => void;\n /** Whether to show action buttons */\n showActions?: boolean;\n /** Compact display mode */\n compact?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Wallet status indicator\n *\n * Shows current wallet state with optional action buttons.\n * Pass `status` prop to use in controlled mode (bypasses hook).\n */\nexport function WalletStatus({\n status: controlledStatus,\n publicKey: controlledPubkey,\n onLock: _onLock,\n onEnroll,\n onUnlock,\n onRecover,\n showActions = true,\n compact = false,\n className = '',\n}: WalletStatusProps) {\n // onLock reserved for future use\n void _onLock;\n // Use controlled mode if status prop is provided, otherwise use hook\n const isControlled = controlledStatus !== undefined;\n const wallet = useWallet();\n\n const status = isControlled ? controlledStatus : wallet.status;\n const solanaPubkey = isControlled ? (controlledPubkey ?? null) : wallet.solanaPubkey;\n const error = isControlled ? null : wallet.error;\n const refresh = isControlled ? () => {} : wallet.refresh;\n const clearError = isControlled ? () => {} : wallet.clearError;\n\n const statusConfig = getStatusConfig(status, error);\n\n if (compact) {\n return (\n <div className={`cedros-wallet-status cedros-wallet-status-compact ${className}`}>\n <span\n className={`cedros-wallet-status-dot cedros-wallet-status-${statusConfig.color}`}\n title={statusConfig.label}\n />\n <span className=\"cedros-wallet-status-label\">{statusConfig.label}</span>\n {solanaPubkey && (\n <span className=\"cedros-wallet-status-pubkey\" title={solanaPubkey}>\n {truncatePubkey(solanaPubkey)}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div className={`cedros-wallet-status ${className}`}>\n <div className=\"cedros-wallet-status-header\">\n <div\n className={`cedros-wallet-status-icon cedros-wallet-status-icon-${statusConfig.color}`}\n >\n <StatusIcon status={status} />\n </div>\n <div className=\"cedros-wallet-status-info\">\n <h4 className=\"cedros-wallet-status-title\">{statusConfig.title}</h4>\n <p className=\"cedros-wallet-status-description\">{statusConfig.description}</p>\n </div>\n </div>\n\n {solanaPubkey && (\n <div className=\"cedros-wallet-status-pubkey-full\">\n <WalletAddressRow address={solanaPubkey} />\n </div>\n )}\n\n {error && (\n <div className=\"cedros-wallet-status-error-box\" role=\"alert\">\n <p>{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-secondary\"\n onClick={clearError}\n >\n Dismiss\n </button>\n </div>\n )}\n\n {showActions && (\n <div className=\"cedros-wallet-status-actions\">\n {status === 'not_enrolled' && onEnroll && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={onEnroll}\n >\n Create Wallet\n </button>\n )}\n\n {status === 'enrolled_locked' && onUnlock && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={onUnlock}\n >\n Unlock Wallet\n </button>\n )}\n\n {(status === 'not_enrolled' || status === 'error') && onRecover && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRecover}\n >\n Recover Wallet\n </button>\n )}\n\n {status === 'error' && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={refresh}\n >\n Retry\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\ninterface StatusConfig {\n label: string;\n title: string;\n description: string;\n color: 'loading' | 'success' | 'warning' | 'error' | 'muted';\n}\n\nfunction getStatusConfig(status: WalletStatusType, error: string | null): StatusConfig {\n switch (status) {\n case 'loading':\n return {\n label: 'Loading',\n title: 'Checking Wallet',\n description: 'Verifying wallet status...',\n color: 'loading',\n };\n\n case 'not_enrolled':\n return {\n label: 'Not Set Up',\n title: 'No Wallet',\n description: 'Create a wallet to start using Solana.',\n color: 'muted',\n };\n\n case 'enrolled_locked':\n return {\n label: 'Locked',\n title: 'Wallet Locked',\n description: 'Unlock your wallet to sign transactions.',\n color: 'warning',\n };\n\n case 'enrolled_unlocked':\n case 'unlocked':\n return {\n label: 'Ready',\n title: 'Wallet Ready',\n description: 'Your wallet is unlocked and ready to use.',\n color: 'success',\n };\n\n case 'error':\n default:\n return {\n label: 'Error',\n title: 'Wallet Error',\n description: error ?? 'An error occurred with your wallet.',\n color: 'error',\n };\n }\n}\n\nfunction truncatePubkey(pubkey: string): string {\n if (pubkey.length <= 12) return pubkey;\n return `${pubkey.slice(0, 4)}...${pubkey.slice(-4)}`;\n}\n\nfunction StatusIcon({ status }: { status: WalletStatusType }) {\n switch (status) {\n case 'loading':\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"cedros-spinner\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.25\" />\n <path\n d=\"M12 3a9 9 0 0 1 9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n\n case 'not_enrolled':\n // Plus icon (add wallet)\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M8 12h8M12 8v8\" />\n </svg>\n );\n\n case 'enrolled_locked':\n // Lock icon\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n\n case 'enrolled_unlocked':\n case 'unlocked':\n // Check icon\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n );\n\n case 'error':\n // Alert triangle icon\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n );\n\n default:\n return null;\n }\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { useWallet } from '../../hooks/useWallet';\nimport { WalletEnrollment } from './WalletEnrollment';\nimport { WalletRecovery } from './WalletRecovery';\nimport { WalletStatus } from './WalletStatus';\nimport { WalletUnlock } from './WalletUnlock';\n\ntype WalletManagerView = 'status' | 'enroll' | 'unlock' | 'recover_intro' | 'recover';\n\nexport interface WalletManagerProps {\n className?: string;\n showActions?: boolean;\n}\n\n/**\n * Orchestrates embedded wallet flows in one cohesive surface:\n * status -> enroll/unlock/recover.\n */\nexport function WalletManager({ className = '', showActions = true }: WalletManagerProps) {\n const wallet = useWallet();\n\n const [view, setView] = useState<WalletManagerView>('status');\n\n const header = useMemo(() => {\n switch (view) {\n case 'enroll':\n return { title: 'Create Wallet', description: 'Set up your embedded wallet.' };\n case 'unlock':\n return { title: 'Unlock Wallet', description: 'Unlock to sign transactions.' };\n case 'recover_intro':\n case 'recover':\n return {\n title: 'Recover Wallet',\n description: 'Restore access using your recovery phrase.',\n };\n case 'status':\n default:\n return null;\n }\n }, [view]);\n\n const handleBackToStatus = useCallback(() => setView('status'), []);\n\n const handleEnrollComplete = useCallback(async () => {\n setView('status');\n await wallet.refresh();\n }, [wallet]);\n\n const handleUnlockComplete = useCallback(async () => {\n setView('status');\n await wallet.refresh();\n }, [wallet]);\n\n const handleRecoverComplete = useCallback(async () => {\n setView('status');\n await wallet.refresh();\n }, [wallet]);\n\n return (\n <div className={`cedros-wallet-manager ${className}`}>\n {view !== 'status' && header && (\n <div className=\"cedros-wallet-manager-header\">\n <div className=\"cedros-wallet-manager-header-text\">\n <h3 className=\"cedros-wallet-manager-title\">{header.title}</h3>\n <p className=\"cedros-wallet-manager-subtitle\">{header.description}</p>\n </div>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-ghost\"\n onClick={handleBackToStatus}\n >\n Back\n </button>\n </div>\n )}\n\n {view === 'status' && (\n <WalletStatus\n onEnroll={() => setView('enroll')}\n onUnlock={() => setView('unlock')}\n onRecover={() => setView('recover_intro')}\n showActions={showActions}\n />\n )}\n\n {view === 'enroll' && (\n <WalletEnrollment\n onComplete={() => {\n void handleEnrollComplete();\n }}\n onCancel={handleBackToStatus}\n />\n )}\n\n {view === 'unlock' && (\n <WalletUnlock\n onUnlock={() => {\n void handleUnlockComplete();\n }}\n onCancel={handleBackToStatus}\n />\n )}\n\n {view === 'recover_intro' && (\n <div className=\"cedros-wallet-manager-intro\">\n <div className=\"cedros-wallet-manager-intro-card\">\n <h4 className=\"cedros-wallet-manager-intro-title\">Before you start</h4>\n <ul className=\"cedros-wallet-manager-intro-list\">\n <li>You’ll need your 12-word recovery phrase.</li>\n <li>You’ll set a new password or passkey for this wallet.</li>\n <li>If you’re on a shared device, avoid copying the phrase into other apps.</li>\n </ul>\n <div className=\"cedros-wallet-manager-intro-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={() => setView('recover')}\n >\n Start recovery\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleBackToStatus}\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n )}\n\n {view === 'recover' && (\n <WalletRecovery\n onComplete={() => {\n void handleRecoverComplete();\n }}\n onCancel={handleBackToStatus}\n />\n )}\n </div>\n );\n}\n","import type {\n ListSystemSettingsResponse,\n UpdateSettingRequest,\n UpdateSystemSettingsResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for system settings operations (admin only)\n */\nexport class SystemSettingsApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * Get all system settings grouped by category\n * Requires system admin privileges\n */\n async getSettings(): Promise<ListSystemSettingsResponse> {\n try {\n return await this.client.get<ListSystemSettingsResponse>('/admin/settings');\n } catch (error) {\n throw handleApiError(error, 'Failed to fetch system settings');\n }\n }\n\n /**\n * Update one or more system settings\n * Requires system admin privileges\n */\n async updateSettings(settings: UpdateSettingRequest[]): Promise<UpdateSystemSettingsResponse> {\n try {\n return await this.client.patch<UpdateSystemSettingsResponse>('/admin/settings', {\n settings,\n });\n } catch (error) {\n throw handleApiError(error, 'Failed to update system settings');\n }\n }\n}\n","import { useState, useCallback, useMemo, useRef } from 'react';\nimport type { SystemSetting, UpdateSettingRequest, UseSystemSettingsReturn } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { SystemSettingsApiClient } from '../utils/systemSettingsApi';\n\n/**\n * Hook for managing system settings (admin only).\n *\n * Provides CRUD operations for system-wide configuration settings\n * stored in the database. Only accessible to system administrators.\n *\n * @example\n * ```tsx\n * function SystemSettingsPanel() {\n * const {\n * settings,\n * isLoading,\n * error,\n * fetchSettings,\n * updateSettings,\n * getValue,\n * } = useSystemSettings();\n *\n * useEffect(() => {\n * fetchSettings();\n * }, [fetchSettings]);\n *\n * const handleSave = async () => {\n * await updateSettings([\n * { key: 'privacy_period_secs', value: '1209600' },\n * ]);\n * };\n *\n * return (\n * <div>\n * {Object.entries(settings).map(([category, items]) => (\n * <section key={category}>\n * <h3>{category}</h3>\n * {items.map(item => (\n * <div key={item.key}>\n * {item.key}: {item.value}\n * </div>\n * ))}\n * </section>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useSystemSettings(): UseSystemSettingsReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [settings, setSettings] = useState<Record<string, SystemSetting[]>>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new SystemSettingsApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // Use ref to avoid apiClient in callback dependencies\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchSettings = useCallback(async () => {\n if (authState !== 'authenticated') {\n setSettings({});\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const response = await apiClientRef.current.getSettings();\n if (requestId !== requestIdRef.current) return;\n setSettings(response.settings);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err instanceof Error ? err : new Error('Failed to fetch settings'));\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [authState]);\n\n const updateSettings = useCallback(\n async (updates: UpdateSettingRequest[]): Promise<void> => {\n if (authState !== 'authenticated') {\n throw new Error('Not authenticated');\n }\n\n setIsUpdating(true);\n setError(null);\n\n try {\n await apiClientRef.current.updateSettings(updates);\n // Refresh settings after update\n await fetchSettings();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update settings');\n setError(error);\n throw error;\n } finally {\n setIsUpdating(false);\n }\n },\n [authState, fetchSettings]\n );\n\n const getValue = useCallback(\n (key: string): string | undefined => {\n for (const categorySettings of Object.values(settings)) {\n const found = categorySettings.find((s) => s.key === key);\n if (found) return found.value;\n }\n return undefined;\n },\n [settings]\n );\n\n return {\n settings,\n isLoading,\n isUpdating,\n error,\n fetchSettings,\n updateSettings,\n getValue,\n };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting, UpdateSettingRequest, SettingMeta } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { useSystemSettings } from '../../hooks/useSystemSettings';\n\n// =============================================================================\n// DURATION UTILITIES\n// =============================================================================\n\ninterface DurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nfunction secondsToDuration(totalSeconds: number): DurationParts {\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n return { days, hours, minutes, seconds };\n}\n\nfunction formatDuration(totalSeconds: number): string {\n const { days, hours, minutes } = secondsToDuration(totalSeconds);\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (parts.length === 0) parts.push(`${totalSeconds}s`);\n return parts.join(' ');\n}\n\n// =============================================================================\n// SETTING METADATA - Rich descriptions and input configuration\n// =============================================================================\n\nconst SETTING_METADATA: Record<string, SettingMeta> = {\n // Privacy settings\n privacy_period_secs: {\n key: 'privacy_period_secs',\n label: 'Privacy Period',\n description:\n 'How long deposits are held before withdrawal to provide timing privacy. Longer periods provide better privacy but delay user access to funds.',\n inputType: 'duration',\n min: 0,\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '1 hour', value: '3600' },\n { label: '6 hours', value: '21600' },\n { label: '24 hours', value: '86400' },\n { label: '7 days', value: '604800' },\n { label: '14 days', value: '1209600' },\n { label: '30 days', value: '2592000' },\n ],\n warningThreshold: {\n below: 3600,\n message: 'Very short privacy periods may not provide adequate timing protection.',\n },\n },\n\n // Withdrawal worker settings\n withdrawal_poll_interval_secs: {\n key: 'withdrawal_poll_interval_secs',\n label: 'Worker Poll Interval',\n description:\n 'How often the withdrawal worker checks for deposits ready to process. Lower values process faster but increase server load.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n { label: '1 hour', value: '3600' },\n { label: '6 hours', value: '21600' },\n ],\n warningThreshold: {\n below: 60,\n message: 'Polling more than once per minute may cause excessive load.',\n },\n },\n withdrawal_batch_size: {\n key: 'withdrawal_batch_size',\n label: 'Batch Size',\n description:\n 'Maximum number of withdrawals to process in a single batch. Higher values improve throughput but may cause timeouts.',\n inputType: 'select',\n min: 1,\n max: 100,\n presets: [\n { label: '1 (Sequential)', value: '1' },\n { label: '5', value: '5' },\n { label: '10 (Recommended)', value: '10' },\n { label: '25', value: '25' },\n { label: '50', value: '50' },\n { label: '100 (Max)', value: '100' },\n ],\n },\n withdrawal_timeout_secs: {\n key: 'withdrawal_timeout_secs',\n label: 'Transaction Timeout',\n description:\n 'How long to wait for a withdrawal transaction to confirm before considering it failed.',\n inputType: 'duration',\n min: 30,\n presets: [\n { label: '30 seconds', value: '30' },\n { label: '1 minute', value: '60' },\n { label: '2 minutes', value: '120' },\n { label: '5 minutes', value: '300' },\n ],\n warningThreshold: {\n below: 30,\n message: 'Very short timeouts may cause premature failure on slow networks.',\n },\n },\n withdrawal_max_retries: {\n key: 'withdrawal_max_retries',\n label: 'Max Retries',\n description:\n 'Number of times to retry a failed withdrawal before marking it as permanently failed.',\n inputType: 'select',\n min: 0,\n max: 10,\n presets: [\n { label: '0 (No retries)', value: '0' },\n { label: '1', value: '1' },\n { label: '3 (Recommended)', value: '3' },\n { label: '5', value: '5' },\n { label: '10', value: '10' },\n ],\n },\n withdrawal_percentage: {\n key: 'withdrawal_percentage',\n label: 'Withdrawal Percentage',\n description:\n 'Percentage of ready funds to withdraw each cycle. Lower values spread withdrawals over time for better privacy.',\n inputType: 'percentage',\n min: 1,\n max: 100,\n step: 5,\n presets: [\n { label: '25%', value: '25' },\n { label: '50%', value: '50' },\n { label: '75%', value: '75' },\n { label: '100% (All at once)', value: '100' },\n ],\n warningThreshold: {\n above: 75,\n message:\n 'High percentages may reduce timing privacy by processing most withdrawals together.',\n },\n },\n partial_withdrawal_count: {\n key: 'partial_withdrawal_count',\n label: 'Partial Withdrawals',\n description:\n 'Maximum partial withdrawals per batch. Partial withdrawals add noise to timing analysis. Set to 0 to disable.',\n inputType: 'select',\n min: 0,\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '1', value: '1' },\n { label: '3', value: '3' },\n { label: '5', value: '5' },\n { label: '10', value: '10' },\n ],\n },\n partial_withdrawal_min_lamports: {\n key: 'partial_withdrawal_min_lamports',\n label: 'Min Balance for Partial',\n description:\n 'Minimum account balance (in lamports) required before partial withdrawals are considered. 1 SOL = 1,000,000,000 lamports.',\n inputType: 'select',\n min: 0,\n presets: [\n { label: '0.1 SOL', value: '100000000' },\n { label: '0.5 SOL', value: '500000000' },\n { label: '1 SOL', value: '1000000000' },\n { label: '5 SOL', value: '5000000000' },\n { label: '10 SOL', value: '10000000000' },\n ],\n },\n\n // Rate limit settings\n rate_limit_auth: {\n key: 'rate_limit_auth',\n label: 'Auth Request Limit',\n description:\n 'Maximum authentication attempts (login, register, password reset) per IP per window. Protects against brute force attacks.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '5 (Strict)', value: '5' },\n { label: '10 (Recommended)', value: '10' },\n { label: '20', value: '20' },\n { label: '50 (Permissive)', value: '50' },\n ],\n warningThreshold: {\n above: 20,\n message: 'High auth limits may allow brute force attempts.',\n },\n },\n rate_limit_general: {\n key: 'rate_limit_general',\n label: 'General Request Limit',\n description: 'Maximum general API requests per IP per window. Affects all non-auth endpoints.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '30', value: '30' },\n { label: '60 (Recommended)', value: '60' },\n { label: '120', value: '120' },\n { label: '300', value: '300' },\n ],\n },\n rate_limit_credit: {\n key: 'rate_limit_credit',\n label: 'Credit Request Limit',\n description:\n 'Maximum credit/balance check requests per IP per window. Higher for apps that poll balance frequently.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '10', value: '10' },\n { label: '30 (Recommended)', value: '30' },\n { label: '60', value: '60' },\n { label: '120', value: '120' },\n ],\n },\n rate_limit_window: {\n key: 'rate_limit_window',\n label: 'Rate Limit Window',\n description:\n 'Time window for rate limiting. All limits above are \"per window\". Shorter windows are stricter.',\n inputType: 'duration',\n min: 1,\n presets: [\n { label: '30 seconds', value: '30' },\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n ],\n },\n\n // Deposit settings\n deposit_quick_action_tokens: {\n key: 'deposit_quick_action_tokens',\n label: 'Quick Action Tokens',\n description:\n 'Comma-separated token symbols shown as quick action buttons. First token is the default.',\n inputType: 'tokenSymbolList',\n },\n deposit_custom_tokens: {\n key: 'deposit_custom_tokens',\n label: 'Custom Dropdown Tokens',\n description:\n 'Comma-separated token symbols shown in the \"Custom\" dropdown. Leave empty to show all.',\n inputType: 'tokenSymbolList',\n },\n deposit_custom_tokens_json: {\n key: 'deposit_custom_tokens_json',\n label: 'Custom Token Definitions',\n description:\n 'Add tokens beyond the built-in list. Define symbol, mint address, decimals, and logo URL.',\n inputType: 'tokenList',\n },\n};\n\n/** Category display metadata */\nconst CATEGORY_METADATA: Record<string, { label: string; description: string; icon: string }> = {\n privacy: {\n label: 'Privacy Settings',\n description:\n 'Control the privacy period for deposits. Longer periods provide better timing privacy but delay fund availability.',\n icon: '🔒',\n },\n withdrawal: {\n label: 'Withdrawal Worker',\n description:\n 'Configure how the automated withdrawal processor handles pending withdrawals. These settings affect throughput and privacy.',\n icon: '⚙️',\n },\n rate_limit: {\n label: 'Rate Limiting',\n description:\n 'Protect the system from abuse by limiting request rates. Balance security with user experience.',\n icon: '🛡️',\n },\n deposit: {\n label: 'Deposit Settings',\n description: 'Configure token lists and deposit flow display options.',\n icon: '💳',\n },\n};\n\n// =============================================================================\n// COMPONENT PROPS\n// =============================================================================\n\nexport interface SystemSettingsProps {\n /** Whether to show section descriptions */\n showDescriptions?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Callback when settings are saved */\n onSave?: () => void;\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * System settings management component for administrators.\n *\n * Features:\n * - Duration inputs with human-readable display\n * - Percentage sliders\n * - Preset dropdown selectors\n * - Warning indicators for extreme values\n * - Rich descriptions for each setting\n */\nexport function SystemSettings({\n showDescriptions = true,\n className = '',\n onSave,\n}: SystemSettingsProps) {\n const { settings, isLoading, isUpdating, error, fetchSettings, updateSettings } =\n useSystemSettings();\n\n const [edits, setEdits] = useState<Record<string, string>>({});\n const [saveError, setSaveError] = useState<string | null>(null);\n const [saveSuccess, setSaveSuccess] = useState(false);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Clear success message after 3 seconds\n useEffect(() => {\n if (saveSuccess) {\n const timer = setTimeout(() => setSaveSuccess(false), 3000);\n return () => clearTimeout(timer);\n }\n }, [saveSuccess]);\n\n const handleChange = useCallback((key: string, value: string) => {\n setEdits((prev) => ({ ...prev, [key]: value }));\n setSaveError(null);\n setSaveSuccess(false);\n }, []);\n\n const handleSave = useCallback(async () => {\n const updates: UpdateSettingRequest[] = Object.entries(edits).map(([key, value]) => ({\n key,\n value,\n }));\n\n if (updates.length === 0) return;\n\n try {\n await updateSettings(updates);\n setEdits({});\n setSaveError(null);\n setSaveSuccess(true);\n onSave?.();\n } catch (err) {\n setSaveError(err instanceof Error ? err.message : 'Failed to save settings');\n }\n }, [edits, updateSettings, onSave]);\n\n const handleReset = useCallback(() => {\n setEdits({});\n setSaveError(null);\n setSaveSuccess(false);\n }, []);\n\n const hasChanges = Object.keys(edits).length > 0;\n const changeCount = Object.keys(edits).length;\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n const categories = Object.keys(settings).sort();\n\n if (categories.length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-empty ${className}`}>\n <p>No system settings found.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n {saveError && <ErrorMessage error={saveError} />}\n {saveSuccess && <div className=\"cedros-settings-success\">Settings saved successfully.</div>}\n\n {categories.map((category) => (\n <SettingsSection\n key={category}\n category={category}\n settings={settings[category]}\n edits={edits}\n showDescription={showDescriptions}\n onChange={handleChange}\n />\n ))}\n\n <div className=\"cedros-system-settings-actions\">\n {hasChanges && (\n <span className=\"cedros-settings-change-count\">\n {changeCount} unsaved change{changeCount !== 1 ? 's' : ''}\n </span>\n )}\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleReset}\n disabled={!hasChanges || isUpdating}\n >\n Reset\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleSave}\n disabled={!hasChanges || isUpdating}\n >\n {isUpdating ? <LoadingSpinner size=\"sm\" /> : 'Save Changes'}\n </button>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// SETTINGS SECTION\n// =============================================================================\n\ninterface SettingsSectionProps {\n category: string;\n settings: SystemSetting[];\n edits: Record<string, string>;\n showDescription: boolean;\n onChange: (key: string, value: string) => void;\n}\n\nfunction SettingsSection({\n category,\n settings,\n edits,\n showDescription,\n onChange,\n}: SettingsSectionProps) {\n const meta = CATEGORY_METADATA[category] || {\n label: category,\n description: '',\n icon: '⚙️',\n };\n\n return (\n <section className=\"cedros-settings-section\">\n <div className=\"cedros-settings-section-header\">\n <span className=\"cedros-settings-section-icon\">{meta.icon}</span>\n <div>\n <h3 className=\"cedros-settings-section-title\">{meta.label}</h3>\n {showDescription && meta.description && (\n <p className=\"cedros-settings-section-description\">{meta.description}</p>\n )}\n </div>\n </div>\n\n <div className=\"cedros-settings-grid\">\n {settings.map((setting) => (\n <SettingRow\n key={setting.key}\n setting={setting}\n editValue={edits[setting.key]}\n onChange={onChange}\n />\n ))}\n </div>\n </section>\n );\n}\n\n// =============================================================================\n// SETTING ROW\n// =============================================================================\n\ninterface SettingRowProps {\n setting: SystemSetting;\n editValue?: string;\n onChange: (key: string, value: string) => void;\n}\n\nfunction SettingRow({ setting, editValue, onChange }: SettingRowProps) {\n const meta = SETTING_METADATA[setting.key];\n const currentValue = editValue ?? setting.value;\n const hasChange = editValue !== undefined && editValue !== setting.value;\n\n // Check for warnings\n const warning = useMemo(() => {\n if (!meta?.warningThreshold) return null;\n const numValue = parseInt(currentValue, 10);\n if (isNaN(numValue)) return null;\n const { above, below, message } = meta.warningThreshold;\n if (above !== undefined && numValue > above) return message;\n if (below !== undefined && numValue < below) return message;\n return null;\n }, [currentValue, meta?.warningThreshold]);\n\n if (!meta) {\n // Fallback for unknown settings\n return (\n <div className={`cedros-setting-row ${hasChange ? 'cedros-setting-row-changed' : ''}`}>\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{setting.key}</span>\n {setting.description && (\n <span className=\"cedros-setting-description\">{setting.description}</span>\n )}\n </div>\n <div className=\"cedros-setting-input-wrapper\">\n <input\n type=\"text\"\n value={currentValue}\n onChange={(e) => onChange(setting.key, e.target.value)}\n className=\"cedros-setting-input\"\n />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`cedros-setting-row ${hasChange ? 'cedros-setting-row-changed' : ''} ${warning ? 'cedros-setting-row-warning' : ''}`}\n >\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{meta.label}</span>\n <span className=\"cedros-setting-description\">{meta.description}</span>\n </div>\n\n <div className=\"cedros-setting-control\">\n {meta.inputType === 'duration' && (\n <DurationInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n presets={meta.presets}\n min={meta.min}\n />\n )}\n\n {meta.inputType === 'percentage' && (\n <PercentageInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n min={meta.min ?? 1}\n max={meta.max ?? 100}\n step={meta.step ?? 5}\n presets={meta.presets}\n />\n )}\n\n {meta.inputType === 'select' && (\n <SelectInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n presets={meta.presets ?? []}\n unit={meta.unit}\n />\n )}\n\n {meta.inputType === 'number' && (\n <NumberInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n min={meta.min}\n max={meta.max}\n unit={meta.unit}\n />\n )}\n\n {meta.inputType === 'tokenList' && (\n <TokenListInput value={currentValue} onChange={(value) => onChange(setting.key, value)} />\n )}\n\n {meta.inputType === 'text' && (\n <input\n type=\"text\"\n value={currentValue}\n onChange={(e) => onChange(setting.key, e.target.value)}\n className=\"cedros-setting-input\"\n placeholder={meta.label}\n />\n )}\n\n {meta.inputType === 'tokenSymbolList' && (\n <TokenSymbolListInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n />\n )}\n\n {warning && <div className=\"cedros-setting-warning\">{warning}</div>}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// INPUT COMPONENTS\n// =============================================================================\n\ninterface DurationInputProps {\n value: string;\n onChange: (value: string) => void;\n presets?: { label: string; value: string }[];\n min?: number;\n}\n\nfunction DurationInput({ value, onChange, presets, min = 0 }: DurationInputProps) {\n const numValue = parseInt(value, 10) || 0;\n const displayValue = formatDuration(numValue);\n\n const handlePresetChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value) {\n onChange(e.target.value);\n }\n },\n [onChange]\n );\n\n const handleCustomChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Math.max(min, parseInt(e.target.value, 10) || 0);\n onChange(String(newValue));\n },\n [onChange, min]\n );\n\n return (\n <div className=\"cedros-duration-input\">\n {presets && presets.length > 0 && (\n <select\n value={presets.find((p) => p.value === value)?.value ?? ''}\n onChange={handlePresetChange}\n className=\"cedros-setting-select\"\n >\n <option value=\"\">Custom...</option>\n {presets.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {preset.label}\n </option>\n ))}\n </select>\n )}\n <div className=\"cedros-duration-custom\">\n <input\n type=\"number\"\n value={numValue}\n onChange={handleCustomChange}\n min={min}\n className=\"cedros-setting-input cedros-setting-input-sm\"\n />\n <span className=\"cedros-setting-unit\">seconds</span>\n <span className=\"cedros-duration-display\">= {displayValue}</span>\n </div>\n </div>\n );\n}\n\ninterface PercentageInputProps {\n value: string;\n onChange: (value: string) => void;\n min: number;\n max: number;\n step: number;\n presets?: { label: string; value: string }[];\n}\n\nfunction PercentageInput({ value, onChange, min, max, step, presets }: PercentageInputProps) {\n const numValue = parseInt(value, 10) || min;\n\n const handleSliderChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n const handlePresetClick = useCallback(\n (presetValue: string) => {\n onChange(presetValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-percentage-input\">\n <div className=\"cedros-percentage-slider-row\">\n <input\n type=\"range\"\n value={numValue}\n onChange={handleSliderChange}\n min={min}\n max={max}\n step={step}\n className=\"cedros-percentage-slider\"\n />\n <span className=\"cedros-percentage-value\">{numValue}%</span>\n </div>\n {presets && presets.length > 0 && (\n <div className=\"cedros-preset-buttons\">\n {presets.map((preset) => (\n <button\n key={preset.value}\n type=\"button\"\n className={`cedros-preset-button ${preset.value === value ? 'cedros-preset-button-active' : ''}`}\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface SelectInputProps {\n value: string;\n onChange: (value: string) => void;\n presets: { label: string; value: string }[];\n unit?: string;\n}\n\nfunction SelectInput({ value, onChange, presets, unit }: SelectInputProps) {\n const isCustomValue = !presets.some((p) => p.value === value);\n\n const handleSelectChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value !== '__custom__') {\n onChange(e.target.value);\n }\n },\n [onChange]\n );\n\n const handleCustomChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-select-input\">\n <select\n value={isCustomValue ? '__custom__' : value}\n onChange={handleSelectChange}\n className=\"cedros-setting-select\"\n >\n {presets.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {preset.label}\n </option>\n ))}\n <option value=\"__custom__\">Custom...</option>\n </select>\n {isCustomValue && (\n <div className=\"cedros-select-custom\">\n <input\n type=\"number\"\n value={value}\n onChange={handleCustomChange}\n className=\"cedros-setting-input cedros-setting-input-sm\"\n />\n {unit && <span className=\"cedros-setting-unit\">{unit}</span>}\n </div>\n )}\n </div>\n );\n}\n\ninterface NumberInputProps {\n value: string;\n onChange: (value: string) => void;\n min?: number;\n max?: number;\n unit?: string;\n}\n\nfunction NumberInput({ value, onChange, min, max, unit }: NumberInputProps) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-number-input\">\n <input\n type=\"number\"\n value={value}\n onChange={handleChange}\n min={min}\n max={max}\n className=\"cedros-setting-input\"\n />\n {unit && <span className=\"cedros-setting-unit\">{unit}</span>}\n </div>\n );\n}\n\n// =============================================================================\n// TOKEN LIST INPUT\n// =============================================================================\n\n/** Preset tokens that are always available without needing to be redefined */\nconst PRESET_TOKEN_SYMBOLS = [\n 'SOL',\n 'USDC',\n 'USDT',\n 'EURC',\n 'USD1',\n 'PYUSD',\n 'USDH',\n 'CASH',\n 'BONK',\n 'ORE',\n];\n\ninterface TokenDefinition {\n symbol: string;\n mint: string;\n decimals: number;\n logoUrl?: string;\n}\n\ninterface TokenListInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction TokenListInput({ value, onChange }: TokenListInputProps) {\n const tokens: TokenDefinition[] = useMemo(() => {\n try {\n return JSON.parse(value || '[]');\n } catch {\n return [];\n }\n }, [value]);\n\n const updateTokens = useCallback(\n (updated: TokenDefinition[]) => {\n onChange(JSON.stringify(updated));\n },\n [onChange]\n );\n\n const addToken = useCallback(() => {\n updateTokens([...tokens, { symbol: '', mint: '', decimals: 6 }]);\n }, [tokens, updateTokens]);\n\n const updateToken = useCallback(\n (index: number, field: keyof TokenDefinition, val: string | number | undefined) => {\n const updated = [...tokens];\n updated[index] = { ...updated[index], [field]: val };\n updateTokens(updated);\n },\n [tokens, updateTokens]\n );\n\n const removeToken = useCallback(\n (index: number) => {\n updateTokens(tokens.filter((_, i) => i !== index));\n },\n [tokens, updateTokens]\n );\n\n return (\n <div className=\"cedros-token-list-input\">\n {/* Preset tokens info */}\n <div className=\"cedros-token-presets\">\n <span className=\"cedros-token-presets-label\">Built-in tokens:</span>\n <div className=\"cedros-token-presets-list\">\n {PRESET_TOKEN_SYMBOLS.map((symbol) => (\n <span key={symbol} className=\"cedros-token-preset-chip\">\n {symbol}\n </span>\n ))}\n </div>\n </div>\n\n {tokens.length === 0 && (\n <p className=\"cedros-token-list-empty\">\n No custom tokens added. Use the built-in tokens above or add your own.\n </p>\n )}\n\n {tokens.map((token, i) => (\n <div key={i} className=\"cedros-token-row\">\n <div className=\"cedros-token-row-fields\">\n <input\n type=\"text\"\n placeholder=\"Symbol\"\n value={token.symbol}\n onChange={(e) => updateToken(i, 'symbol', e.target.value.toUpperCase())}\n className=\"cedros-setting-input cedros-token-input-symbol\"\n maxLength={10}\n />\n <input\n type=\"text\"\n placeholder=\"Mint address\"\n value={token.mint}\n onChange={(e) => updateToken(i, 'mint', e.target.value)}\n className=\"cedros-setting-input cedros-token-input-mint\"\n />\n <input\n type=\"number\"\n placeholder=\"Decimals\"\n value={token.decimals}\n onChange={(e) => updateToken(i, 'decimals', parseInt(e.target.value, 10) || 0)}\n className=\"cedros-setting-input cedros-token-input-decimals\"\n min={0}\n max={18}\n />\n <input\n type=\"text\"\n placeholder=\"Logo URL (optional)\"\n value={token.logoUrl || ''}\n onChange={(e) => updateToken(i, 'logoUrl', e.target.value || undefined)}\n className=\"cedros-setting-input cedros-token-input-logo\"\n />\n </div>\n <button\n type=\"button\"\n className=\"cedros-token-remove-btn\"\n onClick={() => removeToken(i)}\n title=\"Remove token\"\n >\n ×\n </button>\n </div>\n ))}\n\n <button type=\"button\" className=\"cedros-token-add-btn\" onClick={addToken}>\n + Add Token\n </button>\n </div>\n );\n}\n\n// =============================================================================\n// TOKEN SYMBOL LIST INPUT\n// =============================================================================\n\ninterface TokenSymbolListInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction TokenSymbolListInput({ value, onChange }: TokenSymbolListInputProps) {\n const symbols = useMemo(() => {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }, [value]);\n\n const addSymbol = useCallback(\n (symbol: string) => {\n if (!symbol || symbols.includes(symbol)) return;\n const updated = [...symbols, symbol].join(', ');\n onChange(updated);\n },\n [symbols, onChange]\n );\n\n const removeSymbol = useCallback(\n (symbol: string) => {\n const updated = symbols.filter((s) => s !== symbol).join(', ');\n onChange(updated);\n },\n [symbols, onChange]\n );\n\n return (\n <div className=\"cedros-token-symbol-list-input\">\n {/* Preset tokens - click to add */}\n <div className=\"cedros-token-presets\">\n <span className=\"cedros-token-presets-label\">Click to add:</span>\n <div className=\"cedros-token-presets-list\">\n {PRESET_TOKEN_SYMBOLS.map((symbol) => {\n const isSelected = symbols.includes(symbol);\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-token-preset-chip ${isSelected ? 'cedros-token-preset-chip-selected' : ''}`}\n onClick={() => (isSelected ? removeSymbol(symbol) : addSymbol(symbol))}\n title={isSelected ? `Remove ${symbol}` : `Add ${symbol}`}\n >\n {symbol}\n {isSelected && <span className=\"cedros-token-chip-check\">✓</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Text input for manual entry or custom symbols */}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"cedros-setting-input\"\n placeholder=\"USDC, SOL, BONK...\"\n />\n </div>\n );\n}\n","import type {\n Organization,\n OrgWithMembership,\n CreateOrgRequest,\n UpdateOrgRequest,\n ListOrgsResponse,\n AuthorizeRequest,\n AuthorizeResponse,\n PermissionsResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for organization operations\n */\nexport class OrgApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all organizations the current user belongs to\n */\n async listOrgs(): Promise<OrgWithMembership[]> {\n try {\n const response = await this.client.get<ListOrgsResponse>('/orgs');\n return response.orgs.map((org) => ({\n ...org,\n membership: {\n orgId: org.id,\n role: org.role,\n },\n }));\n } catch (error) {\n throw handleApiError(error, 'Failed to list organizations');\n }\n }\n\n /**\n * Get a single organization by ID\n */\n async getOrg(orgId: string): Promise<Organization> {\n try {\n return await this.client.get<Organization>(`/orgs/${orgId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to get organization');\n }\n }\n\n /**\n * Create a new organization\n */\n async createOrg(data: CreateOrgRequest): Promise<Organization> {\n try {\n return await this.client.post<Organization>('/orgs', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to create organization');\n }\n }\n\n /**\n * Update an organization\n */\n async updateOrg(orgId: string, data: UpdateOrgRequest): Promise<Organization> {\n try {\n return await this.client.patch<Organization>(`/orgs/${orgId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update organization');\n }\n }\n\n /**\n * Delete an organization\n */\n async deleteOrg(orgId: string): Promise<void> {\n try {\n await this.client.delete<void>(`/orgs/${orgId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to delete organization');\n }\n }\n\n /**\n * Check authorization for an action\n */\n async authorize(data: AuthorizeRequest): Promise<AuthorizeResponse> {\n try {\n return await this.client.post<AuthorizeResponse>('/authorize', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to check authorization');\n }\n }\n\n /**\n * Get current user's permissions in an organization\n */\n async getPermissions(orgId: string): Promise<PermissionsResponse> {\n try {\n return await this.client.post<PermissionsResponse>('/permissions', { orgId });\n } catch (error) {\n throw handleApiError(error, 'Failed to get permissions');\n }\n }\n}\n","import { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type {\n OrgWithMembership,\n Organization,\n CreateOrgRequest,\n UpdateOrgRequest,\n Permission,\n OrgRole,\n AuthError,\n} from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { OrgApiClient } from '../utils/orgApi';\n\nexport interface UseOrgsReturn {\n /** All organizations the user belongs to */\n orgs: OrgWithMembership[];\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** User's permissions in the active org */\n permissions: Permission[];\n /** User's role in the active org */\n role: OrgRole | null;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh organizations list */\n fetchOrgs: () => Promise<void>;\n /** Switch to a different organization */\n switchOrg: (orgId: string) => Promise<void>;\n /** Create a new organization */\n createOrg: (data: CreateOrgRequest) => Promise<Organization>;\n /** Update an organization */\n updateOrg: (orgId: string, data: UpdateOrgRequest) => Promise<Organization>;\n /** Delete an organization */\n deleteOrg: (orgId: string) => Promise<void>;\n /** Check if user has a specific permission */\n hasPermission: (permission: Permission) => boolean;\n}\n\nconst ACTIVE_ORG_KEY = 'cedros_active_org';\n\n// P-06: Safe localStorage helpers to handle private browsing and quota errors\nfunction safeGetItem(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSetItem(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Ignore - private browsing or quota exceeded\n }\n}\n\n/**\n * Hook for managing organizations, memberships, and permissions.\n *\n * @example\n * ```tsx\n * function OrgSelector() {\n * const { orgs, activeOrg, switchOrg, hasPermission } = useOrgs();\n *\n * return (\n * <select\n * value={activeOrg?.id}\n * onChange={(e) => switchOrg(e.target.value)}\n * >\n * {orgs.map(org => (\n * <option key={org.id} value={org.id}>{org.name}</option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */\nexport function useOrgs(): UseOrgsReturn {\n const { config, user, authState, _internal } = useCedrosLogin();\n const hasStorage = typeof window !== 'undefined' && !!window.localStorage;\n\n const [orgs, setOrgs] = useState<OrgWithMembership[]>([]);\n const [activeOrg, setActiveOrg] = useState<OrgWithMembership | null>(null);\n const [permissions, setPermissions] = useState<Permission[]>([]);\n const [role, setRole] = useState<OrgRole | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n // M-03: Memoize API client and use ref to prevent callback dependency cascades\n const apiClient = useMemo(\n () =>\n new OrgApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // M-03: Store apiClient in ref to stabilize callback dependencies\n const apiClientRef = useRef(apiClient);\n useEffect(() => {\n apiClientRef.current = apiClient;\n }, [apiClient]);\n\n // M-03: Use ref in callback to break dependency chain\n const loadPermissions = useCallback(async (orgId: string) => {\n try {\n const response = await apiClientRef.current.getPermissions(orgId);\n setPermissions(response.permissions);\n setRole(response.role);\n } catch {\n // Permissions loading failure is non-fatal, just clear them\n setPermissions([]);\n setRole(null);\n }\n }, []);\n\n // M-03: Use ref to break apiClient dependency chain\n const fetchOrgs = useCallback(async () => {\n if (authState !== 'authenticated' || !user) {\n setOrgs([]);\n setActiveOrg(null);\n setPermissions([]);\n setRole(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const fetchedOrgs = await apiClientRef.current.listOrgs();\n setOrgs(fetchedOrgs);\n\n // P-06: Restore active org from localStorage with safe access\n const savedOrgId = hasStorage ? safeGetItem(ACTIVE_ORG_KEY) : null;\n let selectedOrg = fetchedOrgs.find((org) => org.id === savedOrgId);\n\n if (!selectedOrg && fetchedOrgs.length > 0) {\n // Default to personal org or first org\n selectedOrg = fetchedOrgs.find((org) => org.isPersonal) || fetchedOrgs[0];\n }\n\n if (selectedOrg) {\n setActiveOrg(selectedOrg);\n if (hasStorage) {\n safeSetItem(ACTIVE_ORG_KEY, selectedOrg.id);\n }\n await loadPermissions(selectedOrg.id);\n } else {\n setActiveOrg(null);\n setPermissions([]);\n setRole(null);\n }\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [authState, user, loadPermissions, hasStorage]);\n\n const switchOrg = useCallback(\n async (orgId: string) => {\n const org = orgs.find((o) => o.id === orgId);\n if (!org) {\n setError({ code: 'UNKNOWN_ERROR', message: 'Organization not found' });\n return;\n }\n\n setActiveOrg(org);\n if (hasStorage) {\n safeSetItem(ACTIVE_ORG_KEY, orgId);\n }\n await loadPermissions(orgId);\n },\n [orgs, loadPermissions, hasStorage]\n );\n\n // M-03: Use ref to break apiClient dependency chain\n const createOrg = useCallback(\n async (data: CreateOrgRequest): Promise<Organization> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newOrg = await apiClientRef.current.createOrg(data);\n // Refresh orgs list to include the new org with membership\n await fetchOrgs();\n return newOrg;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [fetchOrgs]\n );\n\n const updateOrg = useCallback(\n async (orgId: string, data: UpdateOrgRequest): Promise<Organization> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const updatedOrg = await apiClientRef.current.updateOrg(orgId, data);\n // Refresh orgs list to reflect changes\n await fetchOrgs();\n return updatedOrg;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [fetchOrgs]\n );\n\n const deleteOrg = useCallback(\n async (orgId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.deleteOrg(orgId);\n // Refresh orgs list\n await fetchOrgs();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [fetchOrgs]\n );\n\n const hasPermission = useCallback(\n (permission: Permission): boolean => {\n return permissions.includes(permission);\n },\n [permissions]\n );\n\n return {\n orgs,\n activeOrg,\n permissions,\n role,\n isLoading,\n error,\n fetchOrgs,\n switchOrg,\n createOrg,\n updateOrg,\n deleteOrg,\n hasPermission,\n };\n}\n","import type {\n Member,\n MemberApiResponse,\n UpdateMemberRoleRequest,\n ListMembersResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for member operations within an organization\n */\nexport class MemberApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all members of an organization\n */\n async listMembers(\n orgId: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ members: Member[]; total: number }> {\n try {\n const response = await this.client.get<ListMembersResponse>(\n `/orgs/${orgId}/members?limit=${limit}&offset=${offset}`\n );\n return {\n members: response.members.map((member: MemberApiResponse) => ({\n id: member.id,\n userId: member.userId,\n orgId,\n role: member.role,\n joinedAt: member.joinedAt,\n user: {\n id: member.userId,\n email: member.email,\n name: member.name,\n },\n })),\n total: response.total,\n };\n } catch (error) {\n throw handleApiError(error, 'Failed to list members');\n }\n }\n\n /**\n * Update a member's role\n */\n async updateMemberRole(\n orgId: string,\n userId: string,\n data: UpdateMemberRoleRequest\n ): Promise<Member> {\n try {\n return await this.client.patch<Member>(`/orgs/${orgId}/members/${userId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update member role');\n }\n }\n\n /**\n * Remove a member from the organization\n */\n async removeMember(orgId: string, userId: string): Promise<void> {\n try {\n await this.client.delete<void>(`/orgs/${orgId}/members/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to remove member');\n }\n }\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport type { Member, OrgRole, AuthError } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { MemberApiClient } from '../utils/memberApi';\n\nexport interface UseMembersReturn {\n /** List of members */\n members: Member[];\n /** Total members available on the server */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh members list */\n fetchMembers: (options?: { limit?: number; offset?: number }) => Promise<void>;\n /** Update a member's role */\n updateMemberRole: (userId: string, role: OrgRole) => Promise<void>;\n /** Remove a member */\n removeMember: (userId: string) => Promise<void>;\n}\n\n/**\n * Hook for managing organization members.\n *\n * @param orgId - The organization ID to manage members for\n *\n * @example\n * ```tsx\n * function MembersList() {\n * const { activeOrg } = useOrgs();\n * const { members, isLoading, updateMemberRole, removeMember } = useMembers(activeOrg?.id);\n *\n * if (!activeOrg) return null;\n *\n * return (\n * <ul>\n * {members.map(member => (\n * <li key={member.id}>\n * {member.user.name} - {member.role}\n * <button onClick={() => updateMemberRole(member.userId, 'admin')}>\n * Make Admin\n * </button>\n * <button onClick={() => removeMember(member.userId)}>\n * Remove\n * </button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useMembers(orgId: string | undefined): UseMembersReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [members, setMembers] = useState<Member[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n // P-12: Track fetched orgId to prevent duplicate fetches on remount\n const fetchedOrgIdRef = useRef<string | undefined>(undefined);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new MemberApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // C-02: Use ref to avoid apiClient in callback dependencies\n // Prevents infinite loop when apiClient identity changes\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchMembers = useCallback(\n async (options?: { limit?: number; offset?: number }) => {\n if (!orgId || authState !== 'authenticated') {\n setMembers([]);\n setTotal(0);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const { limit = 50, offset = 0 } = options ?? {};\n const response = await apiClientRef.current.listMembers(orgId, limit, offset);\n if (requestId !== requestIdRef.current) return;\n setMembers(response.members);\n setTotal(response.total);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err as AuthError);\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n },\n [orgId, authState]\n );\n\n // P-12: Auto-fetch when orgId changes, but not on every remount\n useEffect(() => {\n if (authState !== 'authenticated') {\n fetchedOrgIdRef.current = undefined;\n return;\n }\n\n if (orgId !== fetchedOrgIdRef.current) {\n fetchedOrgIdRef.current = orgId;\n fetchMembers();\n }\n }, [orgId, authState, fetchMembers]);\n\n const updateMemberRole = useCallback(\n async (userId: string, role: OrgRole): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.updateMemberRole(orgId, userId, { role });\n // Refresh members list\n await fetchMembers();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchMembers]\n );\n\n const removeMember = useCallback(\n async (userId: string): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.removeMember(orgId, userId);\n // Refresh members list\n await fetchMembers();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchMembers]\n );\n\n return {\n members,\n total,\n isLoading,\n error,\n fetchMembers,\n updateMemberRole,\n removeMember,\n };\n}\n","import type {\n Invite,\n InviteApiResponse,\n CreateInviteRequest,\n AcceptInviteRequest,\n ListInvitesResponse,\n CreateInviteResponse,\n AcceptInviteResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for invite operations\n */\nexport class InviteApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all pending invites for an organization\n */\n async listInvites(\n orgId: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ invites: Invite[]; total: number }> {\n try {\n const response = await this.client.get<ListInvitesResponse>(\n `/orgs/${orgId}/invites?limit=${limit}&offset=${offset}`\n );\n return {\n invites: response.invites.map((invite: InviteApiResponse) => ({\n id: invite.id,\n orgId: invite.orgId,\n email: invite.email,\n role: invite.role,\n invitedBy: invite.invitedBy,\n createdAt: invite.createdAt,\n expiresAt: invite.expiresAt,\n })),\n total: response.total,\n };\n } catch (error) {\n throw handleApiError(error, 'Failed to list invites');\n }\n }\n\n /**\n * Create a new invite\n */\n async createInvite(orgId: string, data: CreateInviteRequest): Promise<CreateInviteResponse> {\n try {\n return await this.client.post<CreateInviteResponse>(`/orgs/${orgId}/invites`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to create invite');\n }\n }\n\n /**\n * Cancel a pending invite\n */\n async cancelInvite(orgId: string, inviteId: string): Promise<void> {\n try {\n await this.client.delete<void>(`/orgs/${orgId}/invites/${inviteId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to cancel invite');\n }\n }\n\n /**\n * Resend an invite email\n */\n async resendInvite(orgId: string, inviteId: string): Promise<void> {\n try {\n await this.client.post<void>(`/orgs/${orgId}/invites/${inviteId}/resend`, {});\n } catch (error) {\n throw handleApiError(error, 'Failed to resend invite');\n }\n }\n\n /**\n * Accept an invite (public endpoint)\n */\n async acceptInvite(data: AcceptInviteRequest): Promise<AcceptInviteResponse> {\n try {\n return await this.client.post<AcceptInviteResponse>('/invites/accept', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to accept invite');\n }\n }\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport type { Invite, OrgRole, AuthError, AcceptInviteResponse } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { InviteApiClient } from '../utils/inviteApi';\n\nexport interface UseInvitesReturn {\n /** List of pending invites */\n invites: Invite[];\n /** Total pending invites available on the server */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh invites list */\n fetchInvites: (options?: { limit?: number; offset?: number }) => Promise<void>;\n /** Create a new invite */\n createInvite: (email: string, role?: Exclude<OrgRole, 'owner'>) => Promise<void>;\n /** Cancel a pending invite */\n cancelInvite: (inviteId: string) => Promise<void>;\n /** Resend an invite email */\n resendInvite: (inviteId: string) => Promise<void>;\n /** Accept an invite (public) */\n acceptInvite: (token: string) => Promise<AcceptInviteResponse>;\n}\n\n/**\n * Hook for managing organization invites.\n *\n * @param orgId - The organization ID to manage invites for\n *\n * @example\n * ```tsx\n * function InviteManager() {\n * const { activeOrg } = useOrgs();\n * const { invites, createInvite, cancelInvite, resendInvite } = useInvites(activeOrg?.id);\n *\n * const handleInvite = async (email: string) => {\n * await createInvite(email, 'member');\n * };\n *\n * return (\n * <div>\n * <InviteForm onSubmit={handleInvite} />\n * <ul>\n * {invites.map(invite => (\n * <li key={invite.id}>\n * {invite.email} ({invite.role})\n * <button onClick={() => resendInvite(invite.id)}>Resend</button>\n * <button onClick={() => cancelInvite(invite.id)}>Cancel</button>\n * </li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useInvites(orgId: string | undefined): UseInvitesReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [invites, setInvites] = useState<Invite[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n // P-13: Track fetched orgId to prevent duplicate fetches on remount\n const fetchedOrgIdRef = useRef<string | undefined>(undefined);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new InviteApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // H-02: Use ref to avoid apiClient in callback dependencies\n // Prevents infinite loop when apiClient identity changes\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchInvites = useCallback(\n async (options?: { limit?: number; offset?: number }) => {\n if (!orgId || authState !== 'authenticated') {\n setInvites([]);\n setTotal(0);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const { limit = 50, offset = 0 } = options ?? {};\n const response = await apiClientRef.current.listInvites(orgId, limit, offset);\n if (requestId !== requestIdRef.current) return;\n setInvites(response.invites);\n setTotal(response.total);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err as AuthError);\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n },\n [orgId, authState]\n );\n\n // P-13: Auto-fetch when orgId changes, but not on every remount\n useEffect(() => {\n if (authState !== 'authenticated') {\n fetchedOrgIdRef.current = undefined;\n return;\n }\n\n if (orgId !== fetchedOrgIdRef.current) {\n fetchedOrgIdRef.current = orgId;\n fetchInvites();\n }\n }, [orgId, authState, fetchInvites]);\n\n const createInvite = useCallback(\n async (email: string, role: Exclude<OrgRole, 'owner'> = 'member'): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.createInvite(orgId, { email, role });\n // Refresh invites list\n await fetchInvites();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchInvites]\n );\n\n const cancelInvite = useCallback(\n async (inviteId: string): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.cancelInvite(orgId, inviteId);\n // Refresh invites list\n await fetchInvites();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchInvites]\n );\n\n const resendInvite = useCallback(\n async (inviteId: string): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.resendInvite(orgId, inviteId);\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId]\n );\n\n const acceptInvite = useCallback(async (token: string): Promise<AcceptInviteResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClientRef.current.acceptInvite({ token });\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n return {\n invites,\n total,\n isLoading,\n error,\n fetchInvites,\n createInvite,\n cancelInvite,\n resendInvite,\n acceptInvite,\n };\n}\n","/**\n * Hook for credit balance and transaction history\n *\n * Provides access to the user's credit balance and transaction history.\n * Credits are earned through Privacy Cash deposits.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseCreditsReturn,\n CreditBalanceResponse,\n CreditHistoryResponse,\n BalancesResponse,\n} from '../types/deposit';\n\nexport type { UseCreditsReturn } from '../types/deposit';\n\n/**\n * Hook for credit balance and transaction history\n *\n * Credits represent the user's balance from Privacy Cash deposits.\n * The balance can be used for services within the application.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useCredits(): UseCreditsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const getBalance = useCallback(async (): Promise<CreditBalanceResponse> => {\n if (!apiClient) {\n throw new Error('useCredits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<CreditBalanceResponse>('/credits/balance/sol');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch credit balance');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getAllBalances = useCallback(async (): Promise<CreditBalanceResponse[]> => {\n if (!apiClient) {\n throw new Error('useCredits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<BalancesResponse>('/credits/balance');\n return data.balances;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch credit balances');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getHistory = useCallback(\n async (options?: {\n currency?: string;\n limit?: number;\n offset?: number;\n }): Promise<CreditHistoryResponse> => {\n if (!apiClient) {\n throw new Error('useCredits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.currency) params.set('currency', options.currency);\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n\n const queryString = params.toString();\n const url = queryString ? `/credits/history?${queryString}` : '/credits/history';\n\n const data = await apiClient.get<CreditHistoryResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch transaction history');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n return {\n getBalance,\n getAllBalances,\n getHistory,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Provides admin-only access to view all deposits, statistics, and pending withdrawals.\n * Requires system admin privileges.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseAdminDepositsReturn,\n AdminDepositListResponse,\n AdminDepositStatsResponse,\n ProcessWithdrawalRequest,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n PrivacyStatusResponse,\n AdminCreditStatsResponse,\n} from '../types/deposit';\n\nexport type { UseAdminDepositsReturn } from '../types/deposit';\n\n/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Requires system admin privileges. All methods will fail with 403 if not admin.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useAdminDeposits(): UseAdminDepositsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const listDeposits = useCallback(\n async (options?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/deposits?${query}` : '/admin/deposits';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminDepositStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminDepositStatsResponse>('/admin/deposits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listInPrivacyPeriod = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query\n ? `/admin/deposits/in-privacy-period?${query}`\n : '/admin/deposits/in-privacy-period';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits in privacy period');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const listPendingWithdrawals = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/withdrawals/pending?${query}` : '/admin/withdrawals/pending';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list pending withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processWithdrawal = useCallback(\n async (\n sessionId: string,\n options?: ProcessWithdrawalRequest\n ): Promise<ProcessWithdrawalResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessWithdrawalResponse>(\n `/admin/withdrawals/${sessionId}/process`,\n options ?? {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawal');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processAllWithdrawals = useCallback(async (): Promise<ProcessAllWithdrawalsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessAllWithdrawalsResponse>(\n '/admin/withdrawals/process-all',\n {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getPrivacyStatus = useCallback(async (): Promise<PrivacyStatusResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PrivacyStatusResponse>('/admin/privacy/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get privacy status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getCreditStats = useCallback(async (): Promise<AdminCreditStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminCreditStatsResponse>('/admin/credits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get credit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n return {\n listDeposits,\n getStats,\n listInPrivacyPeriod,\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n getPrivacyStatus,\n getCreditStats,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Admin deposit statistics component\n *\n * Shows aggregate statistics for Privacy Cash deposits.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositStatsResponse } from '../../../types/deposit';\n\nexport interface AdminDepositStatsProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when stats are loaded */\n onLoad?: (stats: AdminDepositStatsResponse) => void;\n}\n\n/**\n * Admin deposit statistics display\n *\n * Shows total deposits, withdrawals, and pending amounts.\n */\nexport function AdminDepositStats({\n refreshInterval = 0,\n className = '',\n onLoad,\n}: AdminDepositStatsProps) {\n const { getStats, isLoading, error, clearError } = useAdminDeposits();\n\n const [stats, setStats] = useState<AdminDepositStatsResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchStats = useCallback(async () => {\n try {\n const result = await getStats();\n setStats(result);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load stats');\n }\n }, [getStats, onLoad]);\n\n // Fetch on mount\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchStats, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchStats]);\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-error ${className}`}>\n <p className=\"cedros-admin-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchStats();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !stats) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading statistics...</span>\n </div>\n );\n }\n\n if (!stats) {\n return null;\n }\n\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <div className=\"cedros-admin-stats-header\">\n <h4 className=\"cedros-admin-stats-title\">Deposit Statistics</h4>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchStats}\n disabled={isLoading}\n title=\"Refresh stats\"\n aria-label=\"Refresh stats\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {/* Basic Stats */}\n <div className=\"cedros-admin-stats-grid\">\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Deposits</span>\n <span className=\"cedros-admin-stat-value\">{stats.totalDeposits}</span>\n <span className=\"cedros-admin-stat-sub\">{stats.totalDepositedSol.toFixed(4)} SOL</span>\n </div>\n\n <div className=\"cedros-admin-stat-card cedros-admin-stat-pending\">\n <span className=\"cedros-admin-stat-label\">Pending Withdrawal</span>\n <span className=\"cedros-admin-stat-value\">{stats.pendingWithdrawalCount}</span>\n <span className=\"cedros-admin-stat-sub\">{stats.pendingWithdrawalSol.toFixed(4)} SOL</span>\n </div>\n\n <div className=\"cedros-admin-stat-card cedros-admin-stat-success\">\n <span className=\"cedros-admin-stat-label\">Withdrawn</span>\n <span className=\"cedros-admin-stat-value\">{stats.totalWithdrawnCount}</span>\n <span className=\"cedros-admin-stat-sub\">{stats.totalWithdrawnSol.toFixed(4)} SOL</span>\n </div>\n\n <div className=\"cedros-admin-stat-card cedros-admin-stat-error\">\n <span className=\"cedros-admin-stat-label\">Failed</span>\n <span className=\"cedros-admin-stat-value\">{stats.failedCount}</span>\n </div>\n </div>\n\n {/* Ready vs Privacy Period */}\n {(stats.readyForWithdrawalCount !== undefined ||\n stats.inPrivacyPeriodCount !== undefined) && (\n <div className=\"cedros-admin-stats-section\">\n <h5 className=\"cedros-admin-stats-section-title\">Withdrawal Status</h5>\n <div className=\"cedros-admin-stats-grid\">\n <div className=\"cedros-admin-stat-card cedros-admin-stat-ready\">\n <span className=\"cedros-admin-stat-label\">Ready Now</span>\n <span className=\"cedros-admin-stat-value\">{stats.readyForWithdrawalCount ?? 0}</span>\n <span className=\"cedros-admin-stat-sub\">\n {(stats.readyForWithdrawalSol ?? 0).toFixed(4)} SOL\n </span>\n </div>\n\n <div className=\"cedros-admin-stat-card cedros-admin-stat-waiting\">\n <span className=\"cedros-admin-stat-label\">In Privacy Period</span>\n <span className=\"cedros-admin-stat-value\">{stats.inPrivacyPeriodCount ?? 0}</span>\n <span className=\"cedros-admin-stat-sub\">\n {(stats.inPrivacyPeriodSol ?? 0).toFixed(4)} SOL\n </span>\n </div>\n </div>\n </div>\n )}\n\n {/* Input Token Breakdown */}\n {(stats.usdcDepositCount !== undefined || stats.usdtDepositCount !== undefined) && (\n <div className=\"cedros-admin-stats-section\">\n <h5 className=\"cedros-admin-stats-section-title\">Input Tokens</h5>\n <div className=\"cedros-admin-stats-grid\">\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">USDC Deposits</span>\n <span className=\"cedros-admin-stat-value\">{stats.usdcDepositCount ?? 0}</span>\n <span className=\"cedros-admin-stat-sub\">\n ${(stats.totalUsdcDisplay ?? 0).toFixed(2)}\n </span>\n </div>\n\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">USDT Deposits</span>\n <span className=\"cedros-admin-stat-value\">{stats.usdtDepositCount ?? 0}</span>\n <span className=\"cedros-admin-stat-sub\">\n ${(stats.totalUsdtDisplay ?? 0).toFixed(2)}\n </span>\n </div>\n\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Native SOL</span>\n <span className=\"cedros-admin-stat-value\">{stats.nativeSolDepositCount ?? 0}</span>\n <span className=\"cedros-admin-stat-sub\">\n {(stats.totalNativeSolDisplay ?? 0).toFixed(4)} SOL\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Admin deposit list component\n *\n * Shows a paginated list of all deposits across all users.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\n\nexport interface AdminDepositListProps {\n /** Filter by status (comma-separated) */\n statusFilter?: string;\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit is clicked */\n onDepositClick?: (deposit: AdminDepositItem) => void;\n}\n\ntype DepositStatusType =\n | 'pending'\n | 'detected'\n | 'processing'\n | 'completed'\n | 'withdrawn'\n | 'partially_withdrawn'\n | 'expired'\n | 'failed';\n\nfunction getStatusLabel(status: DepositStatusType): string {\n const labels: Record<DepositStatusType, string> = {\n pending: 'Pending',\n detected: 'Detected',\n processing: 'Processing',\n completed: 'Completed',\n withdrawn: 'Withdrawn',\n partially_withdrawn: 'Partially Withdrawn',\n expired: 'Expired',\n failed: 'Failed',\n };\n return labels[status] || status;\n}\n\nfunction getStatusClass(status: DepositStatusType): string {\n if (status === 'completed' || status === 'withdrawn' || status === 'partially_withdrawn') {\n return 'cedros-admin-deposit-success';\n }\n if (status === 'failed' || status === 'expired') return 'cedros-admin-deposit-error';\n if (status === 'processing' || status === 'detected') return 'cedros-admin-deposit-processing';\n return 'cedros-admin-deposit-pending';\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin deposit list display\n *\n * Shows paginated list of all deposits with user info.\n */\nexport function AdminDepositList({\n statusFilter,\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onDepositClick,\n}: AdminDepositListProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [deposits, setDeposits] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const result = await listDeposits({ status: statusFilter, limit: pageSize, offset });\n setDeposits(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load deposits');\n }\n }, [statusFilter, pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when filters change\n useEffect(() => {\n setOffset(0);\n }, [statusFilter, pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchDeposits();\n }, [fetchDeposits]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchDeposits, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchDeposits]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchDeposits();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && deposits.length === 0) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading deposits...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-deposit-list ${className}`}>\n <div className=\"cedros-admin-deposit-list-header\">\n <h4 className=\"cedros-admin-deposit-list-title\">All Deposits</h4>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchDeposits}\n disabled={isLoading}\n title=\"Refresh deposits\"\n aria-label=\"Refresh deposits\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {deposits.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-deposit-table\">\n <div className=\"cedros-admin-deposit-thead\">\n <div className=\"cedros-admin-deposit-th\">User</div>\n <div className=\"cedros-admin-deposit-th\">Amount</div>\n <div className=\"cedros-admin-deposit-th\">Status</div>\n <div className=\"cedros-admin-deposit-th\">Created</div>\n <div className=\"cedros-admin-deposit-th\">Tx</div>\n </div>\n {deposits.map((deposit) => (\n <div\n key={deposit.id}\n className={`cedros-admin-deposit-row ${getStatusClass(deposit.status)}`}\n onClick={() => onDepositClick?.(deposit)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onDepositClick?.(deposit);\n }\n }}\n role={onDepositClick ? 'button' : undefined}\n tabIndex={onDepositClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-deposit-td\" title={deposit.userId}>\n {truncateId(deposit.userId)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n {formatAmount(deposit.amountLamports)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n <span className=\"cedros-admin-status-badge\">\n {getStatusLabel(deposit.status)}\n </span>\n </div>\n <div className=\"cedros-admin-deposit-td\">{formatDate(deposit.createdAt)}</div>\n <div className=\"cedros-admin-deposit-td\" title={deposit.txSignature || undefined}>\n {deposit.txSignature ? truncateId(deposit.txSignature) : '—'}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin withdrawal queue component\n *\n * Shows deposits that are ready for withdrawal (privacy period elapsed).\n * Includes buttons to process individual or all withdrawals.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type {\n AdminDepositItem,\n AdminDepositListResponse,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n} from '../../../types/deposit';\n\nexport interface AdminWithdrawalQueueProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a withdrawal item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n /** Callback when a withdrawal is processed */\n onWithdrawalProcessed?: (response: ProcessWithdrawalResponse) => void;\n /** Callback when all withdrawals are processed */\n onAllProcessed?: (response: ProcessAllWithdrawalsResponse) => void;\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\nfunction getTimeElapsed(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) return `${diffDays}d ago`;\n if (diffHours > 0) return `${diffHours}h ago`;\n if (diffMins > 0) return `${diffMins}m ago`;\n return 'just now';\n}\n\nfunction isWithinPrivacyPeriod(withdrawalAvailableAt: string | undefined): boolean {\n if (!withdrawalAvailableAt) return true;\n return new Date(withdrawalAvailableAt) > new Date();\n}\n\n/**\n * Admin withdrawal queue display\n *\n * Shows deposits ready for withdrawal processing with action buttons.\n */\nexport function AdminWithdrawalQueue({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n onWithdrawalProcessed,\n onAllProcessed,\n}: AdminWithdrawalQueueProps) {\n const {\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n isLoading,\n error,\n clearError,\n } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n // Processing state\n const [processingId, setProcessingId] = useState<string | null>(null);\n const [processingAll, setProcessingAll] = useState(false);\n const [processResult, setProcessResult] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Early withdrawal confirmation modal\n const [earlyWithdrawalItem, setEarlyWithdrawalItem] = useState<AdminDepositItem | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listPendingWithdrawals({ limit: pageSize, offset });\n setItems(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load pending withdrawals');\n }\n }, [pageSize, offset, listPendingWithdrawals, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n // Clear result message after 5 seconds\n useEffect(() => {\n if (!processResult) return;\n const timer = setTimeout(() => setProcessResult(null), 5000);\n return () => clearTimeout(timer);\n }, [processResult]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n const handleProcessSingle = async (item: AdminDepositItem, force = false) => {\n // Check if within privacy period and not forcing\n if (!force && isWithinPrivacyPeriod(item.withdrawalAvailableAt)) {\n setEarlyWithdrawalItem(item);\n return;\n }\n\n setProcessingId(item.id);\n setProcessResult(null);\n\n try {\n const result = await processWithdrawal(item.id, { force });\n if (result.success) {\n setProcessResult({\n type: 'success',\n message: `Withdrawal processed: ${result.txSignature?.slice(0, 12)}...`,\n });\n onWithdrawalProcessed?.(result);\n // Refresh the list\n await fetchItems();\n } else {\n setProcessResult({\n type: 'error',\n message: result.error || 'Failed to process withdrawal',\n });\n }\n } catch (err) {\n setProcessResult({\n type: 'error',\n message: err instanceof Error ? err.message : 'Failed to process withdrawal',\n });\n } finally {\n setProcessingId(null);\n setEarlyWithdrawalItem(null);\n }\n };\n\n const handleProcessAll = async () => {\n if (items.length === 0) return;\n\n setProcessingAll(true);\n setProcessResult(null);\n\n try {\n const result = await processAllWithdrawals();\n if (result.totalSucceeded > 0) {\n setProcessResult({\n type: 'success',\n message: `Processed ${result.totalSucceeded}/${result.totalProcessed} withdrawals`,\n });\n } else if (result.totalFailed > 0) {\n setProcessResult({\n type: 'error',\n message: `Failed to process ${result.totalFailed} withdrawals`,\n });\n }\n onAllProcessed?.(result);\n // Refresh the list\n await fetchItems();\n } catch (err) {\n setProcessResult({\n type: 'error',\n message: err instanceof Error ? err.message : 'Failed to process withdrawals',\n });\n } finally {\n setProcessingAll(false);\n }\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div\n className={`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-error ${className}`}\n >\n <p className=\"cedros-admin-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0 && !processingId && !processingAll) {\n return (\n <div\n className={`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading withdrawal queue...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-withdrawal-queue ${className}`}>\n {/* Early Withdrawal Confirmation Modal */}\n {earlyWithdrawalItem && (\n <div\n className=\"cedros-admin-modal-overlay\"\n onClick={() => setEarlyWithdrawalItem(null)}\n onKeyDown={(e) => e.key === 'Escape' && setEarlyWithdrawalItem(null)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"early-withdrawal-title\"\n >\n <div\n className=\"cedros-admin-modal cedros-admin-modal-warning\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={() => {}}\n role=\"document\"\n >\n <h3 id=\"early-withdrawal-title\" className=\"cedros-admin-modal-title\">\n Early Withdrawal Warning\n </h3>\n <div className=\"cedros-admin-modal-content\">\n <p className=\"cedros-admin-modal-warning-text\">\n <strong>This deposit is still within its privacy period.</strong>\n </p>\n <p>\n Processing this withdrawal early may compromise user privacy. The privacy period\n exists to provide plausible deniability for deposits.\n </p>\n <p className=\"cedros-admin-modal-details\">\n User: {truncateId(earlyWithdrawalItem.userId)}\n <br />\n Amount: {formatAmount(earlyWithdrawalItem.amountLamports)}\n <br />\n Available at:{' '}\n {earlyWithdrawalItem.withdrawalAvailableAt\n ? formatDate(earlyWithdrawalItem.withdrawalAvailableAt)\n : '—'}\n </p>\n <p>Are you sure you want to process this withdrawal early?</p>\n </div>\n <div className=\"cedros-admin-modal-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => setEarlyWithdrawalItem(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger\"\n onClick={() => handleProcessSingle(earlyWithdrawalItem, true)}\n disabled={processingId === earlyWithdrawalItem.id}\n >\n {processingId === earlyWithdrawalItem.id ? 'Processing...' : 'Process Early'}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Result message */}\n {processResult && (\n <div\n className={`cedros-admin-result cedros-admin-result-${processResult.type}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {processResult.message}\n </div>\n )}\n\n <div className=\"cedros-admin-withdrawal-queue-header\">\n <h4 className=\"cedros-admin-withdrawal-queue-title\">Pending Withdrawals</h4>\n <div className=\"cedros-admin-withdrawal-queue-actions\">\n <span className=\"cedros-admin-queue-count\">{total} pending</span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchItems}\n disabled={isLoading || processingAll}\n title=\"Refresh queue\"\n aria-label=\"Refresh queue\"\n >\n {isLoading && !processingAll ? '...' : '↻'}\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={handleProcessAll}\n disabled={isLoading || processingAll || items.length === 0}\n title=\"Process all ready withdrawals\"\n >\n {processingAll ? 'Processing...' : 'Process All'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No pending withdrawals.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-withdrawal-table\">\n <div className=\"cedros-admin-withdrawal-thead\">\n <div className=\"cedros-admin-withdrawal-th\">User</div>\n <div className=\"cedros-admin-withdrawal-th\">Amount</div>\n <div className=\"cedros-admin-withdrawal-th\">Ready Since</div>\n <div className=\"cedros-admin-withdrawal-th\">Waiting</div>\n <div className=\"cedros-admin-withdrawal-th cedros-admin-withdrawal-th-action\">\n Action\n </div>\n </div>\n {items.map((item) => {\n const withinPrivacyPeriod = isWithinPrivacyPeriod(item.withdrawalAvailableAt);\n const isProcessing = processingId === item.id;\n\n return (\n <div\n key={item.id}\n className={`cedros-admin-withdrawal-row ${withinPrivacyPeriod ? 'cedros-admin-withdrawal-row-early' : ''}`}\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-withdrawal-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-withdrawal-td\">\n {formatAmount(item.amountLamports)}\n </div>\n <div className=\"cedros-admin-withdrawal-td\">\n {item.withdrawalAvailableAt ? formatDate(item.withdrawalAvailableAt) : '—'}\n </div>\n <div className=\"cedros-admin-withdrawal-td cedros-admin-withdrawal-waiting\">\n {item.withdrawalAvailableAt\n ? withinPrivacyPeriod\n ? 'In privacy period'\n : getTimeElapsed(item.withdrawalAvailableAt)\n : '—'}\n </div>\n <div className=\"cedros-admin-withdrawal-td cedros-admin-withdrawal-td-action\">\n <button\n type=\"button\"\n className={`cedros-button cedros-button-sm ${withinPrivacyPeriod ? 'cedros-button-warning' : 'cedros-button-primary'}`}\n onClick={(e) => {\n e.stopPropagation();\n handleProcessSingle(item);\n }}\n disabled={isProcessing || processingAll}\n title={\n withinPrivacyPeriod\n ? 'Early withdrawal (requires confirmation)'\n : 'Process this withdrawal'\n }\n >\n {isProcessing ? '...' : withinPrivacyPeriod ? 'Early' : 'Process'}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin privacy period deposits component\n *\n * Shows deposits that are still in the privacy period (completed but not yet ready for withdrawal).\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\n\nexport interface AdminPrivacyPeriodDepositsProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\nfunction getTimeRemaining(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n\n if (diffMs <= 0) return 'Ready';\n\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) {\n const remainingHours = diffHours % 24;\n return remainingHours > 0 ? `${diffDays}d ${remainingHours}h` : `${diffDays}d`;\n }\n if (diffHours > 0) {\n const remainingMins = diffMins % 60;\n return remainingMins > 0 ? `${diffHours}h ${remainingMins}m` : `${diffHours}h`;\n }\n return `${diffMins}m`;\n}\n\n/**\n * Admin privacy period deposits display\n *\n * Shows deposits that are still in the privacy period (not yet available for withdrawal).\n */\nexport function AdminPrivacyPeriodDeposits({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n}: AdminPrivacyPeriodDepositsProps) {\n const { listInPrivacyPeriod, isLoading, error, clearError } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listInPrivacyPeriod({ limit: pageSize, offset });\n setItems(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load deposits');\n }\n }, [pageSize, offset, listInPrivacyPeriod, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div\n className={`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-error ${className}`}\n >\n <p className=\"cedros-admin-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0) {\n return (\n <div\n className={`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading deposits...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-privacy-deposits ${className}`}>\n <div className=\"cedros-admin-privacy-deposits-header\">\n <h4 className=\"cedros-admin-privacy-deposits-title\">In Privacy Period</h4>\n <div className=\"cedros-admin-privacy-deposits-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} deposit{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchItems}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits in privacy period.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-privacy-table\">\n <div className=\"cedros-admin-privacy-thead\">\n <div className=\"cedros-admin-privacy-th\">User</div>\n <div className=\"cedros-admin-privacy-th\">Amount</div>\n <div className=\"cedros-admin-privacy-th\">Deposited</div>\n <div className=\"cedros-admin-privacy-th\">Ready In</div>\n </div>\n {items.map((item) => (\n <div\n key={item.id}\n className=\"cedros-admin-privacy-row\"\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-privacy-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-privacy-td\">{formatAmount(item.amountLamports)}</div>\n <div className=\"cedros-admin-privacy-td\">\n {item.completedAt ? formatDate(item.completedAt) : '—'}\n </div>\n <div className=\"cedros-admin-privacy-td cedros-admin-privacy-remaining\">\n {item.withdrawalAvailableAt ? getTimeRemaining(item.withdrawalAvailableAt) : '—'}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin withdrawal history component\n *\n * Shows deposits that have been fully withdrawn (processed).\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\n\nexport interface AdminWithdrawalHistoryProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a withdrawal item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateSignature(sig: string): string {\n if (sig.length <= 16) return sig;\n return `${sig.slice(0, 8)}...${sig.slice(-6)}`;\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin withdrawal history display\n *\n * Shows deposits that have been fully withdrawn.\n */\nexport function AdminWithdrawalHistory({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n}: AdminWithdrawalHistoryProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listDeposits({ status: 'withdrawn', limit: pageSize, offset });\n setItems(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load withdrawal history');\n }\n }, [pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div\n className={`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-error ${className}`}\n >\n <p className=\"cedros-admin-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0) {\n return (\n <div\n className={`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading withdrawal history...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-withdrawal-history ${className}`}>\n <div className=\"cedros-admin-withdrawal-history-header\">\n <h4 className=\"cedros-admin-withdrawal-history-title\">Withdrawal History</h4>\n <div className=\"cedros-admin-withdrawal-history-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} withdrawal{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchItems}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No withdrawals processed yet.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-history-table\">\n <div className=\"cedros-admin-history-thead\">\n <div className=\"cedros-admin-history-th\">User</div>\n <div className=\"cedros-admin-history-th\">Amount</div>\n <div className=\"cedros-admin-history-th\">Processed</div>\n <div className=\"cedros-admin-history-th\">Transaction</div>\n </div>\n {items.map((item) => (\n <div\n key={item.id}\n className=\"cedros-admin-history-row\"\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-history-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-history-td\">{formatAmount(item.amountLamports)}</div>\n <div className=\"cedros-admin-history-td\">\n {item.completedAt ? formatDate(item.completedAt) : '—'}\n </div>\n <div className=\"cedros-admin-history-td\">\n {item.withdrawalTxSignature ? (\n <a\n href={`https://orbmarkets.io/tx/${item.withdrawalTxSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cedros-admin-tx-link\"\n onClick={(e) => e.stopPropagation()}\n title={item.withdrawalTxSignature}\n >\n {truncateSignature(item.withdrawalTxSignature)}\n </a>\n ) : (\n '—'\n )}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Privacy Cash system status component\n *\n * Shows system configuration including partial withdrawal settings.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { PrivacyStatusResponse } from '../../../types/deposit';\n\nexport interface PrivacySystemStatusProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when status is loaded */\n onLoad?: (status: PrivacyStatusResponse) => void;\n}\n\n/**\n * Privacy Cash system status display\n *\n * Shows configuration including partial withdrawal settings for timing analysis protection.\n */\nexport function PrivacySystemStatus({\n refreshInterval = 0,\n className = '',\n onLoad,\n}: PrivacySystemStatusProps) {\n const { getPrivacyStatus, isLoading, error, clearError } = useAdminDeposits();\n\n const [status, setStatus] = useState<PrivacyStatusResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchStatus = useCallback(async () => {\n try {\n const result = await getPrivacyStatus();\n setStatus(result);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load status');\n }\n }, [getPrivacyStatus, onLoad]);\n\n // Fetch on mount\n useEffect(() => {\n fetchStatus();\n }, [fetchStatus]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchStatus, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchStatus]);\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-admin-status cedros-admin-status-error ${className}`}>\n <p className=\"cedros-admin-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchStatus();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !status) {\n return (\n <div className={`cedros-admin-status cedros-admin-status-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading system status...</span>\n </div>\n );\n }\n\n if (!status) {\n return null;\n }\n\n const isPartialWithdrawalEnabled = status.partialWithdrawalCount > 0;\n\n return (\n <div className={`cedros-admin-status ${className}`}>\n <div className=\"cedros-admin-status-header\">\n <h4 className=\"cedros-admin-status-title\">System Configuration</h4>\n <div className=\"cedros-admin-status-actions\">\n <span\n className={`cedros-admin-status-badge ${status.enabled ? 'cedros-admin-status-badge-enabled' : 'cedros-admin-status-badge-disabled'}`}\n >\n {status.enabled ? 'Enabled' : 'Disabled'}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchStatus}\n disabled={isLoading}\n title=\"Refresh status\"\n aria-label=\"Refresh status\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n <div className=\"cedros-admin-status-grid\">\n {/* Core Settings */}\n <div className=\"cedros-admin-status-section\">\n <h5 className=\"cedros-admin-status-section-title\">Core Settings</h5>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Privacy Period</span>\n <span className=\"cedros-admin-status-value\">{status.privacyPeriodDisplay}</span>\n </div>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Min Deposit</span>\n <span className=\"cedros-admin-status-value\">{status.minDepositSol} SOL</span>\n </div>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Company Currency</span>\n <span className=\"cedros-admin-status-value\">{status.companyCurrency}</span>\n </div>\n </div>\n\n {/* Partial Withdrawal Settings */}\n <div className=\"cedros-admin-status-section\">\n <h5 className=\"cedros-admin-status-section-title\">\n Partial Withdrawals\n <span\n className={`cedros-admin-status-badge cedros-admin-status-badge-sm ${isPartialWithdrawalEnabled ? 'cedros-admin-status-badge-enabled' : 'cedros-admin-status-badge-disabled'}`}\n >\n {isPartialWithdrawalEnabled ? 'On' : 'Off'}\n </span>\n </h5>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Withdrawal %</span>\n <span className=\"cedros-admin-status-value\">{status.withdrawalPercentage}%</span>\n </div>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Max per Batch</span>\n <span className=\"cedros-admin-status-value\">\n {status.partialWithdrawalCount === 0 ? 'N/A' : status.partialWithdrawalCount}\n </span>\n </div>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Min Amount</span>\n <span className=\"cedros-admin-status-value\">\n {status.partialWithdrawalCount === 0\n ? 'N/A'\n : `${status.partialWithdrawalMinSol} SOL`}\n </span>\n </div>\n </div>\n\n {/* Worker Settings */}\n <div className=\"cedros-admin-status-section\">\n <h5 className=\"cedros-admin-status-section-title\">Worker Settings</h5>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Poll Interval</span>\n <span className=\"cedros-admin-status-value\">{status.withdrawalPollIntervalSecs}s</span>\n </div>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Batch Size</span>\n <span className=\"cedros-admin-status-value\">{status.withdrawalBatchSize}</span>\n </div>\n <div className=\"cedros-admin-status-item\">\n <span className=\"cedros-admin-status-label\">Sidecar Status</span>\n <span\n className={`cedros-admin-status-value ${status.sidecarStatus === 'connected' ? 'cedros-admin-status-connected' : 'cedros-admin-status-disconnected'}`}\n >\n {status.sidecarStatus}\n </span>\n </div>\n </div>\n </div>\n\n {/* Wallet Info */}\n {status.companyWallet && (\n <div className=\"cedros-admin-status-footer\">\n <span className=\"cedros-admin-status-label\">Company Wallet</span>\n <code className=\"cedros-admin-status-wallet\" title={status.companyWallet}>\n {status.companyWallet.slice(0, 8)}...{status.companyWallet.slice(-6)}\n </code>\n </div>\n )}\n </div>\n );\n}\n","import type {\n AdminUser,\n AdminUserCreditsResponse,\n AdjustCreditsRequest,\n ListAdminUsersResponse,\n ListUsersParams,\n UpdateUserRequest,\n} from '../types';\nimport type {\n AdminDepositListResponse,\n AdminUserWithdrawalHistoryResponse,\n} from '../types/deposit';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for admin user operations\n *\n * Requires system admin privileges.\n */\nexport class AdminUserApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all users in the system\n */\n async listUsers(params?: ListUsersParams): Promise<ListAdminUsersResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<ListAdminUsersResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to list users');\n }\n }\n\n /**\n * Get a specific user by ID\n */\n async getUser(userId: string): Promise<AdminUser> {\n try {\n return await this.client.get<AdminUser>(`/admin/users/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user');\n }\n }\n\n /**\n * Set a user's system admin status\n */\n async setSystemAdmin(userId: string, isAdmin: boolean): Promise<void> {\n try {\n await this.client.patch(`/admin/users/${userId}/system-admin`, { isAdmin });\n } catch (error) {\n throw handleApiError(error, 'Failed to update system admin status');\n }\n }\n\n /**\n * Update a user's profile\n */\n async updateUser(userId: string, data: UpdateUserRequest): Promise<AdminUser> {\n try {\n return await this.client.patch<AdminUser>(`/admin/users/${userId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update user');\n }\n }\n\n /**\n * Delete a user\n */\n async deleteUser(userId: string): Promise<void> {\n try {\n await this.client.delete(`/admin/users/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to delete user');\n }\n }\n\n /**\n * Send a password reset email to a user\n */\n async forcePasswordReset(userId: string): Promise<void> {\n try {\n await this.client.post(`/admin/users/${userId}/force-password-reset`, {});\n } catch (error) {\n throw handleApiError(error, 'Failed to send password reset email');\n }\n }\n\n /**\n * Adjust a user's credits\n */\n async adjustCredits(userId: string, data: AdjustCreditsRequest): Promise<void> {\n try {\n await this.client.post(`/admin/users/${userId}/credits`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to adjust credits');\n }\n }\n\n /**\n * Get a user's deposit history\n */\n async getUserDeposits(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminDepositListResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/deposits${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminDepositListResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user deposits');\n }\n }\n\n /**\n * Get a user's credit stats and transaction history\n */\n async getUserCredits(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserCreditsResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/credits${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserCreditsResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user credits');\n }\n }\n\n /**\n * Get a user's withdrawal history\n */\n async getUserWithdrawalHistory(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserWithdrawalHistoryResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/withdrawal-history${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserWithdrawalHistoryResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user withdrawal history');\n }\n }\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { AdminUserApiClient } from '../utils/adminUserApi';\nimport type {\n AdminUser,\n AdminUserCreditsResponse,\n ListAdminUsersResponse,\n ListUsersParams,\n UpdateUserRequest,\n UseAdminUsersReturn,\n} from '../types';\nimport type {\n AdminDepositListResponse,\n AdminUserWithdrawalHistoryResponse,\n} from '../types/deposit';\n\n/**\n * Hook for admin user management operations\n *\n * Provides methods to list all users, get individual users,\n * and manage system admin status. Requires system admin privileges.\n *\n * @example\n * ```tsx\n * function UserManagement() {\n * const { users, total, isLoading, listUsers, setSystemAdmin } = useAdminUsers();\n *\n * useEffect(() => {\n * listUsers({ limit: 20 });\n * }, [listUsers]);\n *\n * return (\n * <AdminUserList\n * users={users}\n * total={total}\n * isLoading={isLoading}\n * onToggleAdmin={(userId, isAdmin) => setSystemAdmin(userId, isAdmin)}\n * />\n * );\n * }\n * ```\n */\nexport function useAdminUsers(): UseAdminUsersReturn {\n const { config, _internal } = useCedrosLogin();\n\n const [users, setUsers] = useState<AdminUser[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastParams, setLastParams] = useState<ListUsersParams>({});\n\n const apiClient = useMemo(\n () =>\n new AdminUserApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const listUsers = useCallback(\n async (params?: ListUsersParams): Promise<ListAdminUsersResponse> => {\n setIsLoading(true);\n setError(null);\n setLastParams(params || {});\n\n try {\n const response = await apiClient.listUsers(params);\n setUsers(response.users);\n setTotal(response.total);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to list users');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUser = useCallback(\n async (userId: string): Promise<AdminUser> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUser(userId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const setSystemAdmin = useCallback(\n async (userId: string, isAdmin: boolean): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.setSystemAdmin(userId, isAdmin);\n // Update local state\n setUsers((prev) =>\n prev.map((user) => (user.id === userId ? { ...user, isSystemAdmin: isAdmin } : user))\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update admin status');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const updateUser = useCallback(\n async (userId: string, data: UpdateUserRequest): Promise<AdminUser> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const updated = await apiClient.updateUser(userId, data);\n // Update local state\n setUsers((prev) => prev.map((user) => (user.id === userId ? updated : user)));\n return updated;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const deleteUser = useCallback(\n async (userId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.deleteUser(userId);\n // Remove from local state\n setUsers((prev) => prev.filter((user) => user.id !== userId));\n setTotal((prev) => prev - 1);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const forcePasswordReset = useCallback(\n async (userId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.forcePasswordReset(userId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to send password reset');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const adjustCredits = useCallback(\n async (userId: string, amount: number, reason: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.adjustCredits(userId, { amount, reason });\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to adjust credits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserDeposits = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminDepositListResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserDeposits(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user deposits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserCredits = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminUserCreditsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserCredits(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user credits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserWithdrawalHistory = useCallback(\n async (\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserWithdrawalHistoryResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserWithdrawalHistory(userId, params);\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error('Failed to get user withdrawal history');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const refresh = useCallback(async () => {\n await listUsers(lastParams);\n }, [listUsers, lastParams]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n users,\n total,\n isLoading,\n error,\n listUsers,\n getUser,\n setSystemAdmin,\n updateUser,\n deleteUser,\n forcePasswordReset,\n adjustCredits,\n getUserDeposits,\n getUserCredits,\n getUserWithdrawalHistory,\n refresh,\n clearError,\n };\n}\n","/**\n * Admin user list component\n *\n * Displays all registered users in the system with management actions.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport type { AdminUser, ListAdminUsersResponse } from '../../types';\n\nexport interface AdminUserListProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Current user's ID (to prevent self-demotion) */\n currentUserId?: string;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: ListAdminUsersResponse) => void;\n /** Callback when a user is clicked */\n onUserClick?: (user: AdminUser) => void;\n /** Callback when edit is clicked (parent handles modal) */\n onEditUser?: (user: AdminUser) => void;\n /** Callback when credits adjustment is clicked (parent handles modal) */\n onAdjustCredits?: (user: AdminUser) => void;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin user list display\n *\n * Shows all registered users with their auth methods and admin status.\n */\nexport function AdminUserList({\n pageSize = 20,\n refreshInterval = 0,\n currentUserId,\n className = '',\n onLoad,\n onUserClick,\n onEditUser,\n onAdjustCredits,\n}: AdminUserListProps) {\n const {\n users,\n total,\n isLoading,\n error,\n listUsers,\n setSystemAdmin,\n deleteUser,\n forcePasswordReset,\n clearError,\n } = useAdminUsers();\n\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [togglingId, setTogglingId] = useState<string | null>(null);\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n\n const fetchUsers = useCallback(async () => {\n try {\n const result = await listUsers({ limit: pageSize, offset });\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load users');\n }\n }, [pageSize, offset, listUsers, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchUsers, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchUsers]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n const handleToggleAdmin = async (user: AdminUser) => {\n if (user.id === currentUserId) {\n alert('You cannot change your own admin status');\n return;\n }\n\n const action = user.isSystemAdmin\n ? 'remove admin privileges from'\n : 'grant admin privileges to';\n const confirmed = window.confirm(\n `Are you sure you want to ${action} ${user.name || user.email || 'this user'}?`\n );\n if (!confirmed) return;\n\n setTogglingId(user.id);\n try {\n await setSystemAdmin(user.id, !user.isSystemAdmin);\n } catch {\n // Error is handled by the hook\n } finally {\n setTogglingId(null);\n }\n };\n\n const handleDelete = async (user: AdminUser) => {\n if (user.id === currentUserId) {\n alert('You cannot delete your own account');\n return;\n }\n if (user.isSystemAdmin) {\n alert('Cannot delete a system admin. Remove admin status first.');\n return;\n }\n\n const confirmed = window.confirm(\n `Are you sure you want to delete ${user.name || user.email || 'this user'}? This action cannot be undone.`\n );\n if (!confirmed) return;\n\n setActionInProgress(user.id);\n try {\n await deleteUser(user.id);\n } catch {\n // Error is handled by the hook\n } finally {\n setActionInProgress(null);\n }\n };\n\n const handlePasswordReset = async (user: AdminUser) => {\n if (!user.email) {\n alert('User has no email address');\n return;\n }\n\n const confirmed = window.confirm(`Send a password reset email to ${user.email}?`);\n if (!confirmed) return;\n\n setActionInProgress(user.id);\n try {\n await forcePasswordReset(user.id);\n alert('Password reset email sent');\n } catch {\n // Error is handled by the hook\n } finally {\n setActionInProgress(null);\n }\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-admin-user-list cedros-admin-user-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{loadError || error?.message}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchUsers();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && users.length === 0) {\n return (\n <div className={`cedros-admin-user-list cedros-admin-user-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading users...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-user-list ${className}`}>\n <div className=\"cedros-admin-user-list-header\">\n <h4 className=\"cedros-admin-user-list-title\">All Users</h4>\n <div className=\"cedros-admin-user-list-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} user{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchUsers}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {users.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No users found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-user-table\">\n <div className=\"cedros-admin-user-thead\">\n <div className=\"cedros-admin-user-th\">User</div>\n <div className=\"cedros-admin-user-th\">Auth Methods</div>\n <div className=\"cedros-admin-user-th\">Registered</div>\n <div className=\"cedros-admin-user-th cedros-admin-user-th-admin\">Admin</div>\n <div className=\"cedros-admin-user-th cedros-admin-user-th-actions\">Actions</div>\n </div>\n {users.map((user) => {\n const isCurrentUser = user.id === currentUserId;\n const isToggling = togglingId === user.id;\n\n return (\n <div\n key={user.id}\n className={`cedros-admin-user-row ${isCurrentUser ? 'cedros-admin-user-row-current' : ''}`}\n onClick={() => onUserClick?.(user)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onUserClick?.(user);\n }\n }}\n role={onUserClick ? 'button' : undefined}\n tabIndex={onUserClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-user-td cedros-admin-user-info\">\n <div className=\"cedros-admin-user-avatar\">\n {user.picture ? (\n <img\n src={user.picture}\n alt={user.name || user.email || 'User'}\n className=\"cedros-admin-user-avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-admin-user-avatar-placeholder\">\n {(user.name?.[0] || user.email?.[0] || '?').toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-details\">\n <span className=\"cedros-admin-user-name\">\n {user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-admin-user-you\">(you)</span>}\n </span>\n <span className=\"cedros-admin-user-email\" title={user.email}>\n {user.email || truncateId(user.id)}\n </span>\n </div>\n </div>\n <div className=\"cedros-admin-user-td cedros-admin-user-methods\">\n {user.authMethods.length > 0 ? (\n user.authMethods.map((method) => (\n <span\n key={method}\n className={`cedros-admin-auth-badge cedros-admin-auth-badge-${method}`}\n >\n {method}\n </span>\n ))\n ) : (\n <span className=\"cedros-admin-auth-badge cedros-admin-auth-badge-none\">\n none\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-td\">{formatDate(user.createdAt)}</div>\n <div className=\"cedros-admin-user-td cedros-admin-user-td-admin\">\n <button\n type=\"button\"\n className={`cedros-admin-toggle ${user.isSystemAdmin ? 'cedros-admin-toggle-on' : 'cedros-admin-toggle-off'}`}\n onClick={(e) => {\n e.stopPropagation();\n handleToggleAdmin(user);\n }}\n disabled={isToggling || isCurrentUser}\n title={\n isCurrentUser\n ? 'Cannot change your own status'\n : user.isSystemAdmin\n ? 'Revoke admin'\n : 'Grant admin'\n }\n aria-label={user.isSystemAdmin ? 'Revoke admin' : 'Grant admin'}\n >\n {isToggling ? '...' : user.isSystemAdmin ? 'Yes' : 'No'}\n </button>\n </div>\n <div className=\"cedros-admin-user-td cedros-admin-user-td-actions\">\n {actionInProgress === user.id ? (\n <span className=\"cedros-admin-action-loading\">...</span>\n ) : (\n <div className=\"cedros-admin-action-buttons\">\n {onEditUser && (\n <button\n type=\"button\"\n className=\"cedros-admin-action-btn\"\n onClick={(e) => {\n e.stopPropagation();\n onEditUser(user);\n }}\n title=\"Edit user\"\n aria-label=\"Edit user\"\n >\n Edit\n </button>\n )}\n {user.email && (\n <button\n type=\"button\"\n className=\"cedros-admin-action-btn\"\n onClick={(e) => {\n e.stopPropagation();\n handlePasswordReset(user);\n }}\n title=\"Send password reset\"\n aria-label=\"Send password reset\"\n >\n Reset\n </button>\n )}\n {onAdjustCredits && (\n <button\n type=\"button\"\n className=\"cedros-admin-action-btn\"\n onClick={(e) => {\n e.stopPropagation();\n onAdjustCredits(user);\n }}\n title=\"Adjust credits\"\n aria-label=\"Adjust credits\"\n >\n Credits\n </button>\n )}\n {!isCurrentUser && !user.isSystemAdmin && (\n <button\n type=\"button\"\n className=\"cedros-admin-action-btn cedros-admin-action-btn-danger\"\n onClick={(e) => {\n e.stopPropagation();\n handleDelete(user);\n }}\n title=\"Delete user\"\n aria-label=\"Delete user\"\n >\n Delete\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin user detail component\n *\n * Displays detailed information about a specific user including:\n * - Account information (email, auth methods, admin status)\n * - Credit balance and stats\n * - Deposit history\n * - Transaction history\n *\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport type {\n AdminUser,\n AdminUserCreditsResponse,\n AdminCreditTransactionItem,\n ListUsersParams,\n} from '../../types';\nimport type { AdminDepositListResponse, AdminDepositItem } from '../../types/deposit';\n\nexport interface AdminUserDetailProps {\n /** User ID to display */\n userId: string;\n /** Callback when back button is clicked */\n onBack: () => void;\n /** Current user's ID (to prevent self-demotion) */\n currentUserId?: string;\n /** Callback when edit is clicked (parent handles modal) */\n onEditUser?: (user: AdminUser) => void;\n /** Callback when credits adjustment is clicked (parent handles modal) */\n onAdjustCredits?: (user: AdminUser) => void;\n /** Additional CSS classes */\n className?: string;\n}\n\ntype TabId = 'deposits' | 'transactions';\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSol(lamports: number | null | undefined): string {\n if (lamports === null || lamports === undefined) return '—';\n const sol = lamports / 1_000_000_000;\n return `${sol.toFixed(4)} SOL`;\n}\n\n/**\n * Admin user detail display\n *\n * Shows comprehensive user information with deposit and credit history.\n */\nexport function AdminUserDetail({\n userId,\n onBack,\n currentUserId,\n onEditUser,\n onAdjustCredits,\n className = '',\n}: AdminUserDetailProps) {\n const {\n isLoading,\n getUser,\n getUserDeposits,\n getUserCredits,\n setSystemAdmin,\n deleteUser,\n forcePasswordReset,\n clearError,\n } = useAdminUsers();\n\n const [user, setUser] = useState<AdminUser | null>(null);\n const [credits, setCredits] = useState<AdminUserCreditsResponse | null>(null);\n const [deposits, setDeposits] = useState<AdminDepositListResponse | null>(null);\n const [activeTab, setActiveTab] = useState<TabId>('deposits');\n const [userError, setUserError] = useState<string | null>(null);\n const [creditsError, setCreditsError] = useState<string | null>(null);\n const [depositsError, setDepositsError] = useState<string | null>(null);\n const [actionInProgress, setActionInProgress] = useState(false);\n\n // Pagination state\n const [depositsOffset, setDepositsOffset] = useState(0);\n const [transactionsOffset, setTransactionsOffset] = useState(0);\n const pageSize = 10;\n\n const fetchUser = useCallback(async () => {\n try {\n const userData = await getUser(userId);\n setUser(userData);\n setUserError(null);\n } catch (err) {\n setUserError(err instanceof Error ? err.message : 'Failed to load user');\n }\n }, [userId, getUser]);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const params: ListUsersParams = { limit: pageSize, offset: depositsOffset };\n const depositsData = await getUserDeposits(userId, params);\n setDeposits(depositsData);\n setDepositsError(null);\n } catch (err) {\n setDepositsError(err instanceof Error ? err.message : 'Failed to load deposits');\n }\n }, [userId, getUserDeposits, depositsOffset]);\n\n const fetchCredits = useCallback(async () => {\n try {\n const params: ListUsersParams = { limit: pageSize, offset: transactionsOffset };\n const creditsData = await getUserCredits(userId, params);\n setCredits(creditsData);\n setCreditsError(null);\n } catch (err) {\n setCreditsError(err instanceof Error ? err.message : 'Failed to load credits');\n }\n }, [userId, getUserCredits, transactionsOffset]);\n\n // Initial load\n useEffect(() => {\n fetchUser();\n fetchDeposits();\n fetchCredits();\n }, [fetchUser, fetchDeposits, fetchCredits]);\n\n const handleToggleAdmin = async () => {\n if (!user) return;\n if (user.id === currentUserId) {\n alert('You cannot change your own admin status');\n return;\n }\n\n const action = user.isSystemAdmin\n ? 'remove admin privileges from'\n : 'grant admin privileges to';\n const confirmed = window.confirm(\n `Are you sure you want to ${action} ${user.name || user.email || 'this user'}?`\n );\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await setSystemAdmin(user.id, !user.isSystemAdmin);\n await fetchUser();\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n const handleDelete = async () => {\n if (!user) return;\n if (user.id === currentUserId) {\n alert('You cannot delete your own account');\n return;\n }\n if (user.isSystemAdmin) {\n alert('Cannot delete a system admin. Remove admin status first.');\n return;\n }\n\n const confirmed = window.confirm(\n `Are you sure you want to delete ${user.name || user.email || 'this user'}? This action cannot be undone.`\n );\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await deleteUser(user.id);\n onBack();\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n const handlePasswordReset = async () => {\n if (!user?.email) {\n alert('User has no email address');\n return;\n }\n\n const confirmed = window.confirm(`Send a password reset email to ${user.email}?`);\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await forcePasswordReset(user.id);\n alert('Password reset email sent');\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n // Pagination handlers\n const depositsTotalPages = deposits ? Math.ceil(deposits.total / pageSize) : 0;\n const depositsCurrentPage = Math.floor(depositsOffset / pageSize) + 1;\n\n const transactionsTotalPages = credits ? Math.ceil(credits.totalTransactions / pageSize) : 0;\n const transactionsCurrentPage = Math.floor(transactionsOffset / pageSize) + 1;\n\n const goToDepositsPage = (page: number) => {\n setDepositsOffset((page - 1) * pageSize);\n };\n\n const goToTransactionsPage = (page: number) => {\n setTransactionsOffset((page - 1) * pageSize);\n };\n\n // Critical error - user fetch failed\n if (userError) {\n return (\n <div className={`cedros-admin-user-detail cedros-admin-user-detail-error ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onBack}\n >\n Back\n </button>\n <p className=\"cedros-admin-error\">{userError}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setUserError(null);\n fetchUser();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !user) {\n return (\n <div className={`cedros-admin-user-detail cedros-admin-user-detail-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading user...</span>\n </div>\n );\n }\n\n if (!user) {\n return (\n <div className={`cedros-admin-user-detail ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onBack}\n >\n Back\n </button>\n <p className=\"cedros-admin-empty-message\">User not found.</p>\n </div>\n );\n }\n\n const isCurrentUser = user.id === currentUserId;\n\n return (\n <div className={`cedros-admin-user-detail ${className}`}>\n {/* Header */}\n <div className=\"cedros-admin-user-detail-header\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-back-btn\"\n onClick={onBack}\n >\n Back to Users\n </button>\n <div className=\"cedros-admin-user-detail-actions\">\n {onEditUser && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onEditUser(user)}\n disabled={actionInProgress}\n >\n Edit\n </button>\n )}\n {user.email && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={handlePasswordReset}\n disabled={actionInProgress}\n >\n Reset Password\n </button>\n )}\n {onAdjustCredits && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onAdjustCredits(user)}\n disabled={actionInProgress}\n >\n Adjust Credits\n </button>\n )}\n {!isCurrentUser && !user.isSystemAdmin && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-btn-danger\"\n onClick={handleDelete}\n disabled={actionInProgress}\n >\n Delete\n </button>\n )}\n </div>\n </div>\n\n {/* User Info Section */}\n <div className=\"cedros-admin-user-detail-info\">\n <div className=\"cedros-admin-user-detail-avatar\">\n {user.picture ? (\n <img\n src={user.picture}\n alt={user.name || user.email || 'User'}\n className=\"cedros-admin-user-detail-avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-admin-user-detail-avatar-placeholder\">\n {(user.name?.[0] || user.email?.[0] || '?').toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-detail-meta\">\n <h2 className=\"cedros-admin-user-detail-name\">\n {user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-admin-user-you\">(you)</span>}\n </h2>\n <p className=\"cedros-admin-user-detail-email\">\n {user.email || 'No email'}\n {user.emailVerified && (\n <span className=\"cedros-admin-verified-badge\" title=\"Email verified\">\n Verified\n </span>\n )}\n </p>\n <div className=\"cedros-admin-user-detail-badges\">\n <span\n className={`cedros-admin-admin-badge ${user.isSystemAdmin ? 'cedros-admin-admin-badge-yes' : 'cedros-admin-admin-badge-no'}`}\n >\n {user.isSystemAdmin ? 'System Admin' : 'User'}\n </span>\n {!isCurrentUser && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-xs\"\n onClick={handleToggleAdmin}\n disabled={actionInProgress}\n >\n {user.isSystemAdmin ? 'Revoke Admin' : 'Grant Admin'}\n </button>\n )}\n </div>\n <div className=\"cedros-admin-user-detail-methods\">\n <span className=\"cedros-admin-user-detail-methods-label\">Auth Methods:</span>\n {user.authMethods.length > 0 ? (\n user.authMethods.map((method) => (\n <span\n key={method}\n className={`cedros-admin-auth-badge cedros-admin-auth-badge-${method}`}\n >\n {method}\n </span>\n ))\n ) : (\n <span className=\"cedros-admin-auth-badge cedros-admin-auth-badge-none\">none</span>\n )}\n </div>\n <p className=\"cedros-admin-user-detail-dates\">\n Registered: {formatDate(user.createdAt)} | Updated: {formatDate(user.updatedAt)}\n </p>\n </div>\n </div>\n\n {/* Stats Cards */}\n {creditsError ? (\n <div className=\"cedros-admin-stats-error\">\n <p className=\"cedros-admin-error-inline\">{creditsError}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => {\n setCreditsError(null);\n fetchCredits();\n }}\n >\n Retry\n </button>\n </div>\n ) : credits ? (\n <div className=\"cedros-admin-user-detail-stats\">\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Current Balance</span>\n <span className=\"cedros-admin-stat-value\">\n {formatSol(credits.stats.currentBalanceLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Deposited</span>\n <span className=\"cedros-admin-stat-value\">\n {formatSol(credits.stats.totalDepositedLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Spent</span>\n <span className=\"cedros-admin-stat-value\">\n {formatSol(credits.stats.totalSpentLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Deposits</span>\n <span className=\"cedros-admin-stat-value\">{credits.stats.depositCount}</span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Transactions</span>\n <span className=\"cedros-admin-stat-value\">{credits.stats.spendCount}</span>\n </div>\n </div>\n ) : (\n <div className=\"cedros-admin-stats-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading credit stats...</span>\n </div>\n )}\n\n {/* Tabs */}\n <div className=\"cedros-admin-user-detail-tabs\">\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'deposits' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('deposits')}\n >\n Deposits ({deposits?.total ?? 0})\n </button>\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'transactions' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('transactions')}\n >\n Transactions ({credits?.totalTransactions ?? 0})\n </button>\n </div>\n\n {/* Tab Content */}\n <div className=\"cedros-admin-user-detail-content\">\n {activeTab === 'deposits' && (\n <DepositsTab\n deposits={deposits?.deposits ?? []}\n total={deposits?.total ?? 0}\n currentPage={depositsCurrentPage}\n totalPages={depositsTotalPages}\n onPageChange={goToDepositsPage}\n isLoading={isLoading}\n error={depositsError}\n onRetry={() => {\n setDepositsError(null);\n fetchDeposits();\n }}\n />\n )}\n {activeTab === 'transactions' && (\n <TransactionsTab\n transactions={credits?.transactions ?? []}\n total={credits?.totalTransactions ?? 0}\n currentPage={transactionsCurrentPage}\n totalPages={transactionsTotalPages}\n onPageChange={goToTransactionsPage}\n error={creditsError}\n onRetry={() => {\n setCreditsError(null);\n fetchCredits();\n }}\n isLoading={isLoading}\n />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Tab Components\n// =============================================================================\n\ninterface DepositsTabProps {\n deposits: AdminDepositItem[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction DepositsTab({\n deposits,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: DepositsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && deposits.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading deposits...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No deposits found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Amount</div>\n <div className=\"cedros-admin-list-th\">Status</div>\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Address</div>\n </div>\n {deposits.map((deposit) => (\n <div key={deposit.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatSol(deposit.amountLamports)}</div>\n <div className=\"cedros-admin-list-td\">\n <span className={`cedros-admin-status-badge cedros-admin-status-${deposit.status}`}>\n {deposit.status}\n </span>\n </div>\n <div className=\"cedros-admin-list-td\">{formatDateTime(deposit.createdAt)}</div>\n <div\n className=\"cedros-admin-list-td cedros-admin-list-td-mono\"\n title={deposit.walletAddress}\n >\n {deposit.walletAddress.slice(0, 8)}...{deposit.walletAddress.slice(-4)}\n </div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface TransactionsTabProps {\n transactions: AdminCreditTransactionItem[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction TransactionsTab({\n transactions,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: TransactionsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && transactions.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading transactions...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No transactions found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Amount</div>\n <div className=\"cedros-admin-list-th\">Type</div>\n <div className=\"cedros-admin-list-th\">Reference</div>\n <div className=\"cedros-admin-list-th\">Date</div>\n </div>\n {transactions.map((tx) => (\n <div key={tx.id} className=\"cedros-admin-list-row\">\n <div\n className={`cedros-admin-list-td ${tx.amountLamports >= 0 ? 'cedros-admin-amount-positive' : 'cedros-admin-amount-negative'}`}\n >\n {tx.amountLamports >= 0 ? '+' : ''}\n {formatSol(tx.amountLamports)}\n </div>\n <div className=\"cedros-admin-list-td\">\n <span\n className={`cedros-admin-tx-type cedros-admin-tx-type-${tx.txType.toLowerCase()}`}\n >\n {tx.txType}\n </span>\n </div>\n <div className=\"cedros-admin-list-td\">{tx.referenceType || '—'}</div>\n <div className=\"cedros-admin-list-td\">{formatDateTime(tx.createdAt)}</div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n total: number;\n onPageChange: (page: number) => void;\n}\n\nfunction Pagination({ currentPage, totalPages, total, onPageChange }: PaginationProps) {\n return (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n );\n}\n","/**\n * Unified Admin Dashboard\n *\n * A complete, ready-to-use admin panel following shadcn/ui dashboard patterns.\n *\n * @example\n * ```tsx\n * // Minimal setup - everything included\n * function AdminPage() {\n * return <CedrosAdminDashboard />;\n * }\n *\n * // Customized sections\n * function AdminPage() {\n * return (\n * <CedrosAdminDashboard\n * sections={['overview', 'members', 'deposits', 'settings']}\n * title=\"My App Admin\"\n * />\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { Permission } from '../../types';\nimport { MemberList } from '../members/MemberList';\nimport { InviteForm } from '../invites/InviteForm';\nimport { InviteList } from '../invites/InviteList';\nimport { SystemSettings } from './SystemSettings';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { useOrgs } from '../../hooks/useOrgs';\nimport { useMembers } from '../../hooks/useMembers';\nimport { useInvites } from '../../hooks/useInvites';\nimport { useCedrosLogin } from '../../context/useCedrosLogin';\nimport { useCredits } from '../../hooks/useCredits';\nimport { AdminDepositStats } from '../deposit/admin/AdminDepositStats';\nimport { AdminDepositList } from '../deposit/admin/AdminDepositList';\nimport { AdminWithdrawalQueue } from '../deposit/admin/AdminWithdrawalQueue';\nimport { AdminPrivacyPeriodDeposits } from '../deposit/admin/AdminPrivacyPeriodDeposits';\nimport { AdminWithdrawalHistory } from '../deposit/admin/AdminWithdrawalHistory';\nimport { PrivacySystemStatus } from '../deposit/admin/PrivacySystemStatus';\nimport { AdminUserList } from './AdminUserList';\nimport { AdminUserDetail } from './AdminUserDetail';\nimport type { AdminUser } from '../../types';\n\n/** Available dashboard sections */\nexport type DashboardSection =\n | 'overview'\n | 'users'\n | 'members'\n | 'invites'\n | 'deposits'\n | 'withdrawals'\n | 'settings';\n\nexport interface CedrosAdminDashboardProps {\n /** Dashboard title */\n title?: string;\n /** Sections to display (defaults to all) */\n sections?: DashboardSection[];\n /** Initial active section */\n defaultSection?: DashboardSection;\n /** Auto-refresh interval for stats in ms (0 to disable) */\n refreshInterval?: number;\n /** Items per page for lists */\n pageSize?: number;\n /** Callback when section changes */\n onSectionChange?: (section: DashboardSection) => void;\n /** Additional CSS class */\n className?: string;\n}\n\n// SVG Icons (Lucide-style, 24x24)\nconst Icons = {\n overview: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"9\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"5\" rx=\"1\" />\n <rect x=\"14\" y=\"12\" width=\"7\" height=\"9\" rx=\"1\" />\n <rect x=\"3\" y=\"16\" width=\"7\" height=\"5\" rx=\"1\" />\n </svg>\n ),\n users: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n ),\n members: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n ),\n invites: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n ),\n deposits: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\" />\n <path d=\"M12 18V6\" />\n </svg>\n ),\n withdrawals: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </svg>\n ),\n settings: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ),\n wallet: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n ),\n chevronRight: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n ),\n};\n\ninterface SectionConfig {\n id: DashboardSection;\n label: string;\n icon: React.ReactNode;\n}\n\nconst ALL_SECTIONS: SectionConfig[] = [\n { id: 'overview', label: 'Overview', icon: Icons.overview },\n { id: 'users', label: 'Users', icon: Icons.users },\n { id: 'members', label: 'Team', icon: Icons.members },\n { id: 'invites', label: 'Invites', icon: Icons.invites },\n { id: 'deposits', label: 'Deposits', icon: Icons.deposits },\n { id: 'withdrawals', label: 'Withdrawals', icon: Icons.withdrawals },\n { id: 'settings', label: 'Settings', icon: Icons.settings },\n];\n\n/**\n * Unified Admin Dashboard\n *\n * Provides a complete admin interface with sidebar navigation.\n * Follows shadcn/ui dashboard patterns.\n */\nexport function CedrosAdminDashboard({\n title = 'Dashboard',\n sections = ['overview', 'users', 'members', 'invites', 'deposits', 'withdrawals', 'settings'],\n defaultSection = 'overview',\n refreshInterval = 0,\n pageSize = 20,\n onSectionChange,\n className = '',\n}: CedrosAdminDashboardProps) {\n const [activeSection, setActiveSection] = useState<DashboardSection>(defaultSection);\n\n const { user } = useCedrosLogin();\n const { activeOrg, role, isLoading: orgsLoading, fetchOrgs, hasPermission } = useOrgs();\n\n useEffect(() => {\n fetchOrgs();\n }, [fetchOrgs]);\n\n const handleSectionChange = useCallback(\n (section: DashboardSection) => {\n setActiveSection(section);\n onSectionChange?.(section);\n },\n [onSectionChange]\n );\n\n const enabledSections = ALL_SECTIONS.filter((s) => sections.includes(s.id));\n\n if (orgsLoading && !activeOrg) {\n return (\n <div className={`cedros-dashboard cedros-dashboard--loading ${className}`}>\n <LoadingSpinner />\n <span className=\"cedros-dashboard__loading-text\">Loading...</span>\n </div>\n );\n }\n\n const needsOrg = ['members', 'invites'].includes(activeSection);\n if (needsOrg && !activeOrg) {\n return (\n <div className={`cedros-dashboard ${className}`}>\n <ErrorMessage error=\"No organization selected. Please select an organization first.\" />\n </div>\n );\n }\n\n const currentSection = enabledSections.find((s) => s.id === activeSection);\n\n return (\n <div className={`cedros-dashboard ${className}`}>\n {/* Sidebar */}\n <aside className=\"cedros-dashboard__sidebar\">\n <div className=\"cedros-dashboard__sidebar-header\">\n <div className=\"cedros-dashboard__logo\">\n {Icons.wallet}\n <span className=\"cedros-dashboard__logo-text\">{title}</span>\n </div>\n </div>\n\n <nav className=\"cedros-dashboard__nav\">\n <div className=\"cedros-dashboard__nav-group\">\n <span className=\"cedros-dashboard__nav-label\">Menu</span>\n {enabledSections.map((section) => (\n <button\n key={section.id}\n type=\"button\"\n className={`cedros-dashboard__nav-item ${activeSection === section.id ? 'cedros-dashboard__nav-item--active' : ''}`}\n onClick={() => handleSectionChange(section.id)}\n aria-current={activeSection === section.id ? 'page' : undefined}\n >\n <span className=\"cedros-dashboard__nav-icon\">{section.icon}</span>\n <span className=\"cedros-dashboard__nav-text\">{section.label}</span>\n </button>\n ))}\n </div>\n </nav>\n\n {/* Org info at bottom */}\n {activeOrg && (\n <div className=\"cedros-dashboard__sidebar-footer\">\n <div className=\"cedros-dashboard__org\">\n <div className=\"cedros-dashboard__org-avatar\">\n {activeOrg.name.charAt(0).toUpperCase()}\n </div>\n <div className=\"cedros-dashboard__org-info\">\n <span className=\"cedros-dashboard__org-name\">{activeOrg.name}</span>\n {role && <span className=\"cedros-dashboard__org-role\">{role}</span>}\n </div>\n </div>\n </div>\n )}\n </aside>\n\n {/* Main Content */}\n <main className=\"cedros-dashboard__main\">\n <header className=\"cedros-dashboard__header\">\n <div className=\"cedros-dashboard__breadcrumb\">\n <span className=\"cedros-dashboard__breadcrumb-root\">{title}</span>\n <span className=\"cedros-dashboard__breadcrumb-sep\">{Icons.chevronRight}</span>\n <span className=\"cedros-dashboard__breadcrumb-current\">{currentSection?.label}</span>\n </div>\n </header>\n\n <div className=\"cedros-dashboard__content\">\n {activeSection === 'overview' && <OverviewSection refreshInterval={refreshInterval} />}\n {activeSection === 'users' && (\n <UsersSection pageSize={pageSize} currentUserId={user?.id} />\n )}\n {activeSection === 'members' && activeOrg && (\n <MembersSection\n orgId={activeOrg.id}\n currentUserId={user?.id}\n hasPermission={hasPermission}\n />\n )}\n {activeSection === 'invites' && activeOrg && (\n <InvitesSection orgId={activeOrg.id} hasPermission={hasPermission} />\n )}\n {activeSection === 'deposits' && (\n <DepositsSection pageSize={pageSize} refreshInterval={refreshInterval} />\n )}\n {activeSection === 'withdrawals' && (\n <WithdrawalsSection pageSize={pageSize} refreshInterval={refreshInterval} />\n )}\n {activeSection === 'settings' && <SettingsSection />}\n </div>\n </main>\n </div>\n );\n}\n\n// =============================================================================\n// Section Components\n// =============================================================================\n\ninterface OverviewSectionProps {\n refreshInterval: number;\n}\n\nfunction OverviewSection({ refreshInterval }: OverviewSectionProps) {\n const { getBalance, isLoading } = useCredits();\n const [balanceDisplay, setBalanceDisplay] = useState<string | null>(null);\n\n useEffect(() => {\n getBalance()\n .then((res) => setBalanceDisplay(res.display))\n .catch(() => setBalanceDisplay(null));\n }, [getBalance]);\n\n return (\n <div className=\"cedros-dashboard__overview\">\n {/* Metric Cards */}\n <div className=\"cedros-dashboard__cards\">\n <div className=\"cedros-dashboard__card\">\n <div className=\"cedros-dashboard__card-header\">\n <span className=\"cedros-dashboard__card-title\">Credit Balance</span>\n <span className=\"cedros-dashboard__card-icon\">{Icons.wallet}</span>\n </div>\n <div className=\"cedros-dashboard__card-value\">\n {isLoading ? '...' : (balanceDisplay ?? '—')}\n </div>\n <p className=\"cedros-dashboard__card-desc\">Available credits for services</p>\n </div>\n </div>\n\n {/* System Status */}\n <PrivacySystemStatus refreshInterval={refreshInterval} />\n\n {/* Deposit Stats */}\n <AdminDepositStats refreshInterval={refreshInterval} />\n </div>\n );\n}\n\ninterface UsersSectionProps {\n pageSize: number;\n currentUserId?: string;\n}\n\nfunction UsersSection({ pageSize, currentUserId }: UsersSectionProps) {\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n\n if (selectedUser) {\n return (\n <div className=\"cedros-dashboard__section\">\n <AdminUserDetail\n userId={selectedUser.id}\n currentUserId={currentUserId}\n onBack={() => setSelectedUser(null)}\n />\n </div>\n );\n }\n\n return (\n <div className=\"cedros-dashboard__section\">\n <p className=\"cedros-dashboard__text-muted\">\n All registered users in the system. Requires system admin privileges.\n </p>\n <AdminUserList\n pageSize={pageSize}\n currentUserId={currentUserId}\n onUserClick={(user) => setSelectedUser(user)}\n />\n </div>\n );\n}\n\ninterface MembersSectionProps {\n orgId: string;\n currentUserId?: string;\n hasPermission: (permission: Permission) => boolean;\n}\n\nfunction MembersSection({ orgId, currentUserId, hasPermission }: MembersSectionProps) {\n const { members, isLoading, error, fetchMembers, updateMemberRole, removeMember } =\n useMembers(orgId);\n\n useEffect(() => {\n fetchMembers();\n }, [fetchMembers]);\n\n return (\n <div className=\"cedros-dashboard__section\">\n <MemberList\n members={members}\n currentUserId={currentUserId}\n isLoading={isLoading}\n error={error?.message}\n canManage={hasPermission('member:remove')}\n canChangeRoles={hasPermission('member:role_change')}\n onUpdateRole={updateMemberRole}\n onRemove={removeMember}\n />\n </div>\n );\n}\n\ninterface InvitesSectionProps {\n orgId: string;\n hasPermission: (permission: Permission) => boolean;\n}\n\nfunction InvitesSection({ orgId, hasPermission }: InvitesSectionProps) {\n const { invites, isLoading, error, fetchInvites, createInvite, cancelInvite, resendInvite } =\n useInvites(orgId);\n\n useEffect(() => {\n fetchInvites();\n }, [fetchInvites]);\n\n const canInvite = hasPermission('invite:create');\n const canCancel = hasPermission('invite:cancel');\n\n return (\n <div className=\"cedros-dashboard__invites\">\n {canInvite && (\n <div className=\"cedros-dashboard__section\">\n <div className=\"cedros-dashboard__section-header\">\n <h3 className=\"cedros-dashboard__section-title\">Send Invitation</h3>\n </div>\n <InviteForm onSubmit={createInvite} isLoading={isLoading} error={error?.message} />\n </div>\n )}\n\n <div className=\"cedros-dashboard__section\">\n <div className=\"cedros-dashboard__section-header\">\n <h3 className=\"cedros-dashboard__section-title\">Pending Invitations</h3>\n </div>\n <InviteList\n invites={invites}\n isLoading={isLoading}\n error={error?.message}\n canManage={canCancel || canInvite}\n onCancel={canCancel ? cancelInvite : undefined}\n onResend={canInvite ? resendInvite : undefined}\n />\n </div>\n </div>\n );\n}\n\ninterface DepositsSectionProps {\n pageSize: number;\n refreshInterval: number;\n}\n\nfunction DepositsSection({ pageSize, refreshInterval }: DepositsSectionProps) {\n const [statusFilter, setStatusFilter] = useState<string>('');\n\n return (\n <div className=\"cedros-dashboard__deposits\">\n {/* Stats summary */}\n <AdminDepositStats refreshInterval={refreshInterval} />\n\n {/* Filter and list */}\n <div className=\"cedros-dashboard__deposits-list\">\n <div className=\"cedros-dashboard__toolbar\">\n <div className=\"cedros-dashboard__filter\">\n <label className=\"cedros-dashboard__filter-label\" htmlFor=\"status-filter\">\n Status\n </label>\n <select\n id=\"status-filter\"\n className=\"cedros-dashboard__select\"\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n >\n <option value=\"\">All statuses</option>\n <option value=\"pending\">Pending</option>\n <option value=\"detected\">Detected</option>\n <option value=\"processing\">Processing</option>\n <option value=\"completed\">Completed</option>\n <option value=\"withdrawn\">Withdrawn</option>\n <option value=\"expired\">Expired</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\n </div>\n\n <AdminDepositList\n statusFilter={statusFilter || undefined}\n pageSize={pageSize}\n refreshInterval={refreshInterval}\n />\n </div>\n </div>\n );\n}\n\ninterface WithdrawalsSectionProps {\n pageSize: number;\n refreshInterval: number;\n}\n\nfunction WithdrawalsSection({ pageSize, refreshInterval }: WithdrawalsSectionProps) {\n return (\n <div className=\"cedros-dashboard__withdrawals\">\n <p className=\"cedros-dashboard__text-muted\">\n Track deposits through the withdrawal pipeline: privacy period, ready for processing, and\n completed.\n </p>\n\n {/* Pipeline view: Privacy Period → Ready → Completed */}\n <div className=\"cedros-dashboard__pipeline\">\n <AdminPrivacyPeriodDeposits pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalQueue pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalHistory pageSize={pageSize} refreshInterval={refreshInterval} />\n </div>\n </div>\n );\n}\n\nfunction SettingsSection() {\n return (\n <div className=\"cedros-dashboard__section\">\n <p className=\"cedros-dashboard__text-muted\">\n Configure system-wide settings. Changes take effect immediately.\n </p>\n <SystemSettings showDescriptions />\n </div>\n );\n}\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","/**\n * QR Code component for TOTP setup\n *\n * Generates QR codes client-side using the qrcode library.\n * SECURITY: Never sends the TOTP secret to external services.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport QRCode from 'qrcode';\n\nexport interface QrCodeProps {\n /** The data to encode in the QR code (e.g., otpauth:// URL) */\n value: string;\n /** Size in pixels (width and height) */\n size?: number;\n /** Alt text for accessibility */\n alt?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Renders a QR code as a canvas element.\n * Generated entirely client-side for security.\n */\nexport function QrCode({ value, size = 200, alt = 'QR code', className = '' }: QrCodeProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current || !value) return;\n\n QRCode.toCanvas(canvasRef.current, value, {\n width: size,\n margin: 2,\n color: {\n dark: '#000000',\n light: '#ffffff',\n },\n errorCorrectionLevel: 'M',\n })\n .then(() => {\n // Clear any previous error on successful generation\n setError(null);\n })\n .catch((err) => {\n setError(err instanceof Error ? err.message : 'Failed to generate QR code');\n });\n }, [value, size]);\n\n if (error) {\n return (\n <div\n className={`cedros-qr-error ${className}`}\n style={{ width: size, height: size }}\n role=\"img\"\n aria-label={alt}\n >\n <p>Failed to generate QR code</p>\n </div>\n );\n }\n\n return (\n <canvas\n ref={canvasRef}\n className={`cedros-totp-qr-image ${className}`}\n role=\"img\"\n aria-label={alt}\n style={{ borderRadius: '0.5rem' }}\n />\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n AuthError,\n TotpStatus,\n TotpSetupResponse,\n TotpBackupCodesResponse,\n TotpSetupState,\n} from '../types';\n\nexport interface UseTotpReturn {\n /** Current TOTP status for the user */\n status: TotpStatus | null;\n /** Setup state for the enrollment flow */\n setupState: TotpSetupState;\n /** Setup data (secret, QR URL, backup codes) */\n setupData: TotpSetupResponse | null;\n /** Whether a request is in progress */\n isLoading: boolean;\n /** Error from the last request */\n error: AuthError | null;\n /** Fetch current TOTP status */\n getStatus: () => Promise<TotpStatus>;\n /** Start TOTP setup (generates secret and backup codes) */\n beginSetup: () => Promise<TotpSetupResponse>;\n /** Verify code and enable TOTP */\n enableTotp: (code: string) => Promise<void>;\n /** Disable TOTP (requires password confirmation) */\n disableTotp: (password: string) => Promise<void>;\n /** Regenerate recovery codes (requires current authenticator code) */\n regenerateBackupCodes: (code: string) => Promise<TotpBackupCodesResponse>;\n /** Clear error state */\n clearError: () => void;\n /** Reset to initial state */\n reset: () => void;\n}\n\n/**\n * Hook for TOTP (Time-based One-Time Password) two-factor authentication.\n *\n * Provides methods for:\n * - Setting up TOTP with authenticator apps\n * - Enabling/disabling TOTP for the user's account\n * - Managing backup codes\n *\n * @example\n * ```tsx\n * function TotpSettings() {\n * const { status, beginSetup, enableTotp, setupData } = useTotp();\n *\n * if (status?.enabled) {\n * return <p>2FA is enabled</p>;\n * }\n *\n * const handleSetup = async () => {\n * const data = await beginSetup();\n * // Show QR code from data.otpauthUri\n * };\n * }\n * ```\n */\nexport function useTotp(): UseTotpReturn {\n const { config, _internal } = useCedrosLogin();\n const [status, setStatus] = useState<TotpStatus | null>(null);\n const [setupState, setSetupState] = useState<TotpSetupState>('idle');\n const [setupData, setSetupData] = useState<TotpSetupResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n getAccessToken: _internal?.getAccessToken,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const getStatus = useCallback(async (): Promise<TotpStatus> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiClient.get<TotpStatus>('/mfa/status');\n setStatus(result);\n return result;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to get TOTP status');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const beginSetup = useCallback(async (): Promise<TotpSetupResponse> => {\n setIsLoading(true);\n setError(null);\n setSetupState('loading');\n\n try {\n const result = await apiClient.post<TotpSetupResponse>('/mfa/setup', {});\n setSetupData(result);\n setSetupState('setup');\n return result;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to start TOTP setup');\n setError(authError);\n setSetupState('error');\n throw authError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const enableTotp = useCallback(\n async (code: string): Promise<void> => {\n if (!/^\\d{6}$/.test(code)) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter a 6-digit code',\n };\n setError(validationError);\n throw validationError;\n }\n\n setIsLoading(true);\n setError(null);\n setSetupState('verifying');\n\n try {\n await apiClient.post('/mfa/enable', { code });\n setSetupState('success');\n setStatus({ enabled: true, recoveryCodesRemaining: setupData?.recoveryCodes.length ?? 0 });\n } catch (err) {\n const authError = handleApiError(err, 'Invalid verification code');\n setError(authError);\n setSetupState('error');\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, setupData]\n );\n\n const disableTotp = useCallback(\n async (password: string): Promise<void> => {\n if (!password) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter your password',\n };\n setError(validationError);\n throw validationError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.post('/mfa/disable', { password });\n setStatus({ enabled: false, recoveryCodesRemaining: 0 });\n setSetupData(null);\n setSetupState('idle');\n } catch (err) {\n const authError = handleApiError(err, 'Failed to disable TOTP');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const regenerateBackupCodes = useCallback(\n async (code: string): Promise<TotpBackupCodesResponse> => {\n if (!/^\\d{6}$/.test(code)) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter a 6-digit code',\n };\n setError(validationError);\n throw validationError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiClient.post<TotpBackupCodesResponse>(\n '/mfa/recovery-codes/regenerate',\n { code }\n );\n return result;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to regenerate recovery codes');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n const reset = useCallback(() => {\n setError(null);\n setSetupData(null);\n setSetupState('idle');\n setIsLoading(false);\n }, []);\n\n return {\n status,\n setupState,\n setupData,\n isLoading,\n error,\n getStatus,\n beginSetup,\n enableTotp,\n disableTotp,\n regenerateBackupCodes,\n clearError,\n reset,\n };\n}\n","/**\n * TOTP Setup component for enabling two-factor authentication\n *\n * Guides users through:\n * 1. Scanning QR code with authenticator app\n * 2. Saving backup codes\n * 3. Verifying setup with a code\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport { useTotp } from '../../hooks/useTotp';\nimport { OtpInput } from './OtpInput';\nimport { QrCode } from './QrCode';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface TotpSetupProps {\n /** Called when setup is completed successfully */\n onSuccess?: () => void;\n /** Called when user cancels setup */\n onCancel?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Two-factor authentication setup wizard.\n *\n * Displays QR code for authenticator app scanning,\n * recovery codes for account recovery, and verification step.\n */\nexport function TotpSetup({ onSuccess, onCancel, className = '' }: TotpSetupProps) {\n const { setupState, setupData, isLoading, error, beginSetup, enableTotp, clearError, reset } =\n useTotp();\n\n const [step, setStep] = useState<'qr' | 'backup' | 'verify'>('qr');\n const [verifyCode, setVerifyCode] = useState('');\n const [copiedSecret, setCopiedSecret] = useState(false);\n const [savedBackupCodes, setSavedBackupCodes] = useState(false);\n const copyTimerRef = useRef<number | null>(null);\n\n // Start setup on mount\n useEffect(() => {\n if (setupState === 'idle') {\n beginSetup().catch(() => {\n // Error handled by hook\n });\n }\n }, [setupState, beginSetup]);\n\n // Handle successful setup\n useEffect(() => {\n if (setupState === 'success') {\n onSuccess?.();\n }\n }, [setupState, onSuccess]);\n\n const handleCopySecret = async () => {\n if (setupData?.secret) {\n await navigator.clipboard.writeText(setupData.secret);\n setCopiedSecret(true);\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => setCopiedSecret(false), 2000);\n }\n };\n\n const handleCopyBackupCodes = async () => {\n if (setupData?.recoveryCodes) {\n const codes = setupData.recoveryCodes.join('\\n');\n await navigator.clipboard.writeText(codes);\n }\n };\n\n const handleVerify = async () => {\n try {\n await enableTotp(verifyCode);\n } catch {\n // Error handled by hook\n setVerifyCode('');\n }\n };\n\n const handleCancel = () => {\n reset();\n onCancel?.();\n };\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n copyTimerRef.current = null;\n }\n };\n }, []);\n\n // Loading state\n if (setupState === 'loading' || (setupState === 'idle' && isLoading)) {\n return (\n <div className={`cedros-totp-setup ${className}`}>\n <div className=\"cedros-totp-loading\">\n <LoadingSpinner size=\"lg\" label=\"Setting up two-factor authentication\" />\n </div>\n </div>\n );\n }\n\n // Error state (failed to start setup)\n if (setupState === 'error' && !setupData) {\n return (\n <div className={`cedros-totp-setup ${className}`}>\n <ErrorMessage error={error} onDismiss={clearError} />\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => beginSetup()}\n >\n Try again\n </button>\n </div>\n </div>\n );\n }\n\n // Success state\n if (setupState === 'success') {\n return (\n <div className={`cedros-totp-setup ${className}`}>\n <div className=\"cedros-totp-success\">\n <svg\n className=\"cedros-totp-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"22\" stroke=\"var(--cedros-success)\" strokeWidth=\"2\" />\n <path\n d=\"M14 24l7 7 13-13\"\n stroke=\"var(--cedros-success)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3 className=\"cedros-totp-title\">Two-factor authentication enabled</h3>\n <p className=\"cedros-totp-description\">\n Your account is now protected with an additional layer of security.\n </p>\n </div>\n </div>\n );\n }\n\n if (!setupData) return null;\n\n return (\n <div className={`cedros-totp-setup ${className}`}>\n {/* Step 1: QR Code */}\n {step === 'qr' && (\n <div className=\"cedros-totp-step\">\n <h3 className=\"cedros-totp-title\">Scan QR code</h3>\n <p className=\"cedros-totp-description\">\n Use your authenticator app to scan this QR code.\n </p>\n\n <div className=\"cedros-totp-qr\">\n {/* QR code generated client-side from the server-provided otpauth URI */}\n <QrCode value={setupData.otpauthUri} size={200} alt=\"QR code for authenticator app\" />\n </div>\n\n <div className=\"cedros-totp-manual\">\n <p className=\"cedros-totp-manual-label\">Or enter this code manually:</p>\n <div className=\"cedros-totp-secret\">\n <code className=\"cedros-totp-secret-code\">{setupData.secret}</code>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-ghost cedros-button-sm\"\n onClick={handleCopySecret}\n aria-label=\"Copy secret\"\n >\n {copiedSecret ? 'Copied!' : 'Copy'}\n </button>\n </div>\n </div>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => setStep('backup')}\n >\n Continue\n </button>\n </div>\n </div>\n )}\n\n {/* Step 2: Recovery Codes */}\n {step === 'backup' && (\n <div className=\"cedros-totp-step\">\n <h3 className=\"cedros-totp-title\">Save recovery codes</h3>\n <p className=\"cedros-totp-description\">\n Save these codes in a secure place. You can use them to access your account if you lose\n your authenticator device.\n </p>\n\n <div className=\"cedros-totp-backup-codes\">\n {setupData.recoveryCodes.map((code, index) => (\n <code key={index} className=\"cedros-totp-backup-code\">\n {code}\n </code>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md cedros-button-full\"\n onClick={handleCopyBackupCodes}\n >\n Copy all codes\n </button>\n\n <label className=\"cedros-checkbox-label cedros-totp-confirm\">\n <input\n type=\"checkbox\"\n className=\"cedros-checkbox\"\n checked={savedBackupCodes}\n onChange={(e) => setSavedBackupCodes(e.target.checked)}\n />\n <span className=\"cedros-checkbox-text\">I have saved these recovery codes</span>\n </label>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => setStep('qr')}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => setStep('verify')}\n disabled={!savedBackupCodes}\n >\n Continue\n </button>\n </div>\n </div>\n )}\n\n {/* Step 3: Verify */}\n {step === 'verify' && (\n <div className=\"cedros-totp-step\">\n <h3 className=\"cedros-totp-title\">Verify setup</h3>\n <p className=\"cedros-totp-description\">\n Enter the 6-digit code from your authenticator app to complete setup.\n </p>\n\n <OtpInput\n value={verifyCode}\n onChange={setVerifyCode}\n onComplete={handleVerify}\n disabled={isLoading}\n error={error?.message}\n autoFocus\n />\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => setStep('backup')}\n disabled={isLoading}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={handleVerify}\n disabled={isLoading || verifyCode.length !== 6}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Verifying...</span>\n </>\n ) : (\n 'Enable 2FA'\n )}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * TOTP Settings component for managing two-factor authentication\n *\n * Allows users to:\n * - View current 2FA status\n * - Enable 2FA (via TotpSetup wizard)\n * - Disable 2FA (requires verification)\n * - Regenerate backup codes\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useTotp } from '../../hooks/useTotp';\nimport { TotpSetup } from './TotpSetup';\nimport { OtpInput } from './OtpInput';\nimport { PasswordInput } from '../email/PasswordInput';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface TotpSettingsProps {\n /** Called when 2FA status changes */\n onStatusChange?: (enabled: boolean) => void;\n /** Additional CSS class */\n className?: string;\n}\n\ntype SettingsView = 'status' | 'setup' | 'disable' | 'regenerate';\n\n/**\n * Two-factor authentication settings panel.\n *\n * Shows current 2FA status and provides controls for\n * enabling, disabling, and managing backup codes.\n *\n * @example\n * ```tsx\n * function SecuritySettings() {\n * return (\n * <div>\n * <h2>Security</h2>\n * <TotpSettings\n * onStatusChange={(enabled) => {\n * console.log('2FA is now', enabled ? 'enabled' : 'disabled');\n * }}\n * />\n * </div>\n * );\n * }\n * ```\n */\nexport function TotpSettings({ onStatusChange, className = '' }: TotpSettingsProps) {\n const { status, isLoading, error, getStatus, disableTotp, regenerateBackupCodes, clearError } =\n useTotp();\n\n const [view, setView] = useState<SettingsView>('status');\n const [disablePassword, setDisablePassword] = useState('');\n const [regenerateCode, setRegenerateCode] = useState('');\n const [newRecoveryCodes, setNewRecoveryCodes] = useState<string[] | null>(null);\n const [actionLoading, setActionLoading] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n // Fetch status on mount\n useEffect(() => {\n getStatus().catch(() => {\n // Error handled by hook\n });\n }, [getStatus]);\n\n const handleSetupComplete = useCallback(() => {\n setView('status');\n onStatusChange?.(true);\n }, [onStatusChange]);\n\n const handleDisable = async () => {\n setActionLoading(true);\n setActionError(null);\n try {\n await disableTotp(disablePassword);\n setView('status');\n setDisablePassword('');\n onStatusChange?.(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Failed to disable 2FA');\n setDisablePassword('');\n } finally {\n setActionLoading(false);\n }\n };\n\n const handleRegenerate = async () => {\n setActionLoading(true);\n setActionError(null);\n try {\n const result = await regenerateBackupCodes(regenerateCode);\n setNewRecoveryCodes(result.recoveryCodes);\n setRegenerateCode('');\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Failed to regenerate codes');\n setRegenerateCode('');\n } finally {\n setActionLoading(false);\n }\n };\n\n const handleCopyBackupCodes = async () => {\n if (newRecoveryCodes) {\n await navigator.clipboard.writeText(newRecoveryCodes.join('\\n'));\n }\n };\n\n // Loading state\n if (isLoading && !status) {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-loading\">\n <LoadingSpinner size=\"md\" label=\"Loading security settings\" />\n </div>\n </div>\n );\n }\n\n // Error state\n if (error && !status) {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <ErrorMessage error={error} onDismiss={clearError} />\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => getStatus()}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Setup view\n if (view === 'setup') {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <TotpSetup onSuccess={handleSetupComplete} onCancel={() => setView('status')} />\n </div>\n );\n }\n\n // Disable confirmation view\n if (view === 'disable') {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <h3 className=\"cedros-totp-title\">Disable two-factor authentication</h3>\n <p className=\"cedros-totp-description cedros-totp-warning\">\n This will make your account less secure. Enter your password to confirm.\n </p>\n\n {actionError && (\n <div className=\"cedros-totp-error\">\n <ErrorMessage\n error={{ code: 'UNKNOWN_ERROR', message: actionError }}\n onDismiss={() => setActionError(null)}\n />\n </div>\n )}\n\n <div className=\"cedros-totp-verify-input\">\n <PasswordInput\n label=\"Password\"\n placeholder=\"Enter your password\"\n value={disablePassword}\n onChange={(e) => setDisablePassword(e.target.value)}\n disabled={actionLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => {\n setView('status');\n setDisablePassword('');\n setActionError(null);\n }}\n disabled={actionLoading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-destructive cedros-button-md\"\n onClick={handleDisable}\n disabled={actionLoading || disablePassword.length === 0}\n >\n {actionLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Disabling...</span>\n </>\n ) : (\n 'Disable 2FA'\n )}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Regenerate backup codes view\n if (view === 'regenerate') {\n // Show new codes after regeneration\n if (newRecoveryCodes) {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <h3 className=\"cedros-totp-title\">New recovery codes</h3>\n <p className=\"cedros-totp-description\">\n Save these codes in a secure place. Your old codes are no longer valid.\n </p>\n\n <div className=\"cedros-totp-backup-codes\">\n {newRecoveryCodes.map((code, index) => (\n <code key={index} className=\"cedros-totp-backup-code\">\n {code}\n </code>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md cedros-button-full\"\n onClick={handleCopyBackupCodes}\n >\n Copy all codes\n </button>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => {\n setView('status');\n setNewRecoveryCodes(null);\n }}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Code entry for regeneration\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <h3 className=\"cedros-totp-title\">Regenerate recovery codes</h3>\n <p className=\"cedros-totp-description\">\n This will invalidate all existing recovery codes. Enter your authenticator code to\n confirm.\n </p>\n\n {actionError && (\n <div className=\"cedros-totp-error\">\n <ErrorMessage\n error={{ code: 'UNKNOWN_ERROR', message: actionError }}\n onDismiss={() => setActionError(null)}\n />\n </div>\n )}\n\n <div className=\"cedros-totp-verify-input\">\n <OtpInput\n value={regenerateCode}\n onChange={setRegenerateCode}\n onComplete={handleRegenerate}\n disabled={actionLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => {\n setView('status');\n setRegenerateCode('');\n setActionError(null);\n }}\n disabled={actionLoading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={handleRegenerate}\n disabled={actionLoading || regenerateCode.length !== 6}\n >\n {actionLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Regenerating...</span>\n </>\n ) : (\n 'Regenerate codes'\n )}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Main status view\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <div className=\"cedros-totp-status-header\">\n <div className=\"cedros-totp-status-info\">\n <h3 className=\"cedros-totp-title\">Two-factor authentication</h3>\n <p className=\"cedros-totp-description\">\n Add an extra layer of security to your account by requiring a verification code from\n your authenticator app when signing in.\n </p>\n </div>\n <div\n className={`cedros-totp-badge ${status?.enabled ? 'cedros-totp-badge-enabled' : 'cedros-totp-badge-disabled'}`}\n >\n {status?.enabled ? 'Enabled' : 'Disabled'}\n </div>\n </div>\n\n {status?.enabled ? (\n <div className=\"cedros-totp-enabled-actions\">\n <div className=\"cedros-totp-description\" style={{ marginTop: '0.25rem' }}>\n Recovery codes remaining: <strong>{status.recoveryCodesRemaining}</strong>\n </div>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => setView('regenerate')}\n >\n Regenerate recovery codes\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-destructive-outline cedros-button-md\"\n onClick={() => setView('disable')}\n >\n Disable 2FA\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => setView('setup')}\n >\n Enable two-factor authentication\n </button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Hook for Privacy Cash deposit operations\n *\n * Handles depositing SOL to the user's Privacy Cash account.\n * Requires an unlocked SSS wallet with no-recovery mode.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseDepositReturn,\n DepositResponse,\n DepositStatusResponse,\n DepositConfigResponse,\n DepositListResponse,\n DepositQuoteResponse,\n PublicDepositRequest,\n MicroDepositRequest,\n TieredDepositResponse,\n} from '../types/deposit';\n\nexport type { UseDepositReturn } from '../types/deposit';\n\n/**\n * Hook for Privacy Cash deposit operations\n *\n * Deposits go to the user's Privacy Cash account (user's pubkey is owner).\n * Credits are issued immediately, withdrawal to company wallet happens later.\n *\n * Requirements:\n * - User must have SSS wallet enrolled\n * - Wallet must be unlocked (call POST /wallet/unlock first)\n * - Wallet must be in \"no recovery\" mode\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useDeposit(): UseDepositReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const deposit = useCallback(\n async (amountLamports: number): Promise<DepositResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<DepositResponse>('/deposit', {\n amount_lamports: amountLamports,\n });\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to execute deposit');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStatus = useCallback(\n async (sessionId: string): Promise<DepositStatusResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<DepositStatusResponse>(`/deposit/status/${sessionId}`);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getConfig = useCallback(async (): Promise<DepositConfigResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<DepositConfigResponse>('/deposit/config');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit config');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listDeposits = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<DepositListResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/deposits?${query}` : '/deposits';\n const data = await apiClient.get<DepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getQuote = useCallback(\n async (params: {\n inputMint: string;\n amount: number;\n taker: string;\n }): Promise<DepositQuoteResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const queryParams = new URLSearchParams({\n input_mint: params.inputMint,\n amount: String(params.amount),\n taker: params.taker,\n });\n const data = await apiClient.get<DepositQuoteResponse>(`/deposit/quote?${queryParams}`);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit quote');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const publicDeposit = useCallback(\n async (request: PublicDepositRequest): Promise<TieredDepositResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<TieredDepositResponse>('/deposit/public', request);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to execute public deposit');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const microDeposit = useCallback(\n async (request: MicroDepositRequest): Promise<TieredDepositResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<TieredDepositResponse>('/deposit/micro', request);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to execute micro deposit');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n return {\n deposit,\n getQuote,\n publicDeposit,\n microDeposit,\n getStatus,\n getConfig,\n listDeposits,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Token selector component for deposit currency selection\n *\n * Allows users to select which token to deposit.\n * Supports search and displays token icons.\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type { Token } from './tokens';\n\nexport interface TokenSelectorProps {\n /** List of available tokens */\n tokens: Token[];\n /** Currently selected token */\n selectedToken?: Token;\n /** Callback when token is selected */\n onSelect: (token: Token) => void;\n /** Signal to force-open the dropdown */\n openSignal?: number;\n /** Placeholder text when no token selected */\n placeholder?: string;\n /** Disable the selector */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Show search input */\n searchable?: boolean;\n}\n\n/**\n * Token selector dropdown component\n */\nexport function TokenSelector({\n tokens,\n selectedToken,\n onSelect,\n openSignal,\n placeholder = 'Select token',\n disabled = false,\n className = '',\n searchable = true,\n}: TokenSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Filter tokens by search\n const filteredTokens = useMemo(() => {\n if (!search.trim()) return tokens;\n const searchLower = search.toLowerCase();\n return tokens.filter(\n (token) =>\n token.symbol.toLowerCase().includes(searchLower) ||\n token.name.toLowerCase().includes(searchLower) ||\n token.mint.toLowerCase().includes(searchLower)\n );\n }, [tokens, search]);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setSearch('');\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Focus search input when opening\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n useEffect(() => {\n if (openSignal === undefined || disabled) return;\n setIsOpen(true);\n setSearch('');\n }, [openSignal, disabled]);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n if (isOpen) {\n setSearch('');\n }\n }\n }, [disabled, isOpen]);\n\n const handleSelect = useCallback(\n (token: Token) => {\n onSelect(token);\n setIsOpen(false);\n setSearch('');\n },\n [onSelect]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n setSearch('');\n } else if (event.key === 'Enter' && filteredTokens.length === 1) {\n handleSelect(filteredTokens[0]);\n }\n },\n [filteredTokens, handleSelect]\n );\n\n return (\n <div\n ref={containerRef}\n className={`cedros-token-selector ${isOpen ? 'cedros-token-selector-open' : ''} ${disabled ? 'cedros-token-selector-disabled' : ''} ${className}`}\n onKeyDown={handleKeyDown}\n >\n {/* Trigger button */}\n <button\n type=\"button\"\n className=\"cedros-token-selector-trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n >\n {selectedToken ? (\n <span className=\"cedros-token-selector-selected\">\n {selectedToken.logoUrl && (\n <img\n src={selectedToken.logoUrl}\n alt={selectedToken.symbol}\n className=\"cedros-token-icon\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n )}\n <span className=\"cedros-token-symbol\">{selectedToken.symbol}</span>\n </span>\n ) : (\n <span className=\"cedros-token-selector-placeholder\">{placeholder}</span>\n )}\n <span className=\"cedros-token-selector-arrow\">{isOpen ? '▲' : '▼'}</span>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div className=\"cedros-token-selector-dropdown\" role=\"listbox\">\n {/* Search input */}\n {searchable && (\n <div className=\"cedros-token-search\">\n <input\n ref={searchInputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search tokens...\"\n className=\"cedros-token-search-input\"\n />\n </div>\n )}\n\n {/* Token list */}\n <div className=\"cedros-token-list\">\n {filteredTokens.length === 0 ? (\n <div className=\"cedros-token-empty\">No tokens found</div>\n ) : (\n <>\n {filteredTokens.map((token) => (\n <button\n key={token.mint}\n type=\"button\"\n className={`cedros-token-option ${selectedToken?.mint === token.mint ? 'cedros-token-option-selected' : ''}`}\n onClick={() => handleSelect(token)}\n role=\"option\"\n aria-selected={selectedToken?.mint === token.mint}\n >\n {token.logoUrl && (\n <img\n src={token.logoUrl}\n alt={token.symbol}\n className=\"cedros-token-icon\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n )}\n <span className=\"cedros-token-info\">\n <span className=\"cedros-token-symbol\">{token.symbol}</span>\n <span className=\"cedros-token-name\">{token.name}</span>\n </span>\n {selectedToken?.mint === token.mint && (\n <span className=\"cedros-token-check\">✓</span>\n )}\n </button>\n ))}\n </>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { DepositConfigResponse, DepositTier } from '../../types/deposit';\n\n/**\n * Determine which tier an amount falls into\n *\n * When private deposits are disabled (recovery mode enabled), the 'private'\n * tier is not available and amounts that would qualify for it fall back to 'public'.\n */\nexport function getTierForAmount(usd: number, config: DepositConfigResponse): DepositTier {\n // Skip private tier if recovery mode is enabled (privateDepositsEnabled is false)\n if (config.privateDepositsEnabled && usd >= config.privateMinUsd) return 'private';\n if (usd >= config.publicMinUsd) return 'public';\n return 'sol_micro';\n}\n","export default \"data:image/webp;base64,UklGRkACAABXRUJQVlA4IDQCAACQDQCdASo8ADwAPjEWiUMiISEUBFQgAwSgB4Z/TeLt3XMAoQH23eph0gPMB+sn+M9tvngOsA9ADwgPg3/cH9sfZciikEBuA1AB+nf+84CUkAVvA2x4xvyobR+mBaYhjUv/ewHb4hTqOnP38rzsxZX2inOSciAA/v7uqvqGdpWcjjrfMDFaNHumTog38t3yor0kbjn631VsX61cAC749wWuAX74u/f/hpeDFqS/ci8E1g94wk9UVs7BHqtv7f/M9iT1u5ITJV0Gv6tE/CW5j/nVR6yExJ6JoDRDOWQ8zVpWH92r3Lnbnc4WJpOchbRT3H5rv//6PP+F//4ehLUlR/4tkRUKZu/yOa26+sywmY+Xc1X2lXMcUv7+eQ7+FBE7bhKc7htieBfH4eR134AVaILL7PWA2FjzAjfaP1Lgirqoq/ZooE8jVD/b4g3J3O3/TG/4ajHe6clnAI/4NdwrnHX0P/quBU03HqSsQ0qsEMAuhrH/jn+YtDzmjm8q/cGJ44qvi24Hn+G1kxz2XP2S/Gp7ri5cMlo+muuwBjyNJnnEcTt/5cRdYS2cbEBZtpINWj3PuC1EOsd/8cTepSpxODcJHLzktfC1PHW3Pgoh3J5PHjW3TCQ1Wlu/wP8e8OPfNm48BODGChioj3ezblqrOBV+cI+hLi7ReJdvBF/4jY+/Un0asuWnrA6kRNpgOeO8wyl4Ryhkrff+9R1SpyPYP+5T3EuWWLZaCn0bGzyk97S3VAAAAAA=\"","/**\n * Tiered amount input with deposit tier indicator\n *\n * Shows which deposit tier (private, public, sol_micro) applies\n * based on the entered USD amount. Displays tier-specific guidance\n * for privacy and processing expectations.\n */\n\nimport { useMemo } from 'react';\nimport type { DepositTier, DepositConfigResponse } from '../../types/deposit';\nimport { getTierForAmount } from './tierUtils';\nimport solLogo from '../../assets/tokens/sol.webp';\n\nexport interface TieredAmountSliderProps {\n /** Deposit configuration with tier thresholds */\n config: DepositConfigResponse;\n /** Current amount in USD */\n valueUsd: number;\n /** Amount change handler */\n onChange: (valueUsd: number) => void;\n /** Cap in USD (default: 10000) */\n maxUsd?: number;\n /** Disabled state */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst DEFAULT_MAX_USD = 10_000;\nconst SLIDER_STEPS = 1000;\nconst CURVE_POWER = 3;\n\nfunction formatUsd(value: number): string {\n if (!Number.isFinite(value)) return '$0';\n return `$${Math.round(value)}`;\n}\n\nfunction getTierInfo(tier: DepositTier, config: DepositConfigResponse) {\n switch (tier) {\n case 'private':\n return {\n label: 'Private',\n detail: 'Private transaction, instant credit',\n note: null,\n };\n case 'public':\n return {\n label: 'Public',\n detail: 'Visible on-chain, instant credit',\n note: null,\n };\n case 'sol_micro':\n return {\n label: 'SOL Only',\n detail: `SOL only under ${formatUsd(config.solMicroMaxUsd)}`,\n note: 'Small deposits must be sent in SOL and are visible on-chain. Increase the amount to use tokens.',\n };\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction usdToSlider(usd: number, maxUsd: number): number {\n if (maxUsd <= 0) return 0;\n const normalized = clamp(usd / maxUsd, 0, 1);\n return Math.round(Math.pow(normalized, 1 / CURVE_POWER) * SLIDER_STEPS);\n}\n\nfunction sliderToUsd(position: number, maxUsd: number): number {\n const normalized = clamp(position / SLIDER_STEPS, 0, 1);\n return maxUsd * Math.pow(normalized, CURVE_POWER);\n}\n\nfunction getUsdStep(value: number): number {\n if (value < 10) return 0.01;\n if (value < 100) return 1;\n if (value < 500) return 5;\n if (value < 1000) return 10;\n if (value < 5000) return 25;\n return 50;\n}\n\nfunction getStepDecimals(step: number): number {\n if (step < 1) return 2;\n return 0;\n}\n\nfunction roundUsd(value: number): number {\n const step = getUsdStep(value);\n const rounded = Math.round(value / step) * step;\n const decimals = getStepDecimals(step);\n return Number(rounded.toFixed(decimals));\n}\n\n/**\n * Tiered amount input with deposit tier indicator\n */\nexport function TieredAmountSlider({\n config,\n valueUsd,\n onChange,\n maxUsd = DEFAULT_MAX_USD,\n disabled = false,\n className = '',\n}: TieredAmountSliderProps) {\n const normalizedValue = clamp(Number.isFinite(valueUsd) ? valueUsd : 0, 0, maxUsd);\n const tier = useMemo(() => getTierForAmount(normalizedValue, config), [normalizedValue, config]);\n const tierInfo = getTierInfo(tier, config);\n const sliderValue = usdToSlider(normalizedValue, maxUsd);\n const sliderPercent = (sliderValue / SLIDER_STEPS) * 100;\n\n return (\n <div className={`cedros-tiered-slider ${className}`}>\n <div className=\"cedros-tiered-slider-input-row\">\n <div className=\"cedros-tiered-slider-input\">\n <span className=\"cedros-tiered-slider-currency\">$</span>\n <input\n type=\"number\"\n value={normalizedValue || ''}\n onChange={(e) => onChange(roundUsd(parseFloat(e.target.value) || 0))}\n placeholder=\"Enter amount\"\n disabled={disabled}\n min={0}\n step={getUsdStep(normalizedValue)}\n className=\"cedros-deposit-flow-input cedros-tiered-slider-input-field\"\n aria-label=\"Deposit amount\"\n />\n </div>\n <div className=\"cedros-tiered-slider-tier\">\n <span className={`cedros-tiered-slider-badge cedros-tiered-slider-badge-${tier}`}>\n {tier === 'sol_micro' && (\n <img src={solLogo} alt=\"SOL\" className=\"cedros-tiered-slider-badge-icon\" />\n )}\n {tierInfo.label}\n </span>\n <span className=\"cedros-tiered-slider-tier-detail\">{tierInfo.detail}</span>\n </div>\n </div>\n\n <input\n type=\"range\"\n min={0}\n max={SLIDER_STEPS}\n step={1}\n value={sliderValue}\n onChange={(e) => onChange(roundUsd(sliderToUsd(parseFloat(e.target.value), maxUsd)))}\n className=\"cedros-tiered-slider-range\"\n style={{\n background: `linear-gradient(to right, var(--cedros-primary) 0%, var(--cedros-primary) ${sliderPercent}%, var(--cedros-border) ${sliderPercent}%, var(--cedros-border) 100%)`,\n }}\n disabled={disabled}\n aria-label=\"Deposit amount slider\"\n />\n\n {tierInfo.note && <div className=\"cedros-tiered-slider-note\">{tierInfo.note}</div>}\n </div>\n );\n}\n","/**\n * Multi-step deposit flow component\n *\n * Provides a complete deposit wizard with configurable currency support:\n * - SOL only mode\n * - Single token mode (admin-configured token)\n * - Multi-token mode (user selects from allowed tokens)\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { useDeposit } from '../../hooks/useDeposit';\nimport { useWallet } from '../../hooks/useWallet';\nimport { TokenSelector } from './TokenSelector';\nimport { TieredAmountSlider } from './TieredAmountSlider';\nimport { getTierForAmount } from './tierUtils';\nimport solLogo from '../../assets/tokens/sol.webp';\nimport { sanitizeExternalUrl } from '../../utils/sanitization';\nimport type { Token } from './tokens';\nimport type { DepositResponse, DepositConfigResponse } from '../../types/deposit';\n\n/** Check if any user-facing fee is enabled */\nfunction hasUserFee(config: DepositConfigResponse): boolean {\n return (\n config.companyFeePercent > 0 ||\n config.feePolicy === 'user_pays_all' ||\n config.feePolicy === 'user_pays_swap' ||\n config.feePolicy === 'user_pays_privacy'\n );\n}\n\n/** Calculate effective fee percentage based on config and deposit type */\nfunction getEffectiveFeePercent(\n config: DepositConfigResponse,\n isPrivate: boolean,\n isMicro: boolean\n): number {\n const { feePolicy, privacyFeePercent, swapFeePercent, companyFeePercent } = config;\n let userFee = companyFeePercent;\n if (isMicro) return userFee;\n if (feePolicy === 'user_pays_all') {\n userFee += swapFeePercent;\n if (isPrivate) {\n userFee += privacyFeePercent;\n }\n } else if (feePolicy === 'user_pays_privacy' && isPrivate) {\n userFee += privacyFeePercent;\n } else if (feePolicy === 'user_pays_swap') {\n userFee += swapFeePercent;\n }\n return userFee;\n}\n\n/** Currency configuration mode */\nexport type CurrencyMode = 'sol' | 'single-token' | 'multi-token';\n\n/** Deposit method - how the user will deposit funds */\nexport type DepositMethod = 'sign' | 'receive';\n\n/** Flow step */\nexport type DepositFlowStep =\n | 'explainer'\n | 'unlock'\n | 'confirm' // Sign mode: select token + enter amount + sign\n | 'signing'\n | 'show-address' // Receive mode: select token + show address, auto-detect amount\n | 'waiting'\n | 'success'\n | 'error';\n\n/** Configuration for the optional explainer step */\nexport interface ExplainerConfig {\n /** Custom title (default: \"How Deposits Work\") */\n title?: string;\n /** Custom body text (default explains Solana and suggests exchange) */\n body?: string;\n /** Exchange URL (default: \"https://www.coinbase.com\") */\n exchangeUrl?: string;\n /** Exchange name (default: \"Coinbase\") */\n exchangeName?: string;\n /** Whether to show the exchange suggestion (default: true) */\n showExchangeSuggestion?: boolean;\n}\n\nexport interface DepositFlowProps {\n /** Deposit configuration (required) */\n config: DepositConfigResponse;\n /**\n * Currency mode determines what tokens users can deposit:\n * - 'sol': SOL only (no token selection step)\n * - 'single-token': Single admin-configured token (shows token info, no selection)\n * - 'multi-token': User selects from available tokens\n */\n currencyMode: CurrencyMode;\n /**\n * Deposit method determines how the user deposits:\n * - 'sign': User has a connected wallet and signs transactions (default for browser wallets)\n * - 'receive': User sends from external source (exchange) to deposit address (embedded wallet)\n *\n * If not specified, auto-detects based on wallet status:\n * - If user has external wallet connected → 'sign'\n * - If user has embedded wallet only → 'receive'\n */\n depositMethod?: DepositMethod;\n /**\n * Available tokens for single-token or multi-token modes.\n * For single-token mode, only the first token is used.\n * Ignored in 'sol' mode.\n */\n tokens?: Token[];\n /** Pre-selected token (for multi-token mode) */\n defaultToken?: Token;\n /** Minimum deposit amount (overrides server config) */\n minAmount?: number;\n /** Maximum deposit amount */\n maxAmount?: number;\n /** Callback on successful deposit */\n onSuccess?: (result: DepositFlowResult) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback when user cancels */\n onCancel?: () => void;\n /** Callback to request wallet unlock */\n onUnlockRequired?: () => void;\n /**\n * Callback to authorize deposit with password/PIN.\n * This sends the password to the server to decrypt Share B for withdrawal signing.\n * Returns the session ID for tracking the deposit.\n *\n * For sign mode: amount is the user-entered deposit amount\n * For receive mode: amount is 0 (auto-detected when deposit arrives)\n */\n onAuthorize?: (\n password: string,\n amount: number | null,\n token: Token\n ) => Promise<{ sessionId: string; depositAddress: string }>;\n /** Additional CSS classes */\n className?: string;\n /** Show step indicator */\n showStepIndicator?: boolean;\n /** Polling interval for checking deposit status in receive mode (ms, default: 5000) */\n pollInterval?: number;\n /** Demo mode - skips wallet checks for Storybook/testing (default: false) */\n demoMode?: boolean;\n /** Demo mode auto-confirm delay in ms (storybook only) */\n demoAutoConfirmMs?: number;\n /** USD price overrides for non-USD tokens (by symbol) */\n tokenPriceUsd?: Record<string, number>;\n /**\n * Show an optional explainer step for non-crypto-native users.\n * This explains Solana and suggests an exchange for purchasing.\n * Admin-controlled setting (default: false)\n */\n showExplainer?: boolean;\n /** Site name to display in explainer (e.g., \"Acme Inc\") */\n siteName?: string;\n /** Configuration for the explainer step content */\n explainerConfig?: ExplainerConfig;\n}\n\nexport interface DepositFlowResult {\n /** Selected token (null for SOL) */\n token: Token | null;\n /** Amount in token units */\n amount: number;\n /** Amount in lamports (for SOL) or smallest unit */\n amountSmallestUnit: number;\n /** Transaction signature (for sign mode) */\n txSignature: string;\n /** Session ID for tracking */\n sessionId: string;\n /** Deposit response from server */\n response: DepositResponse;\n /** Deposit method used */\n method: DepositMethod;\n /** Deposit address (for receive mode) */\n depositAddress?: string;\n}\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\n/**\n * SOL token definition for SOL-only mode\n */\nconst SOL_TOKEN: Token = {\n mint: 'So11111111111111111111111111111111111111112',\n symbol: 'SOL',\n name: 'Solana',\n decimals: 9,\n logoUrl: solLogo,\n};\n\nconst OTHER_TOKEN: Token = {\n mint: 'other',\n symbol: 'OTHER',\n name: 'Other',\n decimals: 6,\n};\n\nconst MAX_DEPOSIT_USD = 10_000;\n\ninterface FeeLineItem {\n label: string;\n solAmount: number;\n percent: number;\n usdAmount: number;\n}\n\nfunction calculateFeeLines(config: DepositConfigResponse, amountUsd: number): FeeLineItem[] {\n const isMicro = amountUsd < config.publicMinUsd;\n const isPrivate = amountUsd >= config.privateMinUsd;\n const lines: FeeLineItem[] = [];\n\n const privacyActive =\n !isMicro &&\n isPrivate &&\n (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_privacy') &&\n (config.privacyFeeFixedLamports > 0 || config.privacyFeePercent > 0);\n const swapActive =\n !isMicro &&\n (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_swap') &&\n (config.swapFeeFixedLamports > 0 || config.swapFeePercent > 0);\n const companyActive = config.companyFeeFixedLamports > 0 || config.companyFeePercent > 0;\n\n if (privacyActive) {\n const solAmount = config.privacyFeeFixedLamports / LAMPORTS_PER_SOL;\n const percent = config.privacyFeePercent;\n const fixedUsd = solAmount * config.solPriceUsd;\n const percentUsd = amountUsd * (percent / 100);\n lines.push({ label: 'Privacy', solAmount, percent, usdAmount: fixedUsd + percentUsd });\n }\n if (swapActive) {\n const solAmount = config.swapFeeFixedLamports / LAMPORTS_PER_SOL;\n const percent = config.swapFeePercent;\n const fixedUsd = solAmount * config.solPriceUsd;\n const percentUsd = amountUsd * (percent / 100);\n lines.push({ label: 'Swap', solAmount, percent, usdAmount: fixedUsd + percentUsd });\n }\n if (companyActive) {\n const solAmount = config.companyFeeFixedLamports / LAMPORTS_PER_SOL;\n const percent = config.companyFeePercent;\n const fixedUsd = solAmount * config.solPriceUsd;\n const percentUsd = amountUsd * (percent / 100);\n lines.push({ label: 'Service', solAmount, percent, usdAmount: fixedUsd + percentUsd });\n }\n\n return lines;\n}\n\nfunction formatFeeTooltip(\n config: DepositConfigResponse,\n amountUsd: number,\n totalFeeUsd: number\n): string {\n const feeLines = calculateFeeLines(config, amountUsd);\n const feeTotalDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n\n if (feeLines.length === 0) {\n return `Total: $${feeTotalDisplay.toFixed(2)}`;\n }\n\n // Calculate totals\n const totalSol = feeLines.reduce((sum, line) => sum + line.solAmount, 0);\n const totalPercent = feeLines.reduce((sum, line) => sum + line.percent, 0);\n\n // Format as a table with column dividers\n // Fixed column widths for alignment (with padding space on each side)\n const COL = { fee: 7, sol: 8, rate: 7, usd: 8 };\n\n const formatLine = (item: FeeLineItem): string => {\n const label = item.label.padEnd(COL.fee);\n const sol = item.solAmount.toFixed(4).padStart(6).padEnd(COL.sol);\n const pct = (item.percent.toFixed(2) + '%').padStart(5).padEnd(COL.rate);\n const usd = ('$' + Math.max(item.usdAmount, 0.01).toFixed(2)).padEnd(COL.usd);\n return `${label} │ ${sol} │ ${pct} │ ${usd}`;\n };\n\n const header = `${'Fee'.padEnd(COL.fee)} │ ${'SOL'.padEnd(COL.sol)} │ ${'+ Rate'.padEnd(COL.rate)} │ ${'= Total'.padEnd(COL.usd)}`;\n const divider = `${'─'.repeat(COL.fee)}─┼─${'─'.repeat(COL.sol)}─┼─${'─'.repeat(COL.rate)}─┼─${'─'.repeat(COL.usd)}`;\n\n const totalUsdStr = ('$' + feeTotalDisplay.toFixed(2)).padEnd(COL.usd);\n const totalLine = `${'TOTAL'.padEnd(COL.fee)} │ ${totalSol.toFixed(4).padStart(6).padEnd(COL.sol)} │ ${(totalPercent.toFixed(2) + '%').padStart(5).padEnd(COL.rate)} │ ${totalUsdStr}`;\n\n const lines = [header, divider, ...feeLines.map(formatLine), divider, totalLine];\n return lines.join('\\n');\n}\n\nfunction formatExplainerFeeSummary(config: DepositConfigResponse): string {\n const feeLabels: string[] = [];\n const hasPrivacyFee = config.privacyFeeFixedLamports > 0 || config.privacyFeePercent > 0;\n const hasSwapFee = config.swapFeeFixedLamports > 0 || config.swapFeePercent > 0;\n const hasCompanyFee = config.companyFeeFixedLamports > 0 || config.companyFeePercent > 0;\n\n if (hasPrivacyFee) feeLabels.push('Privacy Cash fee');\n if (hasSwapFee) feeLabels.push('swap fee');\n if (hasCompanyFee) feeLabels.push('company service fee');\n\n if (feeLabels.length === 0) {\n return 'No processing fees apply to deposits.';\n }\n\n return \"A small fee may apply. We'll show exact totals before you confirm.\";\n}\n\nfunction getTotalFeeUsd(config: DepositConfigResponse, amountUsd: number): number {\n if (amountUsd <= 0) return 0;\n const isMicro = amountUsd < config.publicMinUsd;\n const isPrivate = amountUsd >= config.privateMinUsd;\n const feePercent = getEffectiveFeePercent(config, isPrivate, isMicro);\n let userFixedLamports = config.companyFeeFixedLamports;\n if (!isMicro) {\n if (\n isPrivate &&\n (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_privacy')\n ) {\n userFixedLamports += config.privacyFeeFixedLamports;\n }\n if (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_swap') {\n userFixedLamports += config.swapFeeFixedLamports;\n }\n }\n const fixedFeeUsd = (userFixedLamports / LAMPORTS_PER_SOL) * config.solPriceUsd;\n const percentFeeUsd = amountUsd * (feePercent / 100);\n return fixedFeeUsd + percentFeeUsd;\n}\n\nfunction getPurchaseCurrencyLabel(\n currencyMode: CurrencyMode,\n token: Token,\n tokens: Token[]\n): string {\n if (currencyMode === 'sol') {\n return 'SOL';\n }\n if (currencyMode === 'single-token') {\n return token.symbol;\n }\n const hasUsdc = tokens.some((supported) => supported.symbol === 'USDC');\n return hasUsdc ? 'SOL or USDC' : 'SOL or supported tokens';\n}\n\nfunction normalizeTokenSymbols(symbols: string[]): string[] {\n return symbols.map((symbol) => symbol.trim()).filter(Boolean);\n}\n\nconst USD_STABLE_TOKENS = new Set(['USDC', 'USDT', 'USD1', 'PYUSD', 'USDH', 'CASH']);\n\nfunction getTokenUsdPrice(\n token: Token,\n config: DepositConfigResponse,\n priceOverrides?: Record<string, number>\n): number | null {\n // USD stablecoins are always $1\n if (USD_STABLE_TOKENS.has(token.symbol)) return 1;\n\n // Check server-provided token prices first (includes SOL, BONK, ORE, EURC)\n const serverPrice = config.tokenPrices?.[token.symbol];\n if (serverPrice && serverPrice > 0) return serverPrice;\n\n // Fallback to SOL price for backwards compatibility\n if (token.symbol === 'SOL') return config.solPriceUsd || null;\n\n // Check prop overrides for custom tokens\n const override = priceOverrides?.[token.symbol];\n if (override && override > 0) return override;\n\n return null;\n}\n\nfunction formatTokenAmount(amount: number, symbol: string): string {\n const decimals = USD_STABLE_TOKENS.has(symbol) ? 2 : 4;\n return amount.toFixed(decimals);\n}\n\n/**\n * Multi-step deposit flow component\n */\nexport function DepositFlow({\n config,\n currencyMode,\n depositMethod: depositMethodProp,\n tokens = [],\n defaultToken,\n minAmount,\n maxAmount = 10000,\n onSuccess,\n onError,\n onCancel,\n onUnlockRequired,\n onAuthorize,\n className = '',\n showStepIndicator = true,\n pollInterval = 5000,\n demoMode = false,\n demoAutoConfirmMs,\n tokenPriceUsd,\n showExplainer = false,\n siteName,\n explainerConfig,\n}: DepositFlowProps) {\n const { deposit, getStatus, error: depositError, clearError } = useDeposit();\n const wallet = useWallet();\n const quickActionSymbols = normalizeTokenSymbols(config.quickActionTokens);\n const customTokenSymbols = normalizeTokenSymbols(config.customTokenSymbols);\n // Merge preset tokens with admin-configured custom tokens\n const mergedTokens = useMemo(() => {\n const customDefs = config.customTokens ?? [];\n if (customDefs.length === 0) return tokens;\n\n // Build set of existing symbols for deduplication\n const seen = new Set(tokens.map((t) => t.symbol));\n const merged = [...tokens];\n\n // Add custom tokens that don't conflict with presets\n for (const def of customDefs) {\n if (!seen.has(def.symbol)) {\n merged.push({\n mint: def.mint,\n symbol: def.symbol,\n name: def.symbol, // Use symbol as name for custom tokens\n decimals: def.decimals,\n logoUrl: def.logoUrl,\n });\n seen.add(def.symbol);\n }\n }\n return merged;\n }, [tokens, config.customTokens]);\n\n // Filter merged tokens based on customTokenSymbols setting\n const customListTokens = useMemo(() => {\n if (customTokenSymbols.length === 0) return mergedTokens;\n const filtered = mergedTokens.filter((token) => customTokenSymbols.includes(token.symbol));\n return filtered.length > 0 ? filtered : mergedTokens;\n }, [mergedTokens, customTokenSymbols]);\n\n // Auto-detect deposit method if not specified\n // - Sign mode requires private deposits enabled (server-side signing via SSS)\n // - If private deposits disabled (recovery mode enabled), force receive mode\n // - If user has external wallet (browser extension) → sign mode (if allowed)\n // - If user has embedded wallet only → receive mode\n const canUseSignMode = config.privateDepositsEnabled;\n const depositMethod: DepositMethod = depositMethodProp\n ? depositMethodProp === 'sign' && !canUseSignMode\n ? 'receive'\n : depositMethodProp\n : canUseSignMode && wallet.hasExternalWallet\n ? 'sign'\n : 'receive';\n\n // Determine effective token based on mode\n // Priority: defaultToken > first quick action token > USDC > first non-SOL > first token > SOL\n const firstQuickActionToken = quickActionSymbols[0]\n ? mergedTokens.find((t) => t.symbol === quickActionSymbols[0])\n : undefined;\n const effectiveToken =\n currencyMode === 'sol'\n ? SOL_TOKEN\n : currencyMode === 'single-token'\n ? (firstQuickActionToken ??\n mergedTokens.find((t) => t.symbol === 'USDC') ??\n mergedTokens[0] ??\n SOL_TOKEN)\n : (defaultToken ??\n firstQuickActionToken ??\n mergedTokens.find((candidate) => candidate.symbol === 'USDC') ??\n mergedTokens.find((candidate) => candidate.symbol !== 'SOL') ??\n mergedTokens[0] ??\n SOL_TOKEN);\n\n // Determine the first step based on configuration\n const getFirstStep = useCallback((): DepositFlowStep => {\n if (showExplainer) return 'explainer';\n return 'unlock';\n }, [showExplainer]);\n\n // State\n const [step, setStep] = useState<DepositFlowStep>(getFirstStep);\n const [selectedToken, setSelectedToken] = useState<Token>(effectiveToken);\n const [amount, setAmount] = useState<string>('');\n const [result, setResult] = useState<DepositFlowResult | null>(null);\n const [flowError, setFlowError] = useState<string | null>(null);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [depositAddress, setDepositAddress] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [isAuthorizing, setIsAuthorizing] = useState(false);\n const [receiveAmountUsd, setReceiveAmountUsd] = useState<number | null>(null);\n\n // Reset flow when currencyMode or depositMethod changes\n useEffect(() => {\n setStep(getFirstStep());\n setSelectedToken(effectiveToken);\n setAmount('');\n setResult(null);\n setFlowError(null);\n setSessionId(null);\n setDepositAddress(null);\n setCopied(false);\n setIsAuthorizing(false);\n setReceiveAmountUsd(null);\n clearError();\n }, [currencyMode, depositMethod, effectiveToken, clearError, getFirstStep]);\n\n const effectiveMin = minAmount ?? config.privateMinSol;\n const effectiveMax = maxAmount;\n\n // Parse amount (used by handleDeposit for sign mode)\n const parsedAmount = parseFloat(amount);\n\n // Wallet status\n const isEnrolled =\n wallet.status === 'enrolled_locked' ||\n wallet.status === 'enrolled_unlocked' ||\n wallet.status === 'unlocked';\n const walletReady = isEnrolled && wallet.isUnlocked;\n const needsUnlock = isEnrolled && !wallet.isUnlocked;\n\n // Get steps based on mode and deposit method\n const getSteps = useCallback((): { key: DepositFlowStep; label: string }[] => {\n // Sign mode: authorize → select token + enter amount & sign → complete\n const signSteps = [\n { key: 'unlock' as const, label: 'Authorize' },\n { key: 'confirm' as const, label: 'Send' },\n { key: 'signing' as const, label: 'Signing' },\n { key: 'success' as const, label: 'Complete' },\n ];\n\n // Receive mode: authorize → select token + show address → auto-detect deposit → complete\n const receiveSteps = [\n { key: 'unlock' as const, label: 'Authorize' },\n { key: 'show-address' as const, label: 'Send' },\n { key: 'waiting' as const, label: 'Confirming' },\n { key: 'success' as const, label: 'Complete' },\n ];\n\n let steps: { key: DepositFlowStep; label: string }[] =\n depositMethod === 'sign' ? signSteps : receiveSteps;\n\n if (showExplainer) {\n steps = [{ key: 'explainer', label: 'Info' }, ...steps];\n }\n\n return steps;\n }, [depositMethod, showExplainer]);\n\n const steps = getSteps();\n const currentStepIndex = steps.findIndex((s) => s.key === step);\n\n // Handle token selection\n const handleTokenSelect = useCallback((token: Token) => {\n setSelectedToken(token);\n }, []);\n\n // Handle authorization (password submission to decrypt Share B on server)\n const handleAuthorize = useCallback(\n async (password: string) => {\n if (!onAuthorize) {\n // If no onAuthorize callback, skip to next step\n setStep(depositMethod === 'sign' ? 'confirm' : 'show-address');\n return;\n }\n\n setIsAuthorizing(true);\n setFlowError(null);\n\n try {\n // For receive mode, amount is null (auto-detected when deposit arrives)\n const authorizeAmount = depositMethod === 'sign' ? parsedAmount : null;\n const result = await onAuthorize(password, authorizeAmount, selectedToken);\n setSessionId(result.sessionId);\n setDepositAddress(result.depositAddress);\n setStep(depositMethod === 'sign' ? 'confirm' : 'show-address');\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Authorization failed');\n setFlowError(error.message);\n } finally {\n setIsAuthorizing(false);\n }\n },\n [onAuthorize, depositMethod, parsedAmount, selectedToken]\n );\n\n // Handle deposit submission (sign mode)\n const handleDeposit = useCallback(\n async (depositAmount?: number, depositToken?: Token) => {\n clearError();\n setFlowError(null);\n setStep('signing');\n\n const finalAmount = depositAmount ?? parsedAmount;\n const finalToken = depositToken ?? selectedToken;\n\n // Skip wallet checks in demo mode\n if (!demoMode) {\n if (needsUnlock && onUnlockRequired) {\n onUnlockRequired();\n setStep('confirm');\n return;\n }\n\n if (!walletReady) {\n setFlowError('Wallet not ready');\n setStep('error');\n return;\n }\n }\n\n try {\n // Convert amount to smallest unit\n const smallestUnit = Math.floor(finalAmount * Math.pow(10, finalToken.decimals));\n\n // Demo mode: simulate signing delay and success\n if (demoMode) {\n await new Promise((resolve) => setTimeout(resolve, 1500));\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : finalToken,\n amount: finalAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: `demo-tx-${Date.now()}`,\n sessionId: sessionId || `demo-session-${Date.now()}`,\n response: {\n sessionId: sessionId || `demo-session-${Date.now()}`,\n txSignature: `demo-tx-${Date.now()}`,\n amountLamports: smallestUnit,\n message: 'Demo deposit successful',\n withdrawalAvailableAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n },\n method: 'sign',\n };\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n return;\n }\n\n // For now, deposit API only supports SOL (lamports)\n // Token deposits would need Jupiter swap integration\n const response = await deposit(smallestUnit);\n\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : finalToken,\n amount: finalAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: response.txSignature,\n sessionId: response.sessionId,\n response,\n method: 'sign',\n };\n\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Deposit failed');\n setFlowError(error.message);\n setStep('error');\n onError?.(error);\n }\n },\n [\n deposit,\n parsedAmount,\n selectedToken,\n currencyMode,\n demoMode,\n sessionId,\n walletReady,\n needsUnlock,\n onUnlockRequired,\n onSuccess,\n onError,\n clearError,\n ]\n );\n\n // Handle \"I've sent it\" button - start polling\n const handleSentDeposit = useCallback(() => {\n setStep('waiting');\n }, []);\n\n // Copy address to clipboard\n const handleCopyAddress = useCallback(async () => {\n const address = depositAddress || wallet.solanaPubkey;\n if (address) {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea');\n textArea.value = address;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }\n }, [depositAddress, wallet.solanaPubkey]);\n\n // Poll for deposit status as soon as we show the address (don't wait for \"I've sent it\")\n // This enables auto-detection: if user sends deposit, we detect it and skip to success\n useEffect(() => {\n // Start polling when showing deposit address (confirm step in sign mode, show-address/waiting in receive mode)\n // Skip in demo mode - user must click \"I've sent it\" to proceed\n const isListeningStep = step === 'confirm' || step === 'show-address' || step === 'waiting';\n if (!isListeningStep || !sessionId || demoMode) return;\n\n let cancelled = false;\n let pollCount = 0;\n const maxPolls = 360; // 30 minutes at 5s interval (user may take time to send from exchange)\n\n const poll = async () => {\n if (cancelled || pollCount >= maxPolls) return;\n pollCount++;\n\n try {\n // Check for deposit status from server\n // Server auto-detects incoming deposits and returns the amount\n const status = await getStatus(sessionId);\n\n if (status.status === 'completed' || status.status === 'detected') {\n // Get the actual deposited amount from the server response\n const detectedAmount = status.amountLamports\n ? status.amountLamports / Math.pow(10, selectedToken.decimals)\n : 0;\n const smallestUnit = status.amountLamports || 0;\n\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : selectedToken,\n amount: detectedAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: status.txSignature || '',\n sessionId: sessionId,\n response: status as unknown as DepositResponse,\n method: 'receive',\n depositAddress: wallet.solanaPubkey ?? undefined,\n };\n\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n return;\n }\n } catch {\n // Continue polling on error\n }\n\n if (!cancelled) {\n setTimeout(poll, pollInterval);\n }\n };\n\n poll();\n\n return () => {\n cancelled = true;\n };\n }, [\n step,\n sessionId,\n demoMode,\n getStatus,\n selectedToken,\n currencyMode,\n wallet.solanaPubkey,\n onSuccess,\n pollInterval,\n ]);\n\n useEffect(() => {\n if (!demoMode || !demoAutoConfirmMs || step !== 'waiting' || depositMethod !== 'receive')\n return;\n if (!depositAddress) return;\n\n const timeout = window.setTimeout(() => {\n const amountUsd = receiveAmountUsd ?? config.privateMinUsd;\n const tokenAmount =\n selectedToken.symbol === 'SOL' && config.solPriceUsd > 0\n ? amountUsd / config.solPriceUsd\n : amountUsd;\n const smallestUnit = Math.floor(tokenAmount * Math.pow(10, selectedToken.decimals));\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : selectedToken,\n amount: tokenAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: `demo-tx-${Date.now()}`,\n sessionId: sessionId || `demo-session-${Date.now()}`,\n response: {\n sessionId: sessionId || `demo-session-${Date.now()}`,\n txSignature: `demo-tx-${Date.now()}`,\n amountLamports: smallestUnit,\n message: 'Demo deposit detected',\n withdrawalAvailableAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n },\n method: 'receive',\n depositAddress: depositAddress ?? undefined,\n };\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n }, demoAutoConfirmMs);\n\n return () => window.clearTimeout(timeout);\n }, [\n demoMode,\n demoAutoConfirmMs,\n step,\n depositMethod,\n depositAddress,\n receiveAmountUsd,\n config,\n selectedToken,\n currencyMode,\n sessionId,\n onSuccess,\n ]);\n\n // Reset flow\n const handleReset = useCallback(() => {\n setStep(getFirstStep());\n setAmount('');\n setResult(null);\n setFlowError(null);\n clearError();\n }, [getFirstStep, clearError]);\n\n // Deposits disabled\n if (!config.enabled) {\n return (\n <div className={`cedros-deposit-flow cedros-deposit-flow-disabled ${className}`}>\n <p>Deposits are not currently available.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-deposit-flow ${className}`}>\n {/* Step Indicator */}\n {showStepIndicator && step !== 'error' && (\n <div className=\"cedros-deposit-flow-steps\">\n {steps.map((s, idx) => {\n const isActive = currentStepIndex >= idx;\n const isCurrent = s.key === step;\n return (\n <div\n key={s.key}\n className={`cedros-deposit-flow-step-item ${isActive ? 'step-active' : ''}`}\n >\n <div\n className={`cedros-deposit-flow-step-circle ${isActive ? 'active' : ''} ${isCurrent ? 'current' : ''}`}\n >\n {idx + 1}\n </div>\n <span className={`cedros-deposit-flow-step-label ${isActive ? 'active' : ''}`}>\n {s.label}\n </span>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Step Content */}\n <div className=\"cedros-deposit-flow-content\">\n {step === 'explainer' && (\n <ExplainerStep\n siteName={siteName}\n config={explainerConfig}\n depositConfig={config}\n currencyMode={currencyMode}\n token={selectedToken}\n tokens={customListTokens}\n onContinue={() => setStep('unlock')}\n onCancel={onCancel}\n />\n )}\n\n {step === 'unlock' && (\n <UnlockStep\n token={selectedToken}\n tokens={customListTokens}\n currencyMode={currencyMode}\n depositMethod={depositMethod}\n isAuthorizing={isAuthorizing}\n error={flowError}\n onAuthorize={handleAuthorize}\n onBack={showExplainer ? () => setStep('explainer') : undefined}\n onCancel={onCancel}\n />\n )}\n\n {/* Sign mode steps */}\n {step === 'confirm' && depositMethod === 'sign' && (\n <ConfirmStep\n token={selectedToken}\n tokens={mergedTokens}\n quickActionSymbols={quickActionSymbols}\n customTokenSymbols={customTokenSymbols}\n currencyMode={currencyMode}\n minAmount={effectiveMin}\n maxAmount={effectiveMax}\n depositAddress={depositAddress || wallet.solanaPubkey}\n walletReady={walletReady || demoMode}\n needsUnlock={needsUnlock && !demoMode}\n copied={copied}\n isListening={!!sessionId && !demoMode}\n config={config}\n onCopy={handleCopyAddress}\n onTokenSelect={handleTokenSelect}\n onUnlockRequired={onUnlockRequired}\n onConfirm={(amt, tkn) => handleDeposit(amt, tkn)}\n onBack={() => setStep('unlock')}\n onCancel={onCancel}\n />\n )}\n\n {step === 'signing' && <SigningStep depositAddress={wallet.solanaPubkey} />}\n\n {/* Receive mode steps */}\n {step === 'show-address' && (\n <ShowAddressStep\n token={selectedToken}\n tokens={mergedTokens}\n quickActionSymbols={quickActionSymbols}\n customTokenSymbols={customTokenSymbols}\n tokenPriceUsd={tokenPriceUsd}\n currencyMode={currencyMode}\n depositAddress={depositAddress || wallet.solanaPubkey}\n copied={copied}\n isListening={!!sessionId && !demoMode}\n config={config}\n onCopy={handleCopyAddress}\n onTokenSelect={handleTokenSelect}\n onAmountChange={setReceiveAmountUsd}\n onSent={handleSentDeposit}\n onBack={() => setStep('unlock')}\n onCancel={onCancel}\n />\n )}\n\n {step === 'waiting' && (\n <WaitingStep\n token={selectedToken}\n depositAddress={depositAddress || wallet.solanaPubkey}\n copied={copied}\n feeLine={\n receiveAmountUsd\n ? `Fees: $${Math.max(getTotalFeeUsd(config, receiveAmountUsd), 0.01).toFixed(2)} total`\n : 'Fees: calculated after deposit'\n }\n onCopy={handleCopyAddress}\n />\n )}\n\n {step === 'success' && result && (\n <SuccessStep result={result} config={config} onNewDeposit={handleReset} />\n )}\n\n {step === 'error' && (\n <ErrorStep\n error={flowError || depositError || 'An error occurred'}\n onRetry={() => setStep('confirm')}\n onCancel={onCancel}\n />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// STEP COMPONENTS\n// =============================================================================\n\ninterface ExplainerStepProps {\n siteName?: string;\n config?: ExplainerConfig;\n depositConfig: DepositConfigResponse;\n currencyMode: CurrencyMode;\n token: Token;\n tokens: Token[];\n onContinue: () => void;\n onCancel?: () => void;\n}\n\nfunction ExplainerStep({\n siteName,\n config,\n depositConfig,\n currencyMode,\n token,\n tokens,\n onContinue,\n onCancel,\n}: ExplainerStepProps) {\n const title = config?.title ?? 'How Deposits Work';\n const exchangeName = config?.exchangeName ?? 'Coinbase';\n const exchangeUrl = sanitizeExternalUrl(config?.exchangeUrl) ?? 'https://www.coinbase.com';\n const showExchange = config?.showExchangeSuggestion !== false;\n const purchaseCurrencyLabel = getPurchaseCurrencyLabel(currencyMode, token, tokens);\n\n const defaultBody = siteName\n ? `${siteName} uses the Solana blockchain to process secure, private payments.`\n : 'This site uses the Solana blockchain to process secure, private payments.';\n\n const body = config?.body ?? defaultBody;\n\n // Calculate fee info for display\n const showUserFee = hasUserFee(depositConfig);\n const feeDescription = formatExplainerFeeSummary(depositConfig);\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">{title}</h4>\n <p className=\"cedros-deposit-flow-step-desc\">{body}</p>\n\n <div className=\"cedros-deposit-flow-explainer-content\">\n <div className=\"cedros-deposit-flow-explainer-item\">\n <span className=\"cedros-deposit-flow-explainer-icon cedros-deposit-flow-icon-shield\" />\n <div>\n <strong>Private & Secure</strong>\n <p>Your deposits are protected by cryptographic privacy technology.</p>\n </div>\n </div>\n <div className=\"cedros-deposit-flow-explainer-item\">\n <span className=\"cedros-deposit-flow-explainer-icon cedros-deposit-flow-icon-bolt\" />\n <div>\n <strong>Fast Transactions</strong>\n <p>Solana transactions confirm in seconds, not minutes.</p>\n </div>\n </div>\n <div className=\"cedros-deposit-flow-explainer-item\">\n <span className=\"cedros-deposit-flow-explainer-icon cedros-deposit-flow-icon-coin\" />\n <div>\n <strong>{showUserFee ? 'Transparent Fees' : 'Low Fees'}</strong>\n <p>{feeDescription}</p>\n </div>\n </div>\n </div>\n\n {showExchange && (\n <div className=\"cedros-deposit-flow-explainer-exchange\">\n <p className=\"cedros-deposit-flow-explainer-exchange-text\">\n <strong>New to Solana?</strong> You can purchase {purchaseCurrencyLabel} using your\n credit card at{' '}\n <a href={exchangeUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {exchangeName}\n </a>\n , then send it here to fund your account.\n </p>\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onContinue}\n >\n Continue\n </button>\n </div>\n </div>\n );\n}\n\ninterface UnlockStepProps {\n token: Token;\n tokens: Token[];\n currencyMode: CurrencyMode;\n depositMethod: DepositMethod;\n isAuthorizing: boolean;\n error: string | null;\n onAuthorize: (password: string) => void;\n onBack?: () => void;\n onCancel?: () => void;\n}\n\nfunction UnlockStep({\n token,\n tokens,\n currencyMode,\n depositMethod,\n isAuthorizing,\n error,\n onAuthorize,\n onBack,\n}: UnlockStepProps) {\n const [password, setPassword] = useState('');\n const purchaseCurrencyLabel = getPurchaseCurrencyLabel(currencyMode, token, tokens);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (password.trim()) {\n onAuthorize(password);\n }\n };\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">Authorize Deposit</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n {depositMethod === 'sign'\n ? currencyMode === 'multi-token'\n ? 'Enter your password to authorize a deposit. This allows us to process your withdrawal when the privacy period ends.'\n : `Enter your password to authorize a ${purchaseCurrencyLabel} deposit. This allows us to process your withdrawal when the privacy period ends.`\n : currencyMode === 'multi-token'\n ? 'Enter your password to get your deposit address. Any supported token sent to this address will be credited to your account.'\n : `Enter your password to get your deposit address. Any ${purchaseCurrencyLabel} sent to this address will be credited to your account.`}\n </p>\n\n <form onSubmit={handleSubmit}>\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\" htmlFor=\"deposit-password\">\n Password\n </label>\n <input\n id=\"deposit-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"cedros-deposit-flow-input\"\n placeholder=\"Enter your password\"\n disabled={isAuthorizing}\n autoComplete=\"current-password\"\n />\n </div>\n\n {error && <p className=\"cedros-deposit-flow-error\">{error}</p>}\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onBack}\n disabled={isAuthorizing}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n disabled={!password.trim() || isAuthorizing}\n >\n {isAuthorizing ? 'Authorizing...' : 'Continue'}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\ninterface ConfirmStepProps {\n token: Token;\n tokens: Token[];\n quickActionSymbols: string[];\n customTokenSymbols: string[];\n currencyMode: CurrencyMode;\n minAmount: number;\n maxAmount: number;\n depositAddress: string | null;\n walletReady: boolean;\n needsUnlock: boolean;\n copied: boolean;\n isListening: boolean;\n config: DepositConfigResponse;\n onCopy: () => void;\n onTokenSelect: (token: Token) => void;\n onUnlockRequired?: () => void;\n onConfirm: (amount: number, token: Token) => void;\n onBack: () => void;\n onCancel?: () => void;\n}\n\nfunction ConfirmStep({\n token,\n tokens,\n quickActionSymbols,\n customTokenSymbols,\n currencyMode,\n minAmount,\n maxAmount,\n depositAddress,\n walletReady,\n needsUnlock,\n copied,\n isListening,\n config,\n onCopy,\n onTokenSelect,\n onUnlockRequired,\n onConfirm,\n onBack,\n}: ConfirmStepProps) {\n const [amountUsd, setAmountUsd] = useState(config.privateMinUsd);\n const [showCustomToken, setShowCustomToken] = useState(false);\n const [feeTooltipOpen, setFeeTooltipOpen] = useState(false);\n const [customOpenSignal, setCustomOpenSignal] = useState(0);\n // Track the token selected before auto-switching to SOL for micro tier\n const [preMicroToken, setPreMicroToken] = useState<Token | null>(null);\n const tier = getTierForAmount(amountUsd, config);\n const isMicroTier = tier === 'sol_micro';\n const isOtherToken = token.symbol === OTHER_TOKEN.symbol;\n const customTokens = useMemo(() => {\n const baseTokens =\n customTokenSymbols.length === 0\n ? tokens\n : tokens.filter((candidate) => customTokenSymbols.includes(candidate.symbol));\n const resolved = baseTokens.length > 0 ? baseTokens : tokens;\n const hasOther = resolved.some((candidate) => candidate.symbol === OTHER_TOKEN.symbol);\n return hasOther ? resolved : [...resolved, OTHER_TOKEN];\n }, [tokens, customTokenSymbols]);\n const totalFeeUsd = getTotalFeeUsd(config, amountUsd);\n const feeTotalDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n const feeLine = isOtherToken\n ? 'Fees: calculated after deposit'\n : `Fees: $${feeTotalDisplay.toFixed(2)} total`;\n const feeTooltip = isOtherToken ? '' : formatFeeTooltip(config, amountUsd, totalFeeUsd);\n\n const tokenUsdPrice = getTokenUsdPrice(isMicroTier ? SOL_TOKEN : token, config);\n const tokenAmount = tokenUsdPrice\n ? amountUsd / tokenUsdPrice\n : token.symbol === 'SOL' && config.solPriceUsd > 0\n ? amountUsd / config.solPriceUsd\n : amountUsd;\n const sendAmountLabel = tokenAmount\n ? formatTokenAmount(tokenAmount, isMicroTier ? 'SOL' : token.symbol)\n : null;\n\n // Check if fees exceed the deposit amount (effective minimum)\n const netAmountUsd = amountUsd - totalFeeUsd;\n const feesExceedAmount = netAmountUsd <= 0 && amountUsd > 0;\n\n const isValidAmount =\n !isOtherToken &&\n amountUsd > 0 &&\n !feesExceedAmount &&\n tokenAmount >= minAmount &&\n tokenAmount <= maxAmount;\n\n // Auto-select SOL for micro tier, restore previous token when leaving micro tier\n useEffect(() => {\n if (currencyMode !== 'multi-token') return;\n\n if (isMicroTier && token.symbol !== 'SOL') {\n // Entering micro tier with non-SOL token: save it and switch to SOL\n setPreMicroToken(token);\n const solToken = tokens.find((t) => t.symbol === 'SOL');\n if (solToken) onTokenSelect(solToken);\n } else if (!isMicroTier && preMicroToken && token.symbol === 'SOL') {\n // Leaving micro tier: restore the previously selected token\n onTokenSelect(preMicroToken);\n setPreMicroToken(null);\n }\n }, [isMicroTier, token.symbol, currencyMode, tokens, onTokenSelect, preMicroToken, token]);\n\n const handleConfirm = () => {\n if (isValidAmount) {\n onConfirm(tokenAmount, token);\n }\n };\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">Choose Amount</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Set how much you want to deposit. Higher tiers unlock privacy.\n </p>\n\n {/* Token Selector - only show for non-micro tiers in multi-token mode */}\n {currencyMode === 'multi-token' && !isMicroTier && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Token</label>\n <div className=\"cedros-deposit-flow-token-quick\">\n {quickActionSymbols.map((symbol) => {\n const quickToken = tokens.find((candidate) => candidate.symbol === symbol);\n const isActive = token.symbol === symbol;\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${isActive ? 'is-active' : ''}`}\n onClick={() => {\n if (quickToken) {\n setShowCustomToken(false);\n onTokenSelect(quickToken);\n }\n }}\n disabled={!quickToken}\n >\n {quickToken?.logoUrl && (\n <img\n className=\"cedros-deposit-flow-token-quick-icon\"\n src={quickToken.logoUrl}\n alt={`${symbol} logo`}\n />\n )}\n {symbol}\n </button>\n );\n })}\n <button\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${showCustomToken ? 'is-active' : ''}`}\n onClick={() => {\n setShowCustomToken(true);\n setCustomOpenSignal((current) => current + 1);\n }}\n >\n Custom\n </button>\n </div>\n {showCustomToken && (\n <div className=\"cedros-deposit-flow-token-custom\">\n <TokenSelector\n tokens={customTokens}\n selectedToken={token}\n onSelect={onTokenSelect}\n openSignal={customOpenSignal}\n />\n </div>\n )}\n </div>\n )}\n\n {/* Amount Selector with Tier Indicator */}\n <div className=\"cedros-deposit-flow-field\">\n <TieredAmountSlider\n config={config}\n valueUsd={amountUsd}\n onChange={setAmountUsd}\n maxUsd={MAX_DEPOSIT_USD}\n />\n </div>\n\n {/* Deposit Address */}\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">\n {isOtherToken\n ? 'Sign to send tokens to this address'\n : `Sign to send ${sendAmountLabel ?? '--'} ${isMicroTier ? 'SOL' : token.symbol} to this address`}\n </label>\n <div className=\"cedros-deposit-flow-address-box\">\n <code className=\"cedros-deposit-flow-address\">{depositAddress || 'Loading...'}</code>\n <div className=\"cedros-deposit-flow-address-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-icon\"\n onClick={onCopy}\n title=\"Copy address\"\n disabled={!depositAddress}\n >\n {copied ? '✓' : '⧉'}\n </button>\n {depositAddress && (\n <a\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-link cedros-deposit-flow-copy-icon\"\n href={`https://orbmarkets.io/account/${depositAddress}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"View on Orb Markets\"\n >\n ↗\n </a>\n )}\n </div>\n </div>\n {copied && <p className=\"cedros-deposit-flow-copied-msg\">Copied!</p>}\n </div>\n\n {/* Warning if fees exceed amount */}\n {feesExceedAmount && (\n <div className=\"cedros-deposit-flow-warning\">\n <p>Deposit amount is less than the fees. Increase the amount to proceed.</p>\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-info-stack\">\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Send only on the Solana network.</span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>\n {feeLine}\n <button\n type=\"button\"\n className={`cedros-deposit-flow-fee-info ${feeTooltipOpen ? 'is-open' : ''}`}\n data-tooltip={feeTooltip}\n aria-label={`Fee breakdown: ${feeTooltip.replaceAll('\\n', ', ')}`}\n aria-expanded={feeTooltipOpen}\n onClick={(event) => {\n event.stopPropagation();\n setFeeTooltipOpen((current) => !current);\n }}\n onBlur={() => setFeeTooltipOpen(false)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setFeeTooltipOpen(false);\n }\n }}\n >\n i\n </button>\n </span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Credits appear after network confirmation.</span>\n </div>\n </div>\n\n {isListening && (\n <div className=\"cedros-deposit-flow-info-banner\">\n Listening for incoming transfers. We will confirm automatically.\n </div>\n )}\n\n {needsUnlock && (\n <div className=\"cedros-deposit-flow-warning\">\n <p>Your wallet is locked. Unlock it to continue.</p>\n {onUnlockRequired && (\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onUnlockRequired}\n >\n Unlock Wallet\n </button>\n )}\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onBack}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={handleConfirm}\n disabled={!isValidAmount || !walletReady || !depositAddress}\n >\n Deposit\n </button>\n </div>\n </div>\n );\n}\n\ninterface SigningStepProps {\n depositAddress: string | null;\n}\n\nfunction SigningStep({ depositAddress }: SigningStepProps) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-spinner\" />\n <h4 className=\"cedros-deposit-flow-step-title\">Signing Transfer</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Approve the transfer in your wallet extension...\n </p>\n {depositAddress && (\n <p className=\"cedros-deposit-flow-signing-dest\">\n Sending to:{' '}\n <code>\n {depositAddress.slice(0, 6)}...{depositAddress.slice(-4)}\n </code>\n </p>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// RECEIVE MODE STEP COMPONENTS\n// =============================================================================\n\ninterface ShowAddressStepProps {\n token: Token;\n tokens: Token[];\n quickActionSymbols: string[];\n customTokenSymbols: string[];\n tokenPriceUsd?: Record<string, number>;\n currencyMode: CurrencyMode;\n depositAddress: string | null;\n copied: boolean;\n isListening: boolean;\n config: DepositConfigResponse;\n onCopy: () => void;\n onTokenSelect: (token: Token) => void;\n onAmountChange: (amountUsd: number) => void;\n onSent: () => void;\n onBack: () => void;\n onCancel?: () => void;\n}\n\nfunction ShowAddressStep({\n token,\n tokens,\n quickActionSymbols,\n customTokenSymbols,\n tokenPriceUsd,\n currencyMode,\n depositAddress,\n copied,\n isListening,\n config,\n onCopy,\n onTokenSelect,\n onAmountChange,\n onSent,\n onBack,\n}: ShowAddressStepProps) {\n const [amountUsd, setAmountUsd] = useState(config.privateMinUsd);\n const [showCustomToken, setShowCustomToken] = useState(false);\n const [feeTooltipOpen, setFeeTooltipOpen] = useState(false);\n const [customOpenSignal, setCustomOpenSignal] = useState(0);\n // Track the token selected before auto-switching to SOL for micro tier\n const [preMicroToken, setPreMicroToken] = useState<Token | null>(null);\n const tier = getTierForAmount(amountUsd, config);\n const isMicroTier = tier === 'sol_micro';\n const isOtherToken = token.symbol === OTHER_TOKEN.symbol;\n const customTokens = useMemo(() => {\n const baseTokens =\n customTokenSymbols.length === 0\n ? tokens\n : tokens.filter((candidate) => customTokenSymbols.includes(candidate.symbol));\n const resolved = baseTokens.length > 0 ? baseTokens : tokens;\n const hasOther = resolved.some((candidate) => candidate.symbol === OTHER_TOKEN.symbol);\n return hasOther ? resolved : [...resolved, OTHER_TOKEN];\n }, [tokens, customTokenSymbols]);\n const totalFeeUsd = getTotalFeeUsd(config, amountUsd);\n const feeTotalDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n const feeLine = isOtherToken\n ? 'Fees: calculated after deposit'\n : `Fees: $${feeTotalDisplay.toFixed(2)} total`;\n const feeTooltip = isOtherToken ? '' : formatFeeTooltip(config, amountUsd, totalFeeUsd);\n const canSubmit = isOtherToken || amountUsd > 0;\n const tokenUsdPrice = getTokenUsdPrice(isMicroTier ? SOL_TOKEN : token, config, tokenPriceUsd);\n const tokenAmount = tokenUsdPrice ? amountUsd / tokenUsdPrice : null;\n const sendAmountLabel = tokenAmount ? formatTokenAmount(tokenAmount, token.symbol) : null;\n\n // Auto-select SOL for micro tier, restore previous token when leaving micro tier\n useEffect(() => {\n if (currencyMode !== 'multi-token') return;\n\n if (isMicroTier && token.symbol !== 'SOL') {\n // Entering micro tier with non-SOL token: save it and switch to SOL\n setPreMicroToken(token);\n const solToken = tokens.find((t) => t.symbol === 'SOL');\n if (solToken) onTokenSelect(solToken);\n } else if (!isMicroTier && preMicroToken && token.symbol === 'SOL') {\n // Leaving micro tier: restore the previously selected token\n onTokenSelect(preMicroToken);\n setPreMicroToken(null);\n }\n }, [isMicroTier, token.symbol, currencyMode, tokens, onTokenSelect, preMicroToken, token]);\n\n useEffect(() => {\n onAmountChange(amountUsd);\n }, [amountUsd, onAmountChange]);\n\n if (!depositAddress) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-error-icon\">!</div>\n <h4 className=\"cedros-deposit-flow-step-title\">Wallet Not Ready</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Your embedded wallet is not set up. Please complete wallet enrollment first.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">Send Deposit</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Send funds to your deposit address. We'll confirm automatically.\n </p>\n\n {/* Token Selector - only show for non-micro tiers in multi-token mode */}\n {currencyMode === 'multi-token' && !isMicroTier && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Token</label>\n <div className=\"cedros-deposit-flow-token-quick\">\n {quickActionSymbols.map((symbol) => {\n const quickToken = tokens.find((candidate) => candidate.symbol === symbol);\n const isActive = token.symbol === symbol;\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${isActive ? 'is-active' : ''}`}\n onClick={() => {\n if (quickToken) {\n setShowCustomToken(false);\n onTokenSelect(quickToken);\n }\n }}\n disabled={!quickToken}\n >\n {quickToken?.logoUrl && (\n <img\n className=\"cedros-deposit-flow-token-quick-icon\"\n src={quickToken.logoUrl}\n alt={`${symbol} logo`}\n />\n )}\n {symbol}\n </button>\n );\n })}\n <button\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${showCustomToken ? 'is-active' : ''}`}\n onClick={() => {\n setShowCustomToken(true);\n setCustomOpenSignal((current) => current + 1);\n }}\n >\n Custom\n </button>\n </div>\n {showCustomToken && (\n <div className=\"cedros-deposit-flow-token-custom\">\n <TokenSelector\n tokens={customTokens}\n selectedToken={token}\n onSelect={onTokenSelect}\n openSignal={customOpenSignal}\n />\n </div>\n )}\n </div>\n )}\n\n {/* Amount Selector with Tier Indicator */}\n {!isOtherToken && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Deposit Amount</label>\n <TieredAmountSlider\n config={config}\n valueUsd={amountUsd}\n onChange={setAmountUsd}\n maxUsd={MAX_DEPOSIT_USD}\n />\n </div>\n )}\n\n {isOtherToken && (\n <div className=\"cedros-deposit-flow-note\">\n Send any token you want. We'll detect the deposit, swap it, and credit your balance\n automatically.\n </div>\n )}\n\n {/* Deposit Address */}\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">\n {isOtherToken\n ? 'Send any token to this address'\n : `Send ${sendAmountLabel ?? '--'} ${isMicroTier ? 'SOL' : token.symbol} to this address`}\n </label>\n <div className=\"cedros-deposit-flow-address-box\">\n <code className=\"cedros-deposit-flow-address\">{depositAddress}</code>\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-copy-btn\"\n onClick={onCopy}\n title=\"Copy address\"\n >\n {copied ? '✓' : '📋'}\n </button>\n </div>\n {copied && <p className=\"cedros-deposit-flow-copied-msg\">Copied!</p>}\n </div>\n\n <div className=\"cedros-deposit-flow-info-stack\">\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Send only on the Solana network.</span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>\n {feeLine}\n {!isOtherToken && (\n <button\n type=\"button\"\n className={`cedros-deposit-flow-fee-info ${feeTooltipOpen ? 'is-open' : ''}`}\n data-tooltip={feeTooltip}\n aria-label={`Fee breakdown: ${feeTooltip.replaceAll('\\n', ', ')}`}\n aria-expanded={feeTooltipOpen}\n onClick={(event) => {\n event.stopPropagation();\n setFeeTooltipOpen((current) => !current);\n }}\n onBlur={() => setFeeTooltipOpen(false)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setFeeTooltipOpen(false);\n }\n }}\n >\n i\n </button>\n )}\n </span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Credits appear after confirmation (typically ~30s).</span>\n </div>\n </div>\n\n {isListening && (\n <div className=\"cedros-deposit-flow-info-banner\">\n Listening for your deposit. We'll notify you when it arrives.\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onBack}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onSent}\n disabled={!canSubmit}\n >\n I've Sent It\n </button>\n </div>\n </div>\n );\n}\n\ninterface WaitingStepProps {\n token: Token;\n depositAddress: string | null;\n copied: boolean;\n feeLine: string;\n onCopy: () => void;\n}\n\nfunction WaitingStep({ token, depositAddress, copied, feeLine, onCopy }: WaitingStepProps) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-spinner\" />\n <h4 className=\"cedros-deposit-flow-step-title\">Waiting for Deposit</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Looking for incoming <strong>{token.symbol}</strong> deposits...\n </p>\n\n <div className=\"cedros-deposit-flow-waiting-info\">\n <p className=\"cedros-deposit-flow-waiting-text\">\n Once your transaction is confirmed on the Solana network, your account will be credited\n automatically. This usually takes 20-30 seconds.\n </p>\n {depositAddress && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Deposit address</label>\n <div className=\"cedros-deposit-flow-address-box\">\n <code className=\"cedros-deposit-flow-address\">\n {depositAddress.slice(0, 6)}...{depositAddress.slice(-6)}\n </code>\n <div className=\"cedros-deposit-flow-address-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-icon\"\n onClick={onCopy}\n title=\"Copy address\"\n >\n {copied ? '✓' : '⧉'}\n </button>\n <a\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-link cedros-deposit-flow-copy-icon\"\n href={`https://orbmarkets.io/account/${depositAddress}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"View on Orb Markets\"\n >\n ↗\n </a>\n </div>\n </div>\n </div>\n )}\n <div className=\"cedros-deposit-flow-info-stack\">\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Send only on the Solana network.</span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>{feeLine}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ninterface SuccessStepProps {\n result: DepositFlowResult;\n config: DepositConfigResponse;\n onNewDeposit: () => void;\n}\n\nfunction SuccessStep({ result, config, onNewDeposit }: SuccessStepProps) {\n const token = result.token ?? SOL_TOKEN;\n const amountUsd =\n token.symbol === 'SOL' && config.solPriceUsd > 0\n ? result.amount * config.solPriceUsd\n : result.amount;\n const totalFeeUsd = getTotalFeeUsd(config, amountUsd);\n const creditsUsd = Math.max(amountUsd - totalFeeUsd, 0);\n const totalFeeDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-success-icon\">✓</div>\n <h4 className=\"cedros-deposit-flow-step-title\">Deposit Successful!</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Your deposit of {result.amount.toLocaleString()} {token.symbol} has been received.\n </p>\n\n <div className=\"cedros-deposit-flow-summary\">\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Transaction</span>\n <span className=\"cedros-deposit-flow-summary-value cedros-deposit-flow-tx\">\n <a\n href={`https://orbmarkets.io/tx/${result.txSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {result.txSignature.slice(0, 8)}...{result.txSignature.slice(-8)}\n </a>\n <a\n className=\"cedros-deposit-flow-tx-action\"\n href={`https://orbmarkets.io/tx/${result.txSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"View transaction on Orb Markets\"\n title=\"View transaction\"\n >\n ↗\n </a>\n </span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Deposit Amount</span>\n <span className=\"cedros-deposit-flow-summary-value\">${amountUsd.toFixed(2)}</span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Total Fees</span>\n <span className=\"cedros-deposit-flow-summary-value cedros-deposit-flow-fee\">\n -${totalFeeDisplay.toFixed(2)}\n </span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Credits Added</span>\n <span className=\"cedros-deposit-flow-summary-value cedros-deposit-flow-credit\">\n +${creditsUsd.toFixed(2)}\n </span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Available</span>\n <span className=\"cedros-deposit-flow-summary-value\">Immediately</span>\n </div>\n </div>\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onNewDeposit}\n >\n Make Another Deposit\n </button>\n </div>\n </div>\n );\n}\n\ninterface ErrorStepProps {\n error: string;\n onRetry: () => void;\n onCancel?: () => void;\n}\n\nfunction ErrorStep({ error, onRetry, onCancel }: ErrorStepProps) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-error-icon\">✕</div>\n <h4 className=\"cedros-deposit-flow-step-title\">Deposit Failed</h4>\n <p className=\"cedros-deposit-flow-error-message\">{error}</p>\n\n <div className=\"cedros-deposit-flow-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onRetry}\n >\n Try Again\n </button>\n </div>\n </div>\n );\n}\n","export default \"data:image/webp;base64,UklGRmIEAABXRUJQVlA4WAoAAAAIAAAAOwAAOwAAVlA4IIIDAADwDwCdASo8ADwAPm0qkUWkIqGWDVeYQAbEtgBOmZMBu+H816ov3b8R8R2g2FXtxdyh5s3+A60v0APLi9ktgGB/LZjWNAXqgpE6jfW0NF+P4xEhH2L7M+26iGwrTjjcQegyCZqxs+ifvZANjWd279diqZNKUrgOTVtjJGtW4IVtRhMECd5aWVgAAP7nDv3UY/8f1l//xTP/FM/8NU8c9g//sC3+bX/1HZXsNsM57VKG2LVf1a0KdncWO8uPo/Oh79m9ZqjJZwXfPXuvwkK+WDOl6+N8C2Ux6no/V/zkoucKK/JZek7MR5sS8TknXB+6BuVDXou9Rx4aUea2q2IzvLvFIujjKsVYLMab7j9zo48fhgm9YOtjmWuS0WZ4c+6ta0mr3xF4fcdAIFf6oXRSlqovOX0HUiMV//hXwSX1cfP5cLj8c7OTyT/4ce4olJARV95GoY8oF+2uU0blGul3ItlG7c2Hl2/uC6s2WZc7Zukwojx6ed8t97bZ68N1uzCLzPlG7BuYS17F19e0wXnc6vEl3q7ft0K7OEl7r8mY6Kh+Nt/5V/Lp68mFBjLem1JjvC371+lKwez4KCdXwNo2Z04FqyzGpFutY6YQ/r5Tfu7Oi+oNfN0R/W+D4aj1nqHhlqYJzpx2NK4mj0gJIXmX8EArelSQI8mV4Ux9MRPwC2PuZhLTjQZv+Vl4p0D8bSB+Z0rek3hS6G1r80fW3cn767Pz/bXanjVmm34wt1nQPqdJObrZ7vv2NWcEuQKj9d+V6DzeDrq0CtGNcanEB5MY9agi1E6BprEScTdfPXjBeMnPbpD+QO6P7IW4UZ9etCCHtX++S/fl5Iz5RzUr10ojRMw//35C0yTjSEhbe884dPwor64n//KByjUFEGsCPAAXPJp1+O+SiKfUaODq6ncjKayTHXjoXgM7XP1z4sBhIKJZJRiM7vGC/+v/Sk8/jbgZLZDAVz1vLou93y7Yd8hxcWM/BesxgWgeKvl8fjE/Ud8tQKp4425hWh66lzzwxa4J3ctA4/E50wX/eoBOgq0B7+7S6FK4wvPHSNgfh+vwSWIJsJLt/3yjBeb41RRyMDMZqFQTZPEdFpXp48ExEyDayZ6objbjTHoS5WQDnDQpRyqMNKfvd41nhEPdb/hxpzXeTIjWmfHHCT+CQYWXDqLehCh1cRyeYOBwsSlSw5PiquAbsgAARVhJRroAAABFeGlmAABJSSoACAAAAAYAEgEDAAEAAAABAAAAGgEFAAEAAABWAAAAGwEFAAEAAABeAAAAKAEDAAEAAAACAAAAEwIDAAEAAAABAAAAaYcEAAEAAABmAAAAAAAAAEgAAAABAAAASAAAAAEAAAAGAACQBwAEAAAAMDIxMAGRBwAEAAAAAQIDAACgBwAEAAAAMDEwMAGgAwABAAAA//8AAAKgBAABAAAAPAAAAAOgBAABAAAAPAAAAAAAAAA=\"","export default \"data:image/webp;base64,UklGRtgCAABXRUJQVlA4WAoAAAAIAAAAOwAAOwAAVlA4IPgBAABQCwCdASo8ADwAPm0wk0ekIqGhKBQMqIANiWkADPF3uV2D8VcQGk1mg+P36i9SLnZvYAQxszEWYzEwX1RVkqG/4BGbJgMSHqhKDFsjWsGfPPrvfef11goNmCDDlBJHVVD+8gAA/vu4q03kl+E7FpjtZ2gc8pQ619Hjv9NywoRZ6az43C1wcrRr/lWzJlJhLWMHN0MkVl1ueAf6Hn8StVzeUfMBXOKkgfe2msx7QWR5PnHW/5c6/35yrtWnrURc2q6UYlGin+v8C2dQqexkW6rX2EEijTI9eEQ46PWH3/59fM2AlMvvR2abaRk5XX7V1triQncRxvMfz5YmYDN+PY/ikcZUNaiFucKoUq5riv0eKCezuFNHecE11ojwJqWRSTWpalkz5autXp6vFS+FT1tWUsB/fs1CCOZxaA1vR1grOEaiuKe1RYm7e05psWtqbXLVmm1bA8Ly9PFkVdCbc6hR3UuBBsFGnVeGOUeMn2onnfvYhBMcM9YPxGdQkwZLXOk1VuQSTk01Shf3fZrFyRlFauftFdPYhKXwqrr+meav1P+KLKBVosqmHnFFfgExsQ/rOf3TSd+mOqQfJA+cF+HojNU7nmM3uDkoCBi+//Gqp+gPNNW8M4LFrol8rxE+7WsjqMgfwv1f+Nr25RtG1Wa/KkniRCAAAABFWElGugAAAEV4aWYAAElJKgAIAAAABgASAQMAAQAAAAEAAAAaAQUAAQAAAFYAAAAbAQUAAQAAAF4AAAAoAQMAAQAAAAIAAAATAgMAAQAAAAEAAABphwQAAQAAAGYAAAAAAAAASAAAAAEAAABIAAAAAQAAAAYAAJAHAAQAAAAwMjEwAZEHAAQAAAABAgMAAKAHAAQAAAAwMTAwAaADAAEAAAD//wAAAqAEAAEAAAA8AAAAA6AEAAEAAAA8AAAAAAAAAA==\"","export default \"data:image/webp;base64,UklGRhYJAABXRUJQVlA4WAoAAAAYAAAAOwAAOwAAQUxQSGICAAABkJz9nzon3/nNJGnBXRvBI0sDkR7slpRBaMDl5LByx7cEyBWHtWd+8/uiK/95uEfEBKBnFwRwk6Wjm89PW2Tj9OWNo7VxASQ4DDoIML9fbdLYpbFR21tykDAY8ZCLT9okqZrsD0uqJNl5sj6CIAPwDmdqRlNlz6o0vroE5/vlPObv0kyN/dVE3pmHd31xgt0P1MgBauTHLYjrg2DoClM0DtRi4kmA6ylgrMq2cuDaZm0CoQePyTqVhVTWJ+G7EozXqSyosj4K6cIhVBhZ2MjyMNy/BFcZWeDIE8g/PLaoLLRyF/4vgrlPTMVK/DQH+cPjGpUFV17/i6BEZeGVF+Dh4F/kUYGDR4nKDBPX4AX381Deh2C1Q8vB2F4CDqnMUrkPlPMpY+obLQ/j9+k1GjNNLB0z5hJ5fD0f5Y2XTLkkPn9Hy8X4vsGMW/xvt3JqvKflYnz3nCmXxJc3qLlEXj9mzOe4xJSLcW36Oy0P47cplKl5KMvAfj6HwFKbloOxswrBfWoOyvsQjzWmPErwcKhQi6d84eHgcSGPEgSA4Dq1aMpr8PjL3CemYiV+moP8AY9darGUW/D4u+CEsUiRVyH4p8NwmbE4kZUA9y8IRuvUoijr4xB06zFZpxZDWZ+ER/cBEzW2dXDaZnUMAb06hBOmaIOxmHhlCILenWDrI6MOIio/7kIc+uk85u+SSftkasZ78/AOffYOl17RqNqbqtFqZ+A8+i8BI+tPOiRNNdkfllSNZPvJRYEXDDQI3NJerUFjl8ZmbX8ekIBBuyCAjK8d3Xh52iBbp89vHl2ecIAEh54BVlA4IMwFAADQGwCdASo8ADwAPm0qkkYkIiGhLhtqqIANiWwAqSdaNo+beZFT37f+J9yXOd2J6HfQh5gH6edIDzAfst6vXoO9AD/Lf4DrAP2V9gDzY/+57F39p/3/7k+0RmjvYp/meic9ieyvJnZVfquF/a23ZOCHGT/sfDDjQ89zOL9Gewd+s3Vh/b32Gf28Ejb5ttLg9hoDiFb2tMW81eZU9Z1LHfdRSCsRMzHz0WT4BNgUakGf9oJtrGtVJFxHJfxAatIxnW1qjDi9i3DQtJp9pVNKlMoJEWdPKv3KaaFSlhd/aMGiir9CPcex5QAA+fpjxA6zfUamE3wS2zWwLVrt/fXA5+Wvx9j5SID0zuEHU2LisPUxvtRuIUwNrsUis8zy+IMpzft+ZSg+9gdx9e6+ZvPmtj4OByz5qo26J3rXhPy8LBXSpuPb+f+mP4CoTvYDhzQXh/SIGj8Ez1+W5MJ/Tkdw09wPCs3JuR3yoqO63FH/j81xW5Abr7tCdwfXwv3CXDtOcHwUqPCd1aiU2uT6XwgdnYqYygEXGKFx8nmaUvqSn9p8HmIA9dVTOoEnqYFjrNfWY034N2vjohd16cxnkP4PYvHkIOWa/FEUug7/qbJ/GFLPxNh6y9eQ//MzzXbcPwsT2chWXPBXNVF1S9dxv5NUuEueiw2kdebblQuvUSRLN+zx3VyT2lOzWBUqrzsTmeOlxjVcTA83H99r35O4X7WXNq7HExiWXxrdM/Ih4CvPJaEHPxUE/i6WIz6+VGq4RB3sBKl3P4M7/DLWAwCnwcpX228XezqQ4cS2tttWxLTc9cPd1ofek9qF9lpB8RvakdPnj2PruFA9W3iKbNdmgnb+mIpohHuUR73KdDDOHbyfAiOjPzzqomnIU3jcSt7LKOB/Op97sCk0yd18mVG3prs351B+xmCE2Zd3RFKL+mpMz5qcuAFAfRyodbggdgmFGkEGQ33VryYFl/upr31FGdI52sqzuxd7jZIsqCcznUH/gu+xaBw7wla49EmFNf+Ss+91i9Hsys0FS//Ktru1xWgkeEweX77y6Oot5tHQsDxgy0sAI85V7FmlpiiWXQdM12MGfCBfyRM+N23SjOdReeSILYCgsM3r33/54X+lfDVNj427MvbDFtKccqazlQ+iKqC//MvYwqyiJPL1ZbVoCEP774fKZA3D3qvsVPGlp9LPchpTs4mTJugt8qXl82RwXQCDNZXnbEois53E35hkRr+IJhndoRo1o2sZDoTgykbeOKiynPH03+BcUQ8zmxTmiVlHQym/LL3kRREnUlxs2zPPGb2E+Rpdib+LxOvFSmj9RfTZoYIJnrqNnBIXV2lt7xeZ0srf98JymJxrtr8lx69oSNZIReDddL+3iiUjh6lm7EcYuclqBaKp8q68geo7H1EvKy4nSRx5Q+uz4l/ypo2hVdwi9l+BHjZZmJ7lXkpNTRJ0gZpzquzN2vh/MZQALV6FZ6q4aofA9AJy1DVLdNjV8n6s9eFA5pazxwhLW4tgWMciGf5x6G7HqFPTL1ZL3l447zLGUkqAXjkeVaNmxZ2oNKIuTy6JDc0Z61Z2dgbsg6HwCX1/ux5sk82WsnNIO4CTnWKI1aCtQZaEsBf6hIl9n7VBsgZGIcPpqn7P4mbyf3EbfdfQ32qlawLuAxmDlwRsVsPkw7j4aKbvIBykNcsVXv0/X6UXXaAtw3feJnTwDak2qY6QpMLE9e7PJeuQQ8FXpqI5HoR82kd+DOwGH5F3OpuWsmEt8v7WQG8q1LMkg6vrl3I8047zMl1Yq0VwotbrsKJocsHgsbs/PGOO9v2s8U0Sju/71XRtG5skcy2msae3wixjlGR4i6ZfldMehQD1zf/FbWN9hnHfpq1Fh8+PSA9AzUi33qli8ixISbH+tw7CcumxvegMk88HMNZlVdnIEzIfyHrSdZ2S98yX2OYZw0+JyaBbQxI0fOr6KpuMD6FVGLrdN9dgOTgOPQgAAEVYSUa6AAAARXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP//AAACoAQAAQAAADwAAAADoAQAAQAAADwAAAAAAAAA\"","export default \"data:image/webp;base64,UklGRo4EAABXRUJQVlA4WAoAAAAYAAAAOwAAOwAAQUxQSA4CAAABkGXb2to2V9/v6D1Jmd5CQ5GXPYXAJMrtPOJMoMzMzDgIPYY5+vVds6T/m0BEOGzAtm1IBlR2d8kXUMyaADjeuHr9V7qj3E5/XrvaOA5AHCqzFgHTFz9tUTmEyq1PF6cBqVWDOLjkwS6VPsu8KqnaewRU7j5KIjipgFiQfCf1IGch8wMlv9QhcWk4nLlL9Z4l6b3y7hmUvGQkmF1nnrMC85zrc5CozDUQtwamisNSDCmxjL5jpqxMzfhutFCCY3+5110CaI9/jhVIcPg/DxiIB/x/eKgijLxkRobTyxFEw7zVm0NqcYg5LNAzKD3n4QbmyRVqWCiXJyD9uN7z0Ha9Dw4N5gzOnHU4IMJ7egt8HuYWasIJnlg46fkYgul9qgWU+9PA2Z7b2FngnR3e49Qm1QbKzVPNnltZ8wozK2S8et0SN34wt0LOnynVCsp02xI7tKSqqXYsV7ZtD/lpeaEfNyw/k9evWuKK7XfQ9ruP9/RW/s74t872N1bw2MY8n0Acmlb/KQ04AJ8t5PkeEbpDnbmR2/5392FiOfRFlCuTkIGsMh/aPBeGZFLBYuiM1IIUZLOD0NnMNBMWZdE/4bLo32MQ0wxcJnsvhcnerRhSLvPPhcj8s5DIsmtU6Tj1L1U6zvcEElfrVlHyqGy3epC4om5Vsg3OlO50UQ2V6Qa65LWf6TZ1J/11faBLlpgAVlA4IJgBAADwCQCdASo8ADwAPm0ylEckIyIhKAoAgA2JaQATzh4OcBkEByVmbl5z9gD9U/+J2APQgLaX4twLu19/UVxAWN1IKXE4cIqJBhoyQ0yDYn61m3zk6T7FMg0AAP78+EMvGgC8jLXmcbbmqvufKjG8Tv1M9Krl47vOW74O/Rapv2DgXbg9iK6PrRQG/9d9+rF/ESxzbszVFn3GThrMBmsklj/LPWDQ0pKzG7EyjQL6p6gfUwMze+wPhzJpn8tMqlUVgq6/QSUVcgG+ztsi73rA3vl3n4baeF1INsbuosTXtnsotVYuTii6rscx9OUTvevYcPNvcL9MPhyWeCQw0qynnGtzCIw+oFRN0+TN1mqXkFyk/rFBcH+FHiI6s9XX5EWCKn5vTRt/0RbS687PiXPFC5Zk/Gk4+538IYi+HZDjvlQQWOH/vddfYTerQ5QqWJt1YuaZNThQ2u+/DtXfZPRy1iWWLR9SKFFtlGrqBKWF5nPRPWWMNA3OssvUtvCNBLBA4cn1whzy+SpbgLvnaepxiykjKsU/MhzgAABFWElGugAAAEV4aWYAAElJKgAIAAAABgASAQMAAQAAAAEAAAAaAQUAAQAAAFYAAAAbAQUAAQAAAF4AAAAoAQMAAQAAAAIAAAATAgMAAQAAAAEAAABphwQAAQAAAGYAAAAAAAAASAAAAAEAAABIAAAAAQAAAAYAAJAHAAQAAAAwMjEwAZEHAAQAAAABAgMAAKAHAAQAAAAwMTAwAaADAAEAAAD//wAAAqAEAAEAAAA8AAAAA6AEAAEAAAA8AAAAAAAAAA==\"","export default \"data:image/webp;base64,UklGRqwEAABXRUJQVlA4WAoAAAAYAAAAOwAAOwAAQUxQSL8BAAABkGvbtmlLc5997yvbmW19gBnbDm2kjF5UmW3bthXZVZFdZ+81r+87Z1XlEaHIbSNlMstwos4XUBSTLAFQo/u01Zdf/yLDDze3zB/YwADJEoOoJAKg7oTdH4SF+XxiZlMgSESzwAJdVn2iUJzzOUMiLhQKf+/va2FtBLMBuu1zpHcsincUXhtoTKLsCTVX/KF3wrLhPLm/OWzZtjQWfZ7RhYyAC/lxMowpSzJYJAyFkZDQc21FBMUT7BqGjpHxf3m+XlEPUHE/f3vGgPzmw4awRUaTexkyJhwfNShctVgZXyJDXq4CUyjNy6Y4fVOBIkAPR2GcOE7Jm2NQ/RE9YzXht3a5VYvlOX0xF0fy+tp/ozBuQg6DzZYb6Bi7ed4rB5Mp/1Co4cNhLUo1StLxDIDqrynUoRswiF6nFnIxsDpnZ5WBW0GFZ1qZ8HfLDk5txHHsGDpSa6B0cXZEa+DsTr1M+P4qPdXwjynU4+1/a7oN3Sm6G+meSd27oHsHde++7puj+tYpv7G6b7vun6L7l6n+oZp/t7JmUNUqqhpJV5upakJVLaqqgVW1t6rmV401NGMc1djqH4rpIseSfyPFkgAAVlA4IAQCAABQDACdASo8ADwAPm0yk0akIyGhJgzogA2JaQAThroHvLxu+aPf5G2BYxv+B6XHzx6GPon/o+qz/tOAA/TM82gR0vnExWoiQRM36jlg2UIvwCSqySErzuguz9EP2x/7hsNazr91aIworWI7AAD+/TZ+6Ipl444OdT+2wU0Ov+T8oJuVP/vUbT/w1Jsv6Awnl6rvF/xetfOPt3gTQZZi0Y/AOx563J7CJkqTR/fc/n34zyeKzR80fhfv4ef+Hjhz/CX5aQo+58zg/FdE+7bLoophGfG0szI513EH+q+Gc73H1PFdJYf7CF8v5dhr3tMwEVX5Ji2ZxejK8xrf/E6nVXqlA4DrYNRP09InHc+fEqO/fH8xr+rMf4y1F9TOnwVffZblLoTP6lot0m/sh7sTiDQr0mIA8TiHoOffGDG6KzV+B3239udfhzD740gkRi/m53abX0Ku3vAgadgFFqL0vk8M/4aI+cI+0fbLW17mWGeMu21wSRRQiv5iNgGKR3vEGXAItcLDft1uUzWAfbe1X3zK/ymT7bA/76PB6UUknm+Y5MM4osurUXU/k7P38pN/3slnGfpFzjl4c3USY4mH9ZCJYUuC/kGEnq/yRPalPdODNFvW6s8MiQeQejYNRY0LsJ0WXkK8vXiDmihCivYAOPoSovesL7on+WAArDNM/BcQSQvCYABFWElGugAAAEV4aWYAAElJKgAIAAAABgASAQMAAQAAAAEAAAAaAQUAAQAAAFYAAAAbAQUAAQAAAF4AAAAoAQMAAQAAAAIAAAATAgMAAQAAAAEAAABphwQAAQAAAGYAAAAAAAAASAAAAAEAAABIAAAAAQAAAAYAAJAHAAQAAAAwMjEwAZEHAAQAAAABAgMAAKAHAAQAAAAwMTAwAaADAAEAAAD//wAAAqAEAAEAAAA8AAAAA6AEAAEAAAA8AAAAAAAAAA==\"","export default \"data:image/webp;base64,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\"","export default \"data:image/svg+xml,%3csvg%20width='88'%20height='88'%20viewBox='0%200%2088%2088'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='88'%20height='88'%20fill='url(%23paint0_linear_170_79)'/%3e%3crect%20x='25.6665'%20y='25.6667'%20width='11'%20height='36.6667'%20rx='1.83333'%20fill='white'/%3e%3crect%20x='51.3335'%20y='25.6667'%20width='11'%20height='36.6667'%20rx='1.83333'%20fill='white'/%3e%3crect%20x='29.3335'%20y='40.3333'%20width='29.3333'%20height='7.33333'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_170_79'%20x1='-75.3077'%20y1='-55'%20x2='146.302'%20y2='148.167'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FF00FF'/%3e%3cstop%20offset='0.531673'%20stop-color='%237A84FF'/%3e%3cstop%20offset='1'%20stop-color='%2305FAFF'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/webp;base64,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\"","export default \"data:image/svg+xml,%3csvg%20width='868'%20height='868'%20viewBox='0%200%20868%20868'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='434'%20cy='434'%20r='434'%20fill='%231B262D'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M234.563%20184H640.697C650.387%20184%20659.339%20189.164%20664.172%20197.542L782.495%20402.657C788.631%20413.294%20786.808%20426.72%20778.056%20435.346L452.368%20756.327C441.818%20766.724%20424.846%20766.724%20414.296%20756.327L89.0484%20435.78C80.0927%20426.954%2078.4157%20413.136%2085.0013%20402.433L211.48%20196.884C216.405%20188.879%20225.146%20184%20234.563%20184ZM588.257%20275.577V333.129H472.567V373.032C553.82%20377.296%20614.782%20394.81%20615.234%20415.802L615.231%20459.563C614.779%20480.556%20553.82%20498.069%20472.567%20502.333V600.259H395.746V502.333C314.492%20498.069%20253.531%20480.555%20253.078%20459.563L253.081%20415.802C253.533%20394.81%20314.492%20377.296%20395.746%20373.032V333.129H280.055V275.577H588.257ZM434.156%20472.268C520.868%20472.268%20593.345%20457.459%20611.082%20437.683C596.041%20420.912%20541.636%20407.713%20472.567%20404.089V445.867C460.187%20446.516%20447.336%20446.858%20434.156%20446.858C420.976%20446.858%20408.125%20446.516%20395.746%20445.867V404.089C326.676%20407.713%20272.271%20420.912%20257.23%20437.683C274.968%20457.459%20347.444%20472.268%20434.156%20472.268Z'%20fill='%23009393'/%3e%3c/svg%3e\"","/**\n * Token types and constants for deposit currency selection\n */\n\nimport bonkLogo from '../../assets/tokens/bonk.webp';\nimport cashLogo from '../../assets/tokens/cash.webp';\nimport eurcLogo from '../../assets/tokens/eurc.webp';\nimport oreLogo from '../../assets/tokens/ore.webp';\nimport pyusdLogo from '../../assets/tokens/pyusd.webp';\nimport solLogo from '../../assets/tokens/sol.webp';\nimport usdcLogo from '../../assets/tokens/usdc.webp';\nimport usdhLogo from '../../assets/tokens/usdh.svg';\nimport usd1Logo from '../../assets/tokens/usd1.webp';\nimport usdtLogo from '../../assets/tokens/usdt.svg';\n\nexport interface Token {\n /** Token mint address */\n mint: string;\n /** Token symbol (e.g., SOL, USDC) */\n symbol: string;\n /** Token name (e.g., Solana, USD Coin) */\n name: string;\n /** Token decimals */\n decimals: number;\n /** Token logo URL */\n logoUrl?: string;\n}\n\n/**\n * Supported stablecoins for deposits\n */\nexport const SUPPORTED_TOKENS: Token[] = [\n {\n mint: 'So11111111111111111111111111111111111111112',\n symbol: 'SOL',\n name: 'Solana',\n decimals: 9,\n logoUrl: solLogo,\n },\n {\n mint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n symbol: 'USDC',\n name: 'Circle USD',\n decimals: 6,\n logoUrl: usdcLogo,\n },\n {\n mint: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: 6,\n logoUrl: usdtLogo,\n },\n {\n mint: 'HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr',\n symbol: 'EURC',\n name: 'Circle Euro',\n decimals: 6,\n logoUrl: eurcLogo,\n },\n {\n mint: 'USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB',\n symbol: 'USD1',\n name: 'WLFI USD',\n decimals: 6,\n logoUrl: usd1Logo,\n },\n {\n mint: '2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo',\n symbol: 'PYUSD',\n name: 'PayPal USD',\n decimals: 6,\n logoUrl: pyusdLogo,\n },\n {\n mint: 'USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX',\n symbol: 'USDH',\n name: 'Hubble USD',\n decimals: 6,\n logoUrl: usdhLogo,\n },\n {\n mint: 'CASHVDm2wsJXfhj6VWxb7GiMdoLc17Du7paH4bNr5woT',\n symbol: 'CASH',\n name: 'Stripe USD',\n decimals: 6,\n logoUrl: cashLogo,\n },\n {\n mint: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263',\n symbol: 'BONK',\n name: 'Bonk',\n decimals: 5,\n logoUrl: bonkLogo,\n },\n {\n mint: 'oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp',\n symbol: 'ORE',\n name: 'Ore',\n decimals: 11,\n logoUrl: oreLogo,\n },\n];\n","/**\n * Credit balance display component\n *\n * Shows the user's current credit balance from Privacy Cash deposits.\n * Can display single currency or all currencies.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useCredits } from '../../hooks/useCredits';\nimport type { CreditBalanceResponse } from '../../types/deposit';\n\nexport interface CreditBalanceProps {\n /** Show only SOL balance (default) or all currencies */\n showAllCurrencies?: boolean;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Compact display mode */\n compact?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Callback when balance is loaded */\n onLoad?: (balance: CreditBalanceResponse[]) => void;\n}\n\n/**\n * Credit balance display\n *\n * Shows the user's credit balance. Supports auto-refresh.\n */\nexport function CreditBalance({\n showAllCurrencies = false,\n refreshInterval = 0,\n compact = false,\n className = '',\n onLoad,\n}: CreditBalanceProps) {\n const { getBalance, getAllBalances, isLoading, error, clearError } = useCredits();\n\n const [balances, setBalances] = useState<CreditBalanceResponse[]>([]);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchBalance = useCallback(async () => {\n try {\n if (showAllCurrencies) {\n const result = await getAllBalances();\n setBalances(result);\n onLoad?.(result);\n } else {\n const result = await getBalance();\n setBalances([result]);\n onLoad?.([result]);\n }\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load balance');\n }\n }, [showAllCurrencies, getBalance, getAllBalances, onLoad]);\n\n // Initial load\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchBalance, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchBalance]);\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-credit-balance cedros-credit-balance-error ${className}`}>\n <p className=\"cedros-credit-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-credit-retry\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchBalance();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && balances.length === 0) {\n return (\n <div className={`cedros-credit-balance cedros-credit-balance-loading ${className}`}>\n <span className=\"cedros-credit-loading-indicator\" />\n <span className=\"cedros-credit-loading-text\">Loading balance...</span>\n </div>\n );\n }\n\n // Compact display\n if (compact) {\n const primaryBalance = balances[0];\n return (\n <div className={`cedros-credit-balance cedros-credit-balance-compact ${className}`}>\n {primaryBalance ? (\n <span\n className=\"cedros-credit-value\"\n title={`${primaryBalance.balanceLamports} lamports`}\n >\n {primaryBalance.display}\n </span>\n ) : (\n <span className=\"cedros-credit-value cedros-credit-value-zero\">0.0000 SOL</span>\n )}\n {isLoading && <span className=\"cedros-credit-refresh-indicator\" title=\"Refreshing...\" />}\n </div>\n );\n }\n\n // Full display\n return (\n <div className={`cedros-credit-balance ${className}`}>\n <div className=\"cedros-credit-header\">\n <h4 className=\"cedros-credit-title\">Credit Balance</h4>\n <button\n type=\"button\"\n className=\"cedros-credit-refresh\"\n onClick={fetchBalance}\n disabled={isLoading}\n title=\"Refresh balance\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {balances.length === 0 ? (\n <div className=\"cedros-credit-empty\">\n <p className=\"cedros-credit-empty-message\">No credit balance yet.</p>\n <p className=\"cedros-credit-empty-hint\">Make a deposit to get started.</p>\n </div>\n ) : (\n <div className=\"cedros-credit-list\">\n {balances.map((balance) => (\n <div key={balance.currency} className=\"cedros-credit-item\">\n <span className=\"cedros-credit-currency\">{balance.currency}</span>\n <span className=\"cedros-credit-amount\">{balance.display}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * History component\n *\n * Shows all account activity in a tabbed interface:\n * - All: Everything in chronological order\n * - Deposits: Incoming deposits with status tracking\n * - Usage: Service charges and spending\n * - Adjustments: Refunds, bonuses, and admin adjustments\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useCredits } from '../../hooks/useCredits';\nimport type { CreditTransactionResponse, CreditHistoryResponse } from '../../types/deposit';\n\n/** History tab category for filtering */\nexport type HistoryCategory = 'all' | 'deposits' | 'usage' | 'adjustments';\n\n/** Tab configuration */\ninterface TabConfig {\n key: HistoryCategory;\n label: string;\n txTypes: string[] | null; // null means show all\n}\n\nconst TABS: TabConfig[] = [\n { key: 'all', label: 'All', txTypes: null },\n { key: 'deposits', label: 'Deposits', txTypes: ['deposit'] },\n { key: 'usage', label: 'Usage', txTypes: ['spend', 'usage', 'charge'] },\n {\n key: 'adjustments',\n label: 'Adjustments',\n txTypes: ['refund', 'adjustment', 'bonus', 'credit'],\n },\n];\n\nexport interface HistoryProps {\n /** Initially selected tab (default: 'all') */\n defaultTab?: HistoryCategory;\n /** Number of items per page (default: 10) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when history is loaded */\n onLoad?: (history: CreditHistoryResponse) => void;\n /** Callback when a transaction is clicked */\n onTransactionClick?: (transaction: CreditTransactionResponse) => void;\n}\n\n/**\n * Format amount for display\n */\nfunction formatAmount(lamports: number, currency: string): string {\n const isNegative = lamports < 0;\n const absLamports = Math.abs(lamports);\n\n // For stablecoins (6 decimals), show as dollars\n // For SOL (9 decimals), show as SOL\n const isSol = currency.toUpperCase() === 'SOL';\n const decimals = isSol ? 9 : 6;\n const amount = absLamports / Math.pow(10, decimals);\n\n const prefix = isNegative ? '-' : '+';\n if (isSol) {\n return `${prefix}${amount.toFixed(4)} SOL`;\n }\n return `${prefix}$${amount.toFixed(2)}`;\n}\n\n/**\n * Format date for display\n */\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n // Show relative time for recent transactions\n if (diffDays === 0) {\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n if (diffHours === 0) {\n const diffMins = Math.floor(diffMs / (1000 * 60));\n if (diffMins < 1) return 'Just now';\n return `${diffMins}m ago`;\n }\n return `${diffHours}h ago`;\n }\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays}d ago`;\n\n // Show full date for older transactions\n return date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: date.getFullYear() !== now.getFullYear() ? 'numeric' : undefined,\n });\n}\n\n/**\n * Get display label for transaction type\n */\nfunction getTypeLabel(txType: string | undefined): string {\n if (!txType) return 'Transaction';\n const labels: Record<string, string> = {\n deposit: 'Deposit',\n spend: 'Usage',\n usage: 'Usage',\n charge: 'Charge',\n refund: 'Refund',\n adjustment: 'Adjustment',\n bonus: 'Bonus',\n credit: 'Credit',\n };\n return labels[txType.toLowerCase()] || txType;\n}\n\n/**\n * Get icon for transaction type\n */\nfunction getTypeIcon(txType: string | undefined, isPositive: boolean): string {\n const type = (txType || '').toLowerCase();\n if (type === 'deposit') return '↓';\n if (type === 'spend' || type === 'usage' || type === 'charge') return '↑';\n if (type === 'refund') return '←';\n if (type === 'bonus' || type === 'credit') return '★';\n if (type === 'adjustment') return isPositive ? '+' : '−';\n return isPositive ? '+' : '−';\n}\n\n/**\n * History component with tabs\n */\nexport function History({\n defaultTab = 'all',\n pageSize = 10,\n refreshInterval = 0,\n className = '',\n onLoad,\n onTransactionClick,\n}: HistoryProps) {\n const { getHistory, isLoading, error, clearError } = useCredits();\n\n const [activeTab, setActiveTab] = useState<HistoryCategory>(defaultTab);\n const [transactions, setTransactions] = useState<CreditTransactionResponse[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n // Get current tab config\n const currentTab = TABS.find((t) => t.key === activeTab) || TABS[0];\n\n // Filter transactions based on active tab (useMemo to avoid extra renders)\n const filteredTransactions = useMemo(() => {\n if (currentTab.txTypes === null) {\n return transactions;\n }\n return transactions.filter((tx) => {\n const txType = tx.txType || '';\n return currentTab.txTypes!.some((type) => txType.toLowerCase().includes(type.toLowerCase()));\n });\n }, [transactions, currentTab.txTypes]);\n\n const fetchHistory = useCallback(async () => {\n try {\n // Fetch more than pageSize to allow client-side filtering\n const result = await getHistory({ limit: pageSize * 3, offset });\n setTransactions(result.transactions);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load history');\n }\n }, [pageSize, offset, getHistory, onLoad]);\n\n // Reset offset when tab changes\n useEffect(() => {\n setOffset(0);\n }, [activeTab]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchHistory();\n }, [fetchHistory]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n const interval = setInterval(fetchHistory, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchHistory]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Handle tab change\n const handleTabChange = (tab: HistoryCategory) => {\n setActiveTab(tab);\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-tx-history cedros-tx-history-error ${className}`}>\n <p className=\"cedros-tx-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-tx-retry\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchHistory();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && transactions.length === 0) {\n return (\n <div className={`cedros-tx-history cedros-tx-history-loading ${className}`}>\n <span className=\"cedros-tx-loading-indicator\" />\n <span className=\"cedros-tx-loading-text\">Loading transactions...</span>\n </div>\n );\n }\n\n // Get count for each tab\n const getTabCount = (tab: TabConfig): number => {\n if (tab.txTypes === null) return transactions.length;\n return transactions.filter((tx) => {\n const txType = tx.txType || '';\n return tab.txTypes!.some((type) => txType.toLowerCase().includes(type.toLowerCase()));\n }).length;\n };\n\n return (\n <div className={`cedros-tx-history ${className}`}>\n {/* Header */}\n <div className=\"cedros-tx-header\">\n <h4 className=\"cedros-tx-title\">Transaction History</h4>\n <button\n type=\"button\"\n className=\"cedros-tx-refresh\"\n onClick={fetchHistory}\n disabled={isLoading}\n title=\"Refresh\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-tx-tabs\">\n {TABS.map((tab) => {\n const count = getTabCount(tab);\n const isActive = activeTab === tab.key;\n return (\n <button\n key={tab.key}\n type=\"button\"\n className={`cedros-tx-tab ${isActive ? 'cedros-tx-tab-active' : ''}`}\n onClick={() => handleTabChange(tab.key)}\n >\n {tab.label}\n {count > 0 && <span className=\"cedros-tx-tab-count\">{count}</span>}\n </button>\n );\n })}\n </div>\n\n {/* Transaction List */}\n {filteredTransactions.length === 0 ? (\n <div className=\"cedros-tx-empty\">\n <p className=\"cedros-tx-empty-message\">\n {activeTab === 'all'\n ? 'No transactions yet.'\n : `No ${currentTab.label.toLowerCase()} found.`}\n </p>\n {activeTab === 'all' && (\n <p className=\"cedros-tx-empty-hint\">Make a deposit to get started.</p>\n )}\n </div>\n ) : (\n <>\n <div className=\"cedros-tx-list\">\n {filteredTransactions.slice(0, pageSize).map((tx) => {\n const isPositive = tx.amountLamports >= 0;\n return (\n <div\n key={tx.id}\n className={`cedros-tx-item ${isPositive ? 'cedros-tx-item-positive' : 'cedros-tx-item-negative'}`}\n onClick={() => onTransactionClick?.(tx)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onTransactionClick?.(tx);\n }\n }}\n role={onTransactionClick ? 'button' : undefined}\n tabIndex={onTransactionClick ? 0 : undefined}\n >\n {/* Icon */}\n <div\n className={`cedros-tx-icon ${isPositive ? 'cedros-tx-icon-positive' : 'cedros-tx-icon-negative'}`}\n >\n {getTypeIcon(tx.txType, isPositive)}\n </div>\n\n {/* Main content */}\n <div className=\"cedros-tx-content\">\n <div className=\"cedros-tx-row-main\">\n <span className=\"cedros-tx-type\">{getTypeLabel(tx.txType)}</span>\n <span\n className={`cedros-tx-amount ${isPositive ? 'cedros-tx-amount-positive' : 'cedros-tx-amount-negative'}`}\n >\n {formatAmount(tx.amountLamports, tx.currency)}\n </span>\n </div>\n <div className=\"cedros-tx-row-details\">\n <span className=\"cedros-tx-description\">{tx.description}</span>\n <span className=\"cedros-tx-date\">{formatDate(tx.createdAt)}</span>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"cedros-tx-pagination\">\n <button\n type=\"button\"\n className=\"cedros-tx-page-btn\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-tx-page-info\">\n Page {currentPage} of {totalPages}\n </span>\n <button\n type=\"button\"\n className=\"cedros-tx-page-btn\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { LoginForm } from '../LoginForm';\n\nexport interface FullPageLayoutProps {\n /** Brand logo element (e.g., an img or svg) */\n brandLogo?: ReactNode;\n /** Brand name displayed next to the logo */\n brandName?: string;\n /** Title displayed above the form. @default \"Welcome back\" */\n title?: string;\n /** Subtitle displayed below the title. @default \"Login with your Apple or Google account\" */\n subtitle?: string;\n /** Terms/legal text displayed below the card */\n termsText?: ReactNode;\n /** Called when login/register succeeds */\n onSuccess?: () => void;\n /** Default tab for the form. @default \"login\" */\n defaultTab?: 'login' | 'register';\n /** Custom content to render instead of LoginForm */\n children?: ReactNode;\n /** Additional CSS class for the outer container */\n className?: string;\n}\n\n/**\n * Full page login layout with centered card on gradient background.\n * Follows shadcn/ui login block pattern.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <FullPageLayout onSuccess={() => navigate('/dashboard')} />\n *\n * // With branding and terms\n * <FullPageLayout\n * brandLogo={<img src=\"/logo.svg\" alt=\"\" />}\n * brandName=\"Acme Inc.\"\n * termsText={<>By clicking continue, you agree to our <a href=\"/terms\">Terms</a>.</>}\n * onSuccess={handleSuccess}\n * />\n * ```\n */\nexport function FullPageLayout({\n brandLogo,\n brandName,\n title = 'Welcome back',\n subtitle = 'Login with your Apple or Google account',\n termsText,\n onSuccess,\n defaultTab = 'login',\n children,\n className = '',\n}: FullPageLayoutProps) {\n return (\n <div className={`cedros-full-page-layout ${className}`}>\n {/* Brand header */}\n {(brandLogo || brandName) && (\n <div className=\"cedros-brand-header\">\n {brandLogo}\n {brandName && <span className=\"cedros-brand-name\">{brandName}</span>}\n </div>\n )}\n\n <div className=\"cedros-full-page-card\">\n <div className=\"cedros-full-page-header\">\n <h1 className=\"cedros-full-page-title\">{title}</h1>\n {subtitle && <p className=\"cedros-full-page-subtitle\">{subtitle}</p>}\n </div>\n {children ?? <LoginForm defaultTab={defaultTab} onSuccess={onSuccess} />}\n </div>\n\n {/* Terms footer */}\n {termsText && <p className=\"cedros-terms-footer\">{termsText}</p>}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { LoginForm } from '../LoginForm';\n\nexport interface SplitPageLayoutProps {\n /** Brand name or logo text displayed on the left panel */\n brandName?: string;\n /** Brand logo element (replaces default logo) */\n brandLogo?: ReactNode;\n /** Tagline displayed below the brand name */\n tagline?: string;\n /** Title displayed above the form. @default \"Sign in\" */\n title?: string;\n /** Subtitle displayed below the title */\n subtitle?: string;\n /** Called when login/register succeeds */\n onSuccess?: () => void;\n /** Default tab for the form. @default \"login\" */\n defaultTab?: 'login' | 'register';\n /** Custom content to render instead of LoginForm */\n children?: ReactNode;\n /** Additional CSS class for the outer container */\n className?: string;\n}\n\n/**\n * Split page login layout with branding on the left and form on the right.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SplitPageLayout\n * brandName=\"MyApp\"\n * tagline=\"The best app for everything\"\n * onSuccess={() => navigate('/dashboard')}\n * />\n *\n * // With custom logo\n * <SplitPageLayout\n * brandLogo={<img src=\"/logo.svg\" alt=\"MyApp\" />}\n * brandName=\"MyApp\"\n * tagline=\"Enterprise-grade solutions\"\n * title=\"Welcome back\"\n * subtitle=\"Sign in to continue\"\n * />\n * ```\n */\nexport function SplitPageLayout({\n brandName = 'Your Brand',\n brandLogo,\n tagline = 'Your tagline goes here. Make it compelling.',\n title = 'Sign in',\n subtitle = 'Enter your credentials to access your account',\n onSuccess,\n defaultTab = 'login',\n children,\n className = '',\n}: SplitPageLayoutProps) {\n return (\n <div className={`cedros-split-page-layout ${className}`}>\n {/* Left side - Branding */}\n <div className=\"cedros-split-page-brand\">\n <div className=\"cedros-split-page-brand-content\">\n {brandLogo ?? (\n <div className=\"cedros-split-page-logo\">{brandName.charAt(0).toUpperCase()}</div>\n )}\n <h1 className=\"cedros-split-page-brand-name\">{brandName}</h1>\n {tagline && <p className=\"cedros-split-page-tagline\">{tagline}</p>}\n </div>\n </div>\n\n {/* Right side - Login form */}\n <div className=\"cedros-split-page-form\">\n <div className=\"cedros-split-page-form-content\">\n <h2 className=\"cedros-split-page-title\">{title}</h2>\n {subtitle && <p className=\"cedros-split-page-subtitle\">{subtitle}</p>}\n {children ?? <LoginForm defaultTab={defaultTab} onSuccess={onSuccess} />}\n </div>\n </div>\n </div>\n );\n}\n","import type { Session, ListSessionsResponse, RevokeAllSessionsResponse } from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for session management operations\n */\nexport class SessionApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all active sessions for the current user\n */\n async listSessions(): Promise<Session[]> {\n try {\n const response = await this.client.get<ListSessionsResponse>('/sessions');\n return response.sessions;\n } catch (error) {\n throw handleApiError(error, 'Failed to list sessions');\n }\n }\n\n /**\n * Revoke all sessions (logout from all devices)\n */\n async revokeAllSessions(): Promise<RevokeAllSessionsResponse> {\n try {\n return await this.client.delete<RevokeAllSessionsResponse>('/sessions');\n } catch (error) {\n throw handleApiError(error, 'Failed to revoke sessions');\n }\n }\n}\n","import { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { Session, AuthError, RevokeAllSessionsResponse } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { SessionApiClient } from '../utils/sessionApi';\n\nexport interface UseSessionsReturn {\n /** List of active sessions */\n sessions: Session[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh sessions list */\n fetchSessions: () => Promise<void>;\n /** Revoke all sessions (logout everywhere) */\n revokeAllSessions: () => Promise<RevokeAllSessionsResponse>;\n /** Number of other active sessions (excluding current) */\n otherSessionCount: number;\n}\n\n/**\n * Hook for managing user sessions across devices.\n *\n * @example\n * ```tsx\n * function SessionManager() {\n * const { sessions, isLoading, revokeAllSessions, otherSessionCount } = useSessions();\n *\n * return (\n * <div>\n * <h3>Active Sessions ({sessions.length})</h3>\n * <ul>\n * {sessions.map(session => (\n * <li key={session.id}>\n * {session.userAgent}\n * {session.isCurrent && ' (current)'}\n * </li>\n * ))}\n * </ul>\n * {otherSessionCount > 0 && (\n * <button onClick={revokeAllSessions}>\n * Sign out of {otherSessionCount} other device(s)\n * </button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useSessions(): UseSessionsReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [sessions, setSessions] = useState<Session[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new SessionApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const fetchSessions = useCallback(async () => {\n if (authState !== 'authenticated') {\n setSessions([]);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const fetchedSessions = await apiClient.listSessions();\n setSessions(fetchedSessions);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [authState, apiClient]);\n\n // Auto-fetch when authenticated\n useEffect(() => {\n if (authState === 'authenticated') {\n fetchSessions();\n } else {\n setSessions([]);\n }\n }, [authState, fetchSessions]);\n\n const revokeAllSessions = useCallback(async (): Promise<RevokeAllSessionsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiClient.revokeAllSessions();\n // Refresh sessions list after revoking\n await fetchSessions();\n return result;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient, fetchSessions]);\n\n const otherSessionCount = useMemo(() => {\n return sessions.filter((s) => !s.isCurrent).length;\n }, [sessions]);\n\n return {\n sessions,\n isLoading,\n error,\n fetchSessions,\n revokeAllSessions,\n otherSessionCount,\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type { AuthorizeRequest, AuthError } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { OrgApiClient } from '../utils/orgApi';\n\nexport interface AuthorizationCheck {\n allowed: boolean;\n reason?: string;\n isLoading: boolean;\n error: AuthError | null;\n}\n\nexport interface UseAuthorizeReturn {\n /**\n * Check if an action is authorized server-side.\n * Use this for dynamic authorization checks.\n */\n authorize: (request: AuthorizeRequest) => Promise<boolean>;\n /**\n * Authorization state for the last check\n */\n lastCheck: AuthorizationCheck;\n /**\n * Clear the last authorization check\n */\n clearCheck: () => void;\n /**\n * Check authorization and return detailed result\n */\n checkAuthorization: (request: AuthorizeRequest) => Promise<AuthorizationCheck>;\n}\n\n/**\n * Hook for server-side authorization checks.\n *\n * This hook allows you to check if a specific action is authorized\n * by making a request to the server's /authorize endpoint.\n *\n * For simple permission checks based on the user's role, use `useOrgs().hasPermission()` instead.\n *\n * @example\n * ```tsx\n * function DeleteButton({ resourceId }: { resourceId: string }) {\n * const { authorize, lastCheck } = useAuthorize();\n * const { activeOrg } = useOrgs();\n *\n * const handleDelete = async () => {\n * const allowed = await authorize({\n * orgId: activeOrg?.id!,\n * action: 'delete',\n * resource: 'document',\n * resourceId,\n * });\n *\n * if (allowed) {\n * // Proceed with delete\n * }\n * };\n *\n * return (\n * <button onClick={handleDelete} disabled={lastCheck.isLoading}>\n * Delete\n * </button>\n * );\n * }\n * ```\n */\nexport function useAuthorize(): UseAuthorizeReturn {\n const { config, _internal } = useCedrosLogin();\n\n const [lastCheck, setLastCheck] = useState<AuthorizationCheck>({\n allowed: false,\n reason: undefined,\n isLoading: false,\n error: null,\n });\n\n const apiClient = useMemo(\n () =>\n new OrgApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const checkAuthorization = useCallback(\n async (request: AuthorizeRequest): Promise<AuthorizationCheck> => {\n setLastCheck((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const response = await apiClient.authorize(request);\n const result: AuthorizationCheck = {\n allowed: response.allowed,\n reason: response.reason,\n isLoading: false,\n error: null,\n };\n setLastCheck(result);\n return result;\n } catch (err) {\n const result: AuthorizationCheck = {\n allowed: false,\n reason: undefined,\n isLoading: false,\n error: err as AuthError,\n };\n setLastCheck(result);\n return result;\n }\n },\n [apiClient]\n );\n\n const authorize = useCallback(\n async (request: AuthorizeRequest): Promise<boolean> => {\n const result = await checkAuthorization(request);\n return result.allowed;\n },\n [checkAuthorization]\n );\n\n const clearCheck = useCallback(() => {\n setLastCheck({\n allowed: false,\n reason: undefined,\n isLoading: false,\n error: null,\n });\n }, []);\n\n return {\n authorize,\n lastCheck,\n clearCheck,\n checkAuthorization,\n };\n}\n","/**\n * Hook for pending wallet recovery management\n *\n * After wallet enrollment, if recovery mode is enabled, the server stores\n * recovery data temporarily. This hook fetches that data and allows the\n * user to acknowledge receipt (after which the data is deleted from server).\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n PendingWalletRecoveryResponse,\n AcknowledgeRecoveryRequest,\n MessageResponse,\n} from '../types/wallet';\n\nexport interface UsePendingRecoveryReturn {\n /** Whether there is pending recovery data */\n hasPendingRecovery: boolean;\n /** Recovery type: 'share_c' or 'full_seed' */\n recoveryType: string | null;\n /** Recovery phrase (base64-encoded seed) */\n recoveryPhrase: string | null;\n /** When the recovery data expires */\n expiresAt: Date | null;\n /** Fetch pending recovery data from server */\n fetchPendingRecovery: () => Promise<void>;\n /** Acknowledge that user has saved the recovery phrase (deletes from server) */\n acknowledgeRecovery: () => Promise<void>;\n /** Whether request is in progress */\n isLoading: boolean;\n /** Error from last request */\n error: string | null;\n /** Clear error */\n clearError: () => void;\n}\n\n/**\n * Hook for managing pending wallet recovery data\n *\n * Use this after wallet enrollment to show the user their recovery phrase\n * and allow them to acknowledge receipt.\n */\nexport function usePendingRecovery(): UsePendingRecoveryReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pendingData, setPendingData] = useState<PendingWalletRecoveryResponse | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const fetchPendingRecovery = useCallback(async (): Promise<void> => {\n if (!apiClient) {\n throw new Error('usePendingRecovery must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PendingWalletRecoveryResponse>('/wallet/pending-recovery');\n setPendingData(data);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch pending recovery');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const acknowledgeRecovery = useCallback(async (): Promise<void> => {\n if (!apiClient) {\n throw new Error('usePendingRecovery must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const request: AcknowledgeRecoveryRequest = { confirmed: true };\n await apiClient.post<MessageResponse>('/wallet/acknowledge-recovery', request);\n // Clear pending data after successful acknowledgment\n setPendingData(null);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to acknowledge recovery');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const clearError = useCallback(() => setError(null), []);\n\n // Auto-fetch on mount if authenticated\n useEffect(() => {\n if (apiClient && context?.authState === 'authenticated') {\n fetchPendingRecovery().catch(() => {\n // Silently ignore errors on auto-fetch\n });\n }\n }, [apiClient, context?.authState, fetchPendingRecovery]);\n\n return {\n hasPendingRecovery: pendingData?.hasPendingRecovery ?? false,\n recoveryType: pendingData?.recoveryType ?? null,\n recoveryPhrase: pendingData?.recoveryPhrase ?? null,\n expiresAt: pendingData?.expiresAt ? new Date(pendingData.expiresAt) : null,\n fetchPendingRecovery,\n acknowledgeRecovery,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Unified transaction signing hook\n *\n * Handles signing for both wallet types:\n * - External Solana wallet: Delegates to wallet adapter (app-provided callback)\n * - SSS embedded wallet: Uses server-side signing\n *\n * Usage:\n * ```tsx\n * const { signTransaction, signingMethod, canSign } = useTransactionSigning({\n * // For external wallet users, provide your wallet adapter's signTransaction\n * onExternalSign: async (tx) => walletAdapter.signTransaction(tx),\n * });\n *\n * // Sign a transaction (automatically routes to correct method)\n * const signature = await signTransaction(txBytes, credential);\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useWallet } from './useWallet';\nimport { useWalletSigning } from './useWalletSigning';\nimport type { UnlockCredential } from '../types/wallet';\n\n/** Signing method in use */\nexport type SigningMethod = 'external' | 'sss' | 'none';\n\n/** Options for external wallet signing */\nexport interface ExternalSignOptions {\n /**\n * Callback to sign transaction with external wallet adapter.\n * Only called when user has external Solana wallet.\n *\n * @param transaction - Transaction bytes to sign\n * @returns Signature bytes (64 bytes Ed25519)\n */\n onExternalSign?: (transaction: Uint8Array) => Promise<Uint8Array>;\n}\n\n/** Return type for useTransactionSigning hook */\nexport interface UseTransactionSigningReturn {\n /** Sign a transaction (routes to appropriate method) */\n signTransaction: (transaction: Uint8Array, credential?: UnlockCredential) => Promise<Uint8Array>;\n /** Which signing method is available */\n signingMethod: SigningMethod;\n /** Whether user can sign transactions */\n canSign: boolean;\n /** Whether signing is in progress */\n isSigning: boolean;\n /** Solana public key (from either wallet type) */\n publicKey: string | null;\n /** Whether user has external Solana wallet */\n hasExternalWallet: boolean;\n /** Whether SSS wallet is enrolled */\n hasSssWallet: boolean;\n /** Whether SSS wallet is unlocked (for session-based signing) */\n isSssUnlocked: boolean;\n /** Error from last signing attempt */\n error: string | null;\n /** Clear error */\n clearError: () => void;\n}\n\n/**\n * Unified transaction signing hook\n *\n * Automatically routes signing requests to the appropriate method:\n * - External wallet: Uses provided callback\n * - SSS wallet: Uses server-side signing\n */\nexport function useTransactionSigning(\n options: ExternalSignOptions = {}\n): UseTransactionSigningReturn {\n const { onExternalSign } = options;\n\n const { solanaPubkey, hasExternalWallet, status, isUnlocked: isSssUnlocked } = useWallet();\n\n const {\n signTransaction: sssSignTransaction,\n isSigning: isSssSigning,\n error: sssError,\n clearError: clearSssError,\n } = useWalletSigning();\n\n // Determine which signing method is available\n const signingMethod = useMemo((): SigningMethod => {\n if (hasExternalWallet && onExternalSign) {\n return 'external';\n }\n if (status === 'enrolled_locked' || status === 'enrolled_unlocked') {\n return 'sss';\n }\n return 'none';\n }, [hasExternalWallet, onExternalSign, status]);\n\n // Whether user can sign\n const canSign = signingMethod !== 'none';\n const hasSssWallet = status === 'enrolled_locked' || status === 'enrolled_unlocked';\n\n // Unified sign function\n const signTransaction = useCallback(\n async (transaction: Uint8Array, credential?: UnlockCredential): Promise<Uint8Array> => {\n if (signingMethod === 'external') {\n if (!onExternalSign) {\n throw new Error('External wallet signing callback not provided');\n }\n return onExternalSign(transaction);\n }\n\n if (signingMethod === 'sss') {\n if (!credential && !isSssUnlocked) {\n throw new Error(\n 'Credential required for signing. Unlock wallet first or provide credential.'\n );\n }\n if (credential) {\n return sssSignTransaction(transaction, credential);\n }\n // If unlocked, credential is optional (server uses cached key)\n return sssSignTransaction(transaction);\n }\n\n throw new Error('No signing method available. Enroll a wallet first.');\n },\n [signingMethod, onExternalSign, isSssUnlocked, sssSignTransaction]\n );\n\n return {\n signTransaction,\n signingMethod,\n canSign,\n isSigning: isSssSigning,\n publicKey: solanaPubkey,\n hasExternalWallet,\n hasSssWallet,\n isSssUnlocked,\n error: sssError,\n clearError: clearSssError,\n };\n}\n","import { createContext } from 'react';\nimport type { Translations } from './translations';\n\nexport interface I18nContextValue {\n t: Translations;\n locale: string;\n}\n\nexport const I18nContext = createContext<I18nContextValue | null>(null);\n","//! Default English translations for the Cedros Login UI\n\nexport interface Translations {\n // Auth forms\n auth: {\n email: string;\n password: string;\n confirmPassword: string;\n name: string;\n optional: string;\n createPassword: string;\n confirmYourPassword: string;\n emailPlaceholder: string;\n namePlaceholder: string;\n };\n // Buttons\n buttons: {\n signIn: string;\n signUp: string;\n signOut: string;\n createAccount: string;\n continueWithGoogle: string;\n continueWithSolana: string;\n forgotPassword: string;\n resetPassword: string;\n sendVerification: string;\n };\n // Messages\n messages: {\n signingIn: string;\n signingUp: string;\n creatingAccount: string;\n connectingWallet: string;\n verifyingSignature: string;\n passwordsDoNotMatch: string;\n alreadyHaveAccount: string;\n dontHaveAccount: string;\n orContinueWith: string;\n };\n // Errors\n errors: {\n invalidCredentials: string;\n emailExists: string;\n invalidEmail: string;\n weakPassword: string;\n networkError: string;\n unknownError: string;\n walletNotFound: string;\n signatureRejected: string;\n challengeExpired: string;\n };\n // Password validation\n passwordValidation: {\n minLength: string;\n uppercase: string;\n lowercase: string;\n number: string;\n special: string;\n weak: string;\n fair: string;\n good: string;\n strong: string;\n };\n}\n\nexport const defaultTranslations: Translations = {\n auth: {\n email: 'Email',\n password: 'Password',\n confirmPassword: 'Confirm Password',\n name: 'Name',\n optional: '(optional)',\n createPassword: 'Create a password',\n confirmYourPassword: 'Confirm your password',\n emailPlaceholder: 'you@example.com',\n namePlaceholder: 'Your name',\n },\n buttons: {\n signIn: 'Sign in',\n signUp: 'Sign up',\n signOut: 'Sign out',\n createAccount: 'Create account',\n continueWithGoogle: 'Continue with Google',\n continueWithSolana: 'Connect Wallet',\n forgotPassword: 'Forgot password?',\n resetPassword: 'Reset password',\n sendVerification: 'Send verification email',\n },\n messages: {\n signingIn: 'Signing in...',\n signingUp: 'Signing up...',\n creatingAccount: 'Creating account...',\n connectingWallet: 'Connecting wallet...',\n verifyingSignature: 'Verifying signature...',\n passwordsDoNotMatch: 'Passwords do not match',\n alreadyHaveAccount: 'Already have an account?',\n dontHaveAccount: \"Don't have an account?\",\n orContinueWith: 'Or continue with',\n },\n errors: {\n invalidCredentials: 'Invalid email or password',\n emailExists: 'An account with this email already exists',\n invalidEmail: 'Please enter a valid email address',\n weakPassword: 'Password does not meet requirements',\n networkError: 'Network error. Please try again.',\n unknownError: 'An error occurred. Please try again.',\n walletNotFound: 'No wallet found. Please install a Solana wallet.',\n signatureRejected: 'Signature request was rejected',\n challengeExpired: 'Challenge expired. Please try again.',\n },\n passwordValidation: {\n minLength: 'At least 10 characters',\n uppercase: 'At least 1 uppercase letter',\n lowercase: 'At least 1 lowercase letter',\n number: 'At least 1 number',\n special: 'At least 1 special character',\n weak: 'Weak',\n fair: 'Fair',\n good: 'Good',\n strong: 'Strong',\n },\n};\n\n/**\n * Deep merge translations, allowing partial overrides\n */\nexport function mergeTranslations(\n base: Translations,\n overrides: DeepPartial<Translations>\n): Translations {\n return deepMerge(base, overrides) as Translations;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nfunction deepMerge<T extends object>(base: T, overrides: DeepPartial<T>): T {\n const result = { ...base };\n\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const baseValue = base[key as keyof T];\n const overrideValue = overrides[key as keyof typeof overrides];\n\n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n typeof overrideValue === 'object' &&\n overrideValue !== null\n ) {\n (result as Record<string, unknown>)[key] = deepMerge(\n baseValue as object,\n overrideValue as DeepPartial<object>\n );\n } else if (overrideValue !== undefined) {\n (result as Record<string, unknown>)[key] = overrideValue;\n }\n }\n }\n\n return result;\n}\n","import { useMemo, type ReactNode } from 'react';\nimport { I18nContext } from './context';\nimport { defaultTranslations, mergeTranslations, type Translations } from './translations';\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport interface I18nProviderProps {\n children: ReactNode;\n locale?: string;\n translations?: DeepPartial<Translations>;\n}\n\n/**\n * Provider for internationalization support.\n * Allows overriding default English translations with custom strings.\n */\nexport function I18nProvider({\n children,\n locale = 'en',\n translations: customTranslations,\n}: I18nProviderProps) {\n const value = useMemo(() => {\n const t = customTranslations\n ? mergeTranslations(defaultTranslations, customTranslations)\n : defaultTranslations;\n\n return { t, locale };\n }, [customTranslations, locale]);\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { I18nContext } from './context';\nimport { defaultTranslations, type Translations } from './translations';\n\n/**\n * Hook to access translations\n */\nexport function useTranslations(): Translations {\n const context = useContext(I18nContext);\n return context?.t ?? defaultTranslations;\n}\n\n/**\n * Hook to access current locale\n */\nexport function useLocale(): string {\n const context = useContext(I18nContext);\n return context?.locale ?? 'en';\n}\n"],"names":["isBytes","a","isArrayOf","isString","arr","item","afn","input","astr","label","anumber","n","aArr","astrArr","anumArr","chain","args","id","wrap","b","encode","x","decode","alphabet","letters","lettersA","len","indexes","l","i","digits","letter","join","separator","from","to","padding","bits","chr","data","end","convertRadix","pos","res","d","dlen","carry","done","digit","fromCarry","digitBase","div","rounded","gcd","radix2carry","powers","convertRadix2","max","mask","pow","radix","num","_256","bytes","radix2","revPadding","checksum","fn","sum","payload","oldChecksum","newChecksum","utils","isJapanese","wordlist","nfkd","str","normalize","norm","words","aentropy","ent","abytes","calcChecksum","entropy","bitsLeft","sha256","getCoder","baseUtils","mnemonicToEntropy","mnemonic","entropyToMnemonic","validateMnemonic","MNEMONIC_WORD_COUNT","shareToMnemonic","share","mnemonicToShare","toShamirShare","seedToMnemonic","seed","mnemonicToSeed","toSeed","isValidMnemonic","isValidWord","word","getWordSuggestions","prefix","limit","normalizedPrefix","formatMnemonicForDisplay","groups","parseMnemonicInput","w","LoginButton","className","variant","size","children","menuItems","hideSignOut","user","isAuthenticated","isLoading","openLoginModal","logout","useAuth","isMenuOpen","setIsMenuOpen","useState","focusedIndex","setFocusedIndex","menuRef","useRef","buttonRef","allMenuItems","useMemo","useEffect","handleClickOutside","e","handleEscape","handleMenuKeyDown","useCallback","toggleMenu","open","sizeClasses","variantClasses","jsx","LoadingSpinner","displayName","sanitizedPicture","sanitizeImageUrl","jsxs","index","usePasswordReset","config","useCedrosLogin","setIsLoading","isSuccess","setIsSuccess","error","setError","apiClient","ApiClient","checkLimit","getRemainingAttempts","useRateLimiter","forgotPassword","email","validateEmail","validationError","err","rateLimitError","authError","handleApiError","resetPassword","token","newPassword","clearError","reset","ForgotPasswordForm","onSuccess","onCancel","setEmail","emailId","useId","handleSubmit","ErrorMessage","Fragment","scriptLoader","resolve","reject","existingScript","cb","script","useAppleAuth","_internal","isInitialized","setIsInitialized","configRef","isMounted","initializeAppleSignIn","signIn","response","idToken","userName","isAppleDevice","userAgent","platform","AppleLoginButton","onError","disabled","hideOnNonApple","isApple","handleClick","assert","condition","message","normalizeBase64Url","base64UrlToArrayBuffer","b64url","base64","padded","binary","arrayBufferToBase64Url","buffer","mapCredentialDescriptor","desc","parseCreationOptionsFromServer","options","publicKey","rp","exclude","pubKeyCredParams","p","parseRequestOptionsFromServer","allow","credentialToServerJson","cred","rawId","responseJson","att","asr","isWebAuthnAvailable","hostname","isLocalhost","mapWebAuthnDomError","name","useWebAuthn","isSupported","authenticatePasskey","params","optionsResponse","assertion","registerPasskey","created","result","PasskeyLoginButton","isDisabled","PasskeyIcon","TABS","LoginForm","defaultTab","activeTab","setActiveTab","viewState","setViewState","hasWallets","setHasWallets","detectSolanaWallets","updateWallets","forgotPasswordMode","handleTabKeyDown","currentIndex","newIndex","newTab","features","showEmail","showGoogle","showApple","showSolana","showPasskey","showDivider","GoogleLoginButton","SolanaLoginButton","EmailLoginForm","EmailRegisterForm","ErrorBoundary","Component","props","errorInfo","hasError","fallback","showDetails","LoginModal","title","isModalOpen","closeModal","modalRef","previousActiveElement","closeModalRef","handleKeyDown","focusableElements","firstElement","lastElement","previousOverflow","handleBackdropClick","ResetPasswordForm","onLoginClick","password","setPassword","confirmPassword","setConfirmPassword","validation","setValidation","passwordsMatch","isValid","PasswordInput","validatePassword","OrgAvatar","org","sanitizedLogoUrl","sizeClass","imageClassName","placeholderClassName","OrgSelector","orgs","activeOrg","onSelect","onCreateClick","placeholder","isOpen","setIsOpen","dropdownRef","event","handleSelect","orgId","handleCreateClick","toggleDropdown","prev","RoleBadge","ChevronIcon","CheckIcon","PlusIcon","role","CloseIcon","OrgListView","CreateOrgForm","onSubmit","setName","slug","setSlug","formError","setFormError","handleNameChange","value","generatedSlug","OrgSwitcher","onClose","onCreate","OrgSwitcherModal","viewMode","setViewMode","previousFocusRef","handleCreate","ROLE_OPTIONS","MemberList","members","currentUserId","canManage","canChangeRoles","onUpdateRole","onRemove","member","MemberRow","isCurrentUser","isUpdating","setIsUpdating","selectedRole","setSelectedRole","handleRoleChange","newRole","handleRemove","isOwner","canModify","MemberAvatar","formatDate","initial","dateString","DEFAULT_ROLES","InviteForm","availableRoles","defaultRole","setRole","success","setSuccess","successTimerRef","isMountedRef","trimmedEmail","r","InviteList","invites","onResend","invite","InviteItem","resendSuccess","setResendSuccess","resendTimerRef","isExpired","handleCancel","handleResend","formatRelativeTime","date","now","diffMs","diffDays","SessionList","sessions","onRevokeAll","isRevoking","setIsRevoking","revokeSuccess","setRevokeSuccess","revokeTimerRef","otherSessionCount","s","handleRevokeAll","currentOtherCount","session","SessionItem","browserInfo","parseUserAgent","isExpiringSoon","isSessionExpiringSoon","DeviceIcon","browser","os","diffMins","diffHours","expiresAt","expires","hourInMs","RecoveryPhraseDisplay","onConfirm","copied","setCopied","confirmed","setConfirmed","copyTimerRef","wordGroups","handleCopy","handleConfirm","group","groupIndex","wordIndex","number","RecoveryPhraseInput","isSubmitting","setWords","activeIndex","setActiveIndex","suggestions","setSuggestions","setValidationError","inputId","suggestionsTimerRef","handleWordChange","newWords","newSuggestions","handleWordFocus","handleWordBlur","handleSuggestionClick","suggestion","handlePaste","pastedText","parsedWords","invalidWords","displayError","_","CapabilityWarning","capabilities","getMissingCapabilitiesMessage","getBrowserSupportInfo","VALID_RECOVERY_MODES","normalizeRecoveryMode","mode","DEFAULT_RETURN","useWalletDiscovery","context","useCedrosLoginOptional","walletConfig","setWalletConfig","fetchConfig","useWalletEnrollment","enroll","useWalletMaterial","recoveryMode","state","setState","isEnrolling","setIsEnrolling","sensitiveData","cleanup","wipeAll","doEnrollment","authMethod","encryptionKey","kdfSalt","prfSalt","generateSeed","shareA","shareB","shareC","splitSecret","encryptedA","aesGcmEncryptToBase64","toEncryptionKey","getPublicKeyFromSeed","solanaPubkey","publicKeyToBase58","request","uint8ArrayToBase64","DEFAULT_KDF_PARAMS","recoveryPhrase","startEnrollmentWithPassword","salt","generateArgon2Salt","key","argon2DeriveInWorker","startEnrollmentWithPasskey","generatePrfSalt","prfSaltBase64","prfOutput","userIdBytes","registerPasskeyWithPrf","authenticateWithDiscoverablePrf","deriveKeyFromPrf","confirmRecoveryPhrase","cancel","WalletEnrollment","onComplete","forceAuthMethod","getDefaultAuthMethod","setAuthMethod","passwordError","setPasswordError","handlePasswordSubmit","handlePasskeySubmit","handleRecoveryConfirm","useWalletSigning","apiSignTransaction","isSigning","setIsSigning","signTransaction","transaction","credential","msg","toCredentialRequest","base64ToUint8Array","usePasskeySigning","getMaterial","isAuthenticating","setIsAuthenticating","getPasskeyCredential","material","PasskeyPrompt","onPrompt","onRetry","description","handlePrompt","handleRetry","defaultTitle","defaultDescription","ErrorIcon","WalletUnlock","onUnlock","showCancel","propAuthMethod","unlock","phase","setPhase","setCredential","isPasswordAuth","isPasskeyAuth","startUnlock","unlockCredential","handlePasskeyUnlock","passkeyCredential","isProcessing","renderContent","LockIcon","SuccessIcon","useWalletRecovery","recover","getShareBForRecovery","isRecovering","setIsRecovering","startRecovery","method","shareCBase64","combineShares","prfResult","WalletRecovery","defaultAuthMethod","phraseValidated","setPhraseValidated","confirmCredential","setConfirmCredential","credentialError","setCredentialError","handlePhraseSubmit","submittedWords","handleCredentialSubmit","handleBack","handleComplete","WalletAddressRow","address","showCopy","showExplorerLink","allowReveal","copyError","setCopyError","revealFull","setRevealFull","network","explorerHref","base","isTruncatable","displayAddress","v","WalletStatus","controlledStatus","controlledPubkey","_onLock","onEnroll","onRecover","showActions","compact","isControlled","wallet","useWallet","status","refresh","statusConfig","getStatusConfig","truncatePubkey","StatusIcon","pubkey","WalletManager","view","setView","header","handleBackToStatus","handleEnrollComplete","handleUnlockComplete","handleRecoverComplete","SystemSettingsApiClient","baseUrl","timeoutMs","retryAttempts","getAccessToken","settings","useSystemSettings","authState","setSettings","requestIdRef","apiClientRef","fetchSettings","requestId","updateSettings","updates","getValue","categorySettings","found","secondsToDuration","totalSeconds","days","hours","minutes","seconds","formatDuration","parts","SETTING_METADATA","CATEGORY_METADATA","SystemSettings","showDescriptions","onSave","edits","setEdits","saveError","setSaveError","saveSuccess","setSaveSuccess","timer","handleChange","handleSave","handleReset","hasChanges","changeCount","categories","category","SettingsSection","showDescription","onChange","meta","setting","SettingRow","editValue","currentValue","hasChange","warning","numValue","above","below","DurationInput","PercentageInput","SelectInput","NumberInput","TokenListInput","TokenSymbolListInput","presets","min","displayValue","handlePresetChange","handleCustomChange","newValue","preset","step","handleSliderChange","handlePresetClick","presetValue","unit","isCustomValue","handleSelectChange","PRESET_TOKEN_SYMBOLS","tokens","updateTokens","updated","addToken","updateToken","field","val","removeToken","symbol","symbols","addSymbol","removeSymbol","isSelected","OrgApiClient","ACTIVE_ORG_KEY","safeGetItem","safeSetItem","useOrgs","hasStorage","setOrgs","setActiveOrg","permissions","setPermissions","loadPermissions","fetchOrgs","fetchedOrgs","savedOrgId","selectedOrg","switchOrg","o","createOrg","newOrg","updateOrg","updatedOrg","deleteOrg","hasPermission","permission","MemberApiClient","offset","userId","useMembers","setMembers","total","setTotal","fetchedOrgIdRef","fetchMembers","updateMemberRole","removeMember","InviteApiClient","inviteId","useInvites","setInvites","fetchInvites","createInvite","cancelInvite","resendInvite","acceptInvite","useCredits","getBalance","apiError","getAllBalances","getHistory","queryString","url","useAdminDeposits","listDeposits","query","getStats","listInPrivacyPeriod","listPendingWithdrawals","processWithdrawal","sessionId","processAllWithdrawals","getPrivacyStatus","getCreditStats","AdminDepositStats","refreshInterval","onLoad","stats","setStats","loadError","setLoadError","fetchStats","interval","getStatusLabel","getStatusClass","formatAmount","lamports","truncateId","AdminDepositList","statusFilter","pageSize","onDepositClick","deposits","setDeposits","setOffset","fetchDeposits","totalPages","currentPage","goToPage","page","newOffset","deposit","getTimeElapsed","isWithinPrivacyPeriod","withdrawalAvailableAt","AdminWithdrawalQueue","onItemClick","onWithdrawalProcessed","onAllProcessed","items","setItems","processingId","setProcessingId","processingAll","setProcessingAll","processResult","setProcessResult","earlyWithdrawalItem","setEarlyWithdrawalItem","fetchItems","handleProcessSingle","force","handleProcessAll","withinPrivacyPeriod","getTimeRemaining","remainingHours","remainingMins","AdminPrivacyPeriodDeposits","truncateSignature","sig","AdminWithdrawalHistory","PrivacySystemStatus","setStatus","fetchStatus","isPartialWithdrawalEnabled","AdminUserApiClient","isAdmin","useAdminUsers","users","setUsers","lastParams","setLastParams","listUsers","getUser","setSystemAdmin","updateUser","deleteUser","forcePasswordReset","adjustCredits","amount","reason","getUserDeposits","getUserCredits","getUserWithdrawalHistory","AdminUserList","onUserClick","onEditUser","onAdjustCredits","togglingId","setTogglingId","actionInProgress","setActionInProgress","fetchUsers","handleToggleAdmin","action","handleDelete","handlePasswordReset","isToggling","formatDateTime","formatSol","AdminUserDetail","onBack","setUser","credits","setCredits","userError","setUserError","creditsError","setCreditsError","depositsError","setDepositsError","depositsOffset","setDepositsOffset","transactionsOffset","setTransactionsOffset","fetchUser","userData","depositsData","fetchCredits","creditsData","depositsTotalPages","depositsCurrentPage","transactionsTotalPages","transactionsCurrentPage","goToDepositsPage","goToTransactionsPage","DepositsTab","TransactionsTab","onPageChange","Pagination","transactions","tx","Icons","ALL_SECTIONS","CedrosAdminDashboard","sections","defaultSection","onSectionChange","activeSection","setActiveSection","orgsLoading","handleSectionChange","section","enabledSections","currentSection","OverviewSection","UsersSection","MembersSection","InvitesSection","DepositsSection","WithdrawalsSection","balanceDisplay","setBalanceDisplay","selectedUser","setSelectedUser","canInvite","canCancel","setStatusFilter","canPromise","toSJISFunction","CODEWORDS_COUNT","version","f","kanji","exports","fromString","string","level","defaultValue","BitBuffer","bufIndex","length","bit","bitBuffer","BitMatrix","row","col","reserved","bitMatrix","getSymbolSize","require$$0","posCount","intervals","positions","coords","posLength","j","FINDER_PATTERN_SIZE","finderPattern","PenaltyScores","points","sameCountCol","sameCountRow","lastCol","lastRow","module","last","bitsCol","bitsRow","darkCount","modulesCount","getMaskAt","maskPattern","pattern","setupFormatFunc","numPatterns","bestPattern","lowerPenalty","penalty","ECLevel","EC_BLOCKS_TABLE","EC_CODEWORDS_TABLE","errorCorrectionCode","errorCorrectionLevel","EXP_TABLE","LOG_TABLE","galoisField","y","GF","p1","p2","coeff","divident","divisor","degree","poly","Polynomial","ReedSolomonEncoder","paddedData","remainder","start","buff","reedSolomonEncoder","versionCheck","numeric","alphanumeric","byte","regex","TEST_KANJI","TEST_NUMERIC","TEST_ALPHANUMERIC","VersionCheck","Regex","require$$1","dataStr","Utils","ECCode","require$$2","Mode","require$$3","require$$4","G18","G18_BCH","getBestVersionForDataLength","currentVersion","getReservedBitsCount","getTotalBitsFromDataArray","segments","totalBits","reservedBits","getBestVersionForMixedData","totalCodewords","ecTotalCodewords","dataTotalCodewordsBits","usableBits","seg","ecl","G15","G15_MASK","G15_BCH","formatInfo","NumericData","remainingNum","numericData","ALPHA_NUM_CHARS","AlphanumericData","alphanumericData","ByteData","byteData","KanjiData","kanjiData","dijkstra","graph","predecessors","costs","closest","cost_of_s_to_u","adjacent_nodes","cost_of_e","cost_of_s_to_u_plus_cost_of_e","cost_of_s_to_v","first_visit","nodes","u","opts","T","t","cost","require$$5","require$$6","require$$7","getStringByteLength","getSegments","getSegmentsFromString","numSegs","alphaNumSegs","byteSegs","kanjiSegs","s1","s2","obj","getSegmentBitsLength","mergeSegments","segs","acc","curr","prevSeg","buildNodes","buildGraph","table","prevNodeIds","nodeGroup","currentNodeIds","node","prevNodeId","buildSingleSegment","modesHint","bestMode","array","path","optimizedSegs","AlignmentPattern","FinderPattern","MaskPattern","require$$8","Version","require$$9","FormatInfo","require$$10","require$$11","Segments","require$$12","setupFinderPattern","matrix","c","setupTimingPattern","setupAlignmentPattern","setupVersionInfo","mod","setupFormatInfo","setupData","inc","bitIndex","byteIndex","dark","createData","remainingByte","createCodewords","dataTotalCodewords","ecTotalBlocks","blocksInGroup2","blocksInGroup1","totalCodewordsInGroup1","dataCodewordsInGroup1","dataCodewordsInGroup2","ecCount","rs","dcData","ecData","maxDataSize","dataSize","createSymbol","estimatedVersion","rawSegments","bestVersion","dataBits","moduleCount","modules","qrcode","hex2rgba","hex","hexCode","hexValue","margin","width","scale","qrSize","imgData","qr","symbolSize","scaledMargin","palette","posDst","pxColor","iSrc","jSrc","clearCanvas","ctx","canvas","getCanvasElement","qrData","canvasEl","image","type","rendererOpts","getColorAttrib","color","attrib","alpha","svgCmd","cmd","qrToPath","moveBy","newRow","lineLength","svgTag","qrcodesize","bg","viewBox","QRCode","CanvasRenderer","SvgRenderer","renderCanvas","renderFunc","text","argsNum","isLastArgCb","QrCode","alt","canvasRef","useTotp","setupState","setSetupState","setSetupData","getStatus","beginSetup","enableTotp","code","disableTotp","regenerateBackupCodes","TotpSetup","setStep","verifyCode","setVerifyCode","copiedSecret","setCopiedSecret","savedBackupCodes","setSavedBackupCodes","handleCopySecret","handleCopyBackupCodes","codes","handleVerify","OtpInput","TotpSettings","onStatusChange","disablePassword","setDisablePassword","regenerateCode","setRegenerateCode","newRecoveryCodes","setNewRecoveryCodes","actionLoading","setActionLoading","actionError","setActionError","handleSetupComplete","handleDisable","handleRegenerate","useDeposit","amountLamports","getConfig","getQuote","queryParams","publicDeposit","microDeposit","TokenSelector","selectedToken","openSignal","searchable","search","setSearch","containerRef","searchInputRef","filteredTokens","searchLower","handleToggle","getTierForAmount","usd","solLogo","DEFAULT_MAX_USD","SLIDER_STEPS","CURVE_POWER","formatUsd","getTierInfo","tier","clamp","usdToSlider","maxUsd","normalized","sliderToUsd","position","getUsdStep","getStepDecimals","roundUsd","decimals","TieredAmountSlider","valueUsd","normalizedValue","tierInfo","sliderValue","sliderPercent","hasUserFee","getEffectiveFeePercent","isPrivate","isMicro","feePolicy","privacyFeePercent","swapFeePercent","companyFeePercent","userFee","LAMPORTS_PER_SOL","SOL_TOKEN","OTHER_TOKEN","MAX_DEPOSIT_USD","calculateFeeLines","amountUsd","lines","privacyActive","swapActive","companyActive","solAmount","percent","fixedUsd","percentUsd","formatFeeTooltip","totalFeeUsd","feeLines","feeTotalDisplay","totalSol","line","totalPercent","COL","formatLine","sol","pct","divider","totalUsdStr","totalLine","formatExplainerFeeSummary","feeLabels","hasPrivacyFee","hasSwapFee","hasCompanyFee","getTotalFeeUsd","feePercent","userFixedLamports","fixedFeeUsd","percentFeeUsd","getPurchaseCurrencyLabel","currencyMode","supported","normalizeTokenSymbols","USD_STABLE_TOKENS","getTokenUsdPrice","priceOverrides","serverPrice","override","formatTokenAmount","DepositFlow","depositMethodProp","defaultToken","minAmount","maxAmount","onUnlockRequired","onAuthorize","showStepIndicator","pollInterval","demoMode","demoAutoConfirmMs","tokenPriceUsd","showExplainer","siteName","explainerConfig","depositError","quickActionSymbols","customTokenSymbols","mergedTokens","customDefs","seen","merged","def","customListTokens","filtered","canUseSignMode","depositMethod","firstQuickActionToken","effectiveToken","candidate","getFirstStep","setSelectedToken","setAmount","setResult","flowError","setFlowError","setSessionId","depositAddress","setDepositAddress","isAuthorizing","setIsAuthorizing","receiveAmountUsd","setReceiveAmountUsd","effectiveMin","effectiveMax","parsedAmount","isEnrolled","walletReady","needsUnlock","steps","currentStepIndex","handleTokenSelect","handleAuthorize","handleDeposit","depositAmount","depositToken","finalAmount","finalToken","smallestUnit","flowResult","handleSentDeposit","handleCopyAddress","textArea","cancelled","pollCount","maxPolls","poll","detectedAmount","timeout","tokenAmount","idx","isActive","isCurrent","ExplainerStep","UnlockStep","ConfirmStep","amt","tkn","SigningStep","ShowAddressStep","WaitingStep","SuccessStep","ErrorStep","depositConfig","onContinue","exchangeName","exchangeUrl","sanitizeExternalUrl","showExchange","purchaseCurrencyLabel","defaultBody","body","showUserFee","feeDescription","isListening","onCopy","onTokenSelect","setAmountUsd","showCustomToken","setShowCustomToken","feeTooltipOpen","setFeeTooltipOpen","customOpenSignal","setCustomOpenSignal","preMicroToken","setPreMicroToken","isMicroTier","isOtherToken","customTokens","baseTokens","resolved","feeLine","feeTooltip","tokenUsdPrice","sendAmountLabel","feesExceedAmount","isValidAmount","solToken","quickToken","current","onAmountChange","onSent","canSubmit","onNewDeposit","creditsUsd","totalFeeDisplay","bonkLogo","cashLogo","eurcLogo","oreLogo","pyusdLogo","usdcLogo","usdhLogo","usd1Logo","usdtLogo","SUPPORTED_TOKENS","CreditBalance","showAllCurrencies","balances","setBalances","fetchBalance","primaryBalance","balance","currency","isNegative","absLamports","isSol","getTypeLabel","txType","getTypeIcon","isPositive","History","onTransactionClick","setTransactions","currentTab","filteredTransactions","fetchHistory","handleTabChange","tab","getTabCount","count","FullPageLayout","brandLogo","brandName","subtitle","termsText","SplitPageLayout","tagline","SessionApiClient","useSessions","setSessions","fetchSessions","fetchedSessions","revokeAllSessions","useAuthorize","lastCheck","setLastCheck","checkAuthorization","authorize","clearCheck","usePendingRecovery","pendingData","setPendingData","fetchPendingRecovery","acknowledgeRecovery","useTransactionSigning","onExternalSign","hasExternalWallet","isSssUnlocked","sssSignTransaction","isSssSigning","sssError","clearSssError","signingMethod","canSign","hasSssWallet","I18nContext","createContext","defaultTranslations","mergeTranslations","overrides","deepMerge","baseValue","overrideValue","I18nProvider","locale","customTranslations","useTranslations","useContext","useLocale"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","x_google_ignoreList":[0,1,2,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90]}
|