@casperid/react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/dist/index.cjs +179 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +3561 -0
- package/dist/index.mjs.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +63 -0
- package/src/CasperIDModal.tsx +777 -0
- package/src/index.css +217 -0
- package/src/index.ts +41 -0
- package/src/screens/AuthSelection.tsx +221 -0
- package/src/screens/DocumentScan.tsx +348 -0
- package/src/screens/FaceScan.tsx +368 -0
- package/src/screens/IdentityVerified.tsx +51 -0
- package/src/screens/L1Setup.tsx +335 -0
- package/src/screens/Login.tsx +186 -0
- package/src/screens/MintingIdentity.tsx +446 -0
- package/src/screens/PasskeyAuth.tsx +259 -0
- package/src/screens/PasskeyRegister.tsx +281 -0
- package/src/screens/PermissionsRequest.tsx +96 -0
- package/src/screens/PinVerification.tsx +321 -0
- package/src/screens/ReviewData.tsx +315 -0
- package/src/screens/SecurityUpgrade.tsx +83 -0
- package/src/screens/VerifyIdentityChoice.tsx +59 -0
- package/src/shared/Footer.tsx +13 -0
- package/src/shared/GlassContainer.tsx +17 -0
- package/src/shared/Header.tsx +62 -0
- package/src/types.ts +342 -0
- package/src/utils/fetchWithTimeout.ts +52 -0
- package/src/utils/i18n.ts +640 -0
- package/src/utils/webauthn.ts +261 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/shared/GlassContainer.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-right.js","../node_modules/lucide-react/dist/esm/icons/badge-check.js","../node_modules/lucide-react/dist/esm/icons/calendar.js","../node_modules/lucide-react/dist/esm/icons/camera.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../node_modules/lucide-react/dist/esm/icons/circle-check.js","../node_modules/lucide-react/dist/esm/icons/circle-help.js","../node_modules/lucide-react/dist/esm/icons/credit-card.js","../node_modules/lucide-react/dist/esm/icons/delete.js","../node_modules/lucide-react/dist/esm/icons/fingerprint.js","../node_modules/lucide-react/dist/esm/icons/flashlight.js","../node_modules/lucide-react/dist/esm/icons/globe.js","../node_modules/lucide-react/dist/esm/icons/key.js","../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../node_modules/lucide-react/dist/esm/icons/lock.js","../node_modules/lucide-react/dist/esm/icons/mail.js","../node_modules/lucide-react/dist/esm/icons/moon.js","../node_modules/lucide-react/dist/esm/icons/network.js","../node_modules/lucide-react/dist/esm/icons/puzzle.js","../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../node_modules/lucide-react/dist/esm/icons/shield-check.js","../node_modules/lucide-react/dist/esm/icons/shield.js","../node_modules/lucide-react/dist/esm/icons/smartphone.js","../node_modules/lucide-react/dist/esm/icons/sparkles.js","../node_modules/lucide-react/dist/esm/icons/sun.js","../node_modules/lucide-react/dist/esm/icons/user.js","../node_modules/lucide-react/dist/esm/icons/wallet.js","../node_modules/lucide-react/dist/esm/icons/x.js","../src/shared/Header.tsx","../src/shared/Footer.tsx","../src/utils/i18n.ts","../src/screens/AuthSelection.tsx","../src/screens/Login.tsx","../src/utils/webauthn.ts","../src/screens/PasskeyAuth.tsx","../src/screens/PasskeyRegister.tsx","../src/screens/PinVerification.tsx","../src/screens/SecurityUpgrade.tsx","../src/screens/FaceScan.tsx","../src/screens/VerifyIdentityChoice.tsx","../src/screens/DocumentScan.tsx","../src/screens/ReviewData.tsx","../src/screens/MintingIdentity.tsx","../src/screens/IdentityVerified.tsx","../src/screens/PermissionsRequest.tsx","../src/CasperIDModal.tsx","../src/utils/fetchWithTimeout.ts"],"sourcesContent":["import React from 'react';\n\ninterface GlassContainerProps {\n children: React.ReactNode;\n className?: string;\n theme?: string; // Added theme prop\n}\n\nconst GlassContainer: React.FC<GlassContainerProps> = ({ children, className = '', theme = '' }) => ( // Destructure theme and provide default\n <div\n className={`glass-container relative w-full h-full rounded-[var(--casperid-radius,1.5rem)] overflow-hidden flex flex-col shadow-2xl border dark:border-white/10 border-white/40 ${className} ${theme}`} // Added theme to className\n >\n {children}\n </div>\n);\n\nexport default GlassContainer;\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n}).join(\" \");\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowRight = createLucideIcon(\"ArrowRight\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n]);\n\nexport { ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst BadgeCheck = createLucideIcon(\"BadgeCheck\", [\n [\n \"path\",\n {\n d: \"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\n key: \"3c2336\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { BadgeCheck as default };\n//# sourceMappingURL=badge-check.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Calendar = createLucideIcon(\"Calendar\", [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n]);\n\nexport { Calendar as default };\n//# sourceMappingURL=calendar.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Camera = createLucideIcon(\"Camera\", [\n [\n \"path\",\n {\n d: \"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\",\n key: \"1tc9qg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n]);\n\nexport { Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleAlert = createLucideIcon(\"CircleAlert\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n]);\n\nexport { CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheck = createLucideIcon(\"CircleCheck\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleHelp = createLucideIcon(\"CircleHelp\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { CircleHelp as default };\n//# sourceMappingURL=circle-help.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CreditCard = createLucideIcon(\"CreditCard\", [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"5\", rx: \"2\", key: \"ynyp8z\" }],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"10\", y2: \"10\", key: \"1b3vmo\" }]\n]);\n\nexport { CreditCard as default };\n//# sourceMappingURL=credit-card.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Delete = createLucideIcon(\"Delete\", [\n [\"path\", { d: \"M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Z\", key: \"1oy587\" }],\n [\"line\", { x1: \"18\", x2: \"12\", y1: \"9\", y2: \"15\", key: \"1olkx5\" }],\n [\"line\", { x1: \"12\", x2: \"18\", y1: \"9\", y2: \"15\", key: \"1n50pc\" }]\n]);\n\nexport { Delete as default };\n//# sourceMappingURL=delete.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Fingerprint = createLucideIcon(\"Fingerprint\", [\n [\"path\", { d: \"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\", key: \"1nerag\" }],\n [\"path\", { d: \"M14 13.12c0 2.38 0 6.38-1 8.88\", key: \"o46ks0\" }],\n [\"path\", { d: \"M17.29 21.02c.12-.6.43-2.3.5-3.02\", key: \"ptglia\" }],\n [\"path\", { d: \"M2 12a10 10 0 0 1 18-6\", key: \"ydlgp0\" }],\n [\"path\", { d: \"M2 16h.01\", key: \"1gqxmh\" }],\n [\"path\", { d: \"M21.8 16c.2-2 .131-5.354 0-6\", key: \"drycrb\" }],\n [\"path\", { d: \"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\", key: \"1tidbn\" }],\n [\"path\", { d: \"M8.65 22c.21-.66.45-1.32.57-2\", key: \"13wd9y\" }],\n [\"path\", { d: \"M9 6.8a6 6 0 0 1 9 5.2v2\", key: \"1fr1j5\" }]\n]);\n\nexport { Fingerprint as default };\n//# sourceMappingURL=fingerprint.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Flashlight = createLucideIcon(\"Flashlight\", [\n [\n \"path\",\n {\n d: \"M18 6c0 2-2 2-2 4v10a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2V10c0-2-2-2-2-4V2h12z\",\n key: \"1orkel\"\n }\n ],\n [\"line\", { x1: \"6\", x2: \"18\", y1: \"6\", y2: \"6\", key: \"1z11jq\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"12\", y2: \"12\", key: \"1f4yc1\" }]\n]);\n\nexport { Flashlight as default };\n//# sourceMappingURL=flashlight.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Globe = createLucideIcon(\"Globe\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n]);\n\nexport { Globe as default };\n//# sourceMappingURL=globe.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Key = createLucideIcon(\"Key\", [\n [\"path\", { d: \"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\", key: \"g0fldk\" }],\n [\"path\", { d: \"m21 2-9.6 9.6\", key: \"1j0ho8\" }],\n [\"circle\", { cx: \"7.5\", cy: \"15.5\", r: \"5.5\", key: \"yqb3hr\" }]\n]);\n\nexport { Key as default };\n//# sourceMappingURL=key.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"Lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Mail = createLucideIcon(\"Mail\", [\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }]\n]);\n\nexport { Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Moon = createLucideIcon(\"Moon\", [\n [\"path\", { d: \"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\", key: \"a7tn18\" }]\n]);\n\nexport { Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Network = createLucideIcon(\"Network\", [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n]);\n\nexport { Network as default };\n//# sourceMappingURL=network.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Puzzle = createLucideIcon(\"Puzzle\", [\n [\n \"path\",\n {\n d: \"M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.077.877.528 1.073 1.01a2.5 2.5 0 1 0 3.259-3.259c-.482-.196-.933-.558-1.01-1.073-.05-.336.062-.676.303-.917l1.525-1.525A2.402 2.402 0 0 1 12 1.998c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.237 3.237c-.464.18-.894.527-.967 1.02Z\",\n key: \"i0oyt7\"\n }\n ]\n]);\n\nexport { Puzzle as default };\n//# sourceMappingURL=puzzle.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RefreshCw = createLucideIcon(\"RefreshCw\", [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n]);\n\nexport { RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ShieldCheck = createLucideIcon(\"ShieldCheck\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"Shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Smartphone = createLucideIcon(\"Smartphone\", [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n]);\n\nexport { Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sparkles = createLucideIcon(\"Sparkles\", [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n]);\n\nexport { Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sun = createLucideIcon(\"Sun\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n]);\n\nexport { Sun as default };\n//# sourceMappingURL=sun.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst User = createLucideIcon(\"User\", [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n]);\n\nexport { User as default };\n//# sourceMappingURL=user.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Wallet = createLucideIcon(\"Wallet\", [\n [\n \"path\",\n {\n 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 key: \"18etb6\"\n }\n ],\n [\"path\", { d: \"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\", key: \"xoc0q4\" }]\n]);\n\nexport { Wallet as default };\n//# sourceMappingURL=wallet.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","import React from 'react';\nimport { Shield, X, Sun, Moon } from 'lucide-react';\n\ninterface HeaderProps {\n onClose?: () => void;\n title?: string;\n subtitle?: string;\n showClose?: boolean;\n theme: 'light' | 'dark';\n toggleTheme: () => void;\n logoUrl?: string;\n}\n\nconst Header: React.FC<HeaderProps> = ({\n onClose,\n title = 'CasperID',\n subtitle = 'SECURE SDK',\n showClose = true,\n theme,\n toggleTheme,\n logoUrl,\n}) => (\n <header className=\"flex items-center justify-between px-6 pt-8 pb-4 relative z-20\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-brand rounded-xl flex items-center justify-center shadow-brand\">\n {logoUrl ? (\n <img src={logoUrl} alt={title} className=\"w-5 h-5 object-contain\" />\n ) : (\n <Shield className=\"text-white w-5 h-5\" />\n )}\n </div>\n <div>\n <h2 className=\"text-lg font-bold tracking-tight text-main\">{title}</h2>\n {subtitle && (\n <p className=\"text-[10px] uppercase tracking-widest text-brand font-bold\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleTheme}\n className=\"p-2 dark:hover:bg-white/10 hover:bg-slate-200/50 rounded-xl transition-colors text-muted\"\n aria-label=\"Toggle theme\"\n >\n {theme === 'dark' ? <Sun className=\"w-5 h-5\" /> : <Moon className=\"w-5 h-5\" />}\n </button>\n {showClose && (\n <button\n onClick={onClose}\n className=\"p-2 dark:hover:bg-white/10 hover:bg-slate-200/50 rounded-full transition-colors text-muted\"\n aria-label=\"Close\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n </header>\n);\n\nexport default Header;\n","import React from 'react';\n\ninterface FooterProps {\n children: React.ReactNode;\n}\n\nconst Footer: React.FC<FooterProps> = ({ children }) => (\n <footer className=\"p-8 text-center relative z-20\">\n {children}\n </footer>\n);\n\nexport default Footer;\n","type Translations = {\n [key: string]: {\n [key: string]: string;\n };\n};\n\nconst translations: Translations = {\n EN: {\n welcome_back: \"Welcome back\",\n enter_email: \"Enter your email to receive a verification code.\",\n email_address: \"Email Address\",\n continue: \"Continue\",\n sending_code: \"Sending Code...\",\n verify_email: \"Verify Email\",\n enter_code: \"Enter the 6-digit code sent to\",\n verification_failed: \"Verification Failed\",\n verifying: \"Verifying...\",\n resend_code: \"Resend Code\",\n resend_in: \"Resend in\",\n secure_sdk: \"SECURE SDK\",\n permission_request: \"PERMISSION REQUEST\",\n review_data: \"Review Data\",\n mint_identity: \"Mint Identity\",\n face_scan: \"Face Scan\",\n document_scan: \"Document Scan\",\n verification_step: \"VERIFICATION STEP\",\n kyc_required: \"KYC REQUIRED\",\n security_upgrade_required: \"Security Upgrade Required\",\n security_upgrade_desc: \"Your account requires a biometric security upgrade to perform this action.\",\n biometric_secure: \"BIOMETRIC SECURE\",\n zero_knowledge: \"ZERO KNOWLEDGE\",\n start_upgrade: \"Start Upgrade\",\n do_this_later: \"I'll do this later\",\n sign_in_with_extension: \"Sign in with Extension\",\n sign_in_with_otp: \"Sign in with OTP\",\n extension_detected: \"Extension Detected\",\n secure_wallet: \"Secure Wallet\",\n fully_audited: \"FULLY AUDITED\",\n non_custodial: \"NON-CUSTODIAL\",\n verify_identity: \"Verify Your Identity\",\n choose_document: \"Choose a document type to begin verification.\",\n passport: \"Passport\",\n drivers_license: \"Driver License\",\n national_id: \"ID Card\",\n passport_desc: \"All countries supported\",\n drivers_license_desc: \"Government issued card\",\n national_id_desc: \"National identity document\",\n position_face: \"Position your face in the frame\",\n blink_slowly: \"Blink slowly\",\n turn_head_left: \"Turn your head slowly to the left\",\n turn_head_right: \"Turn your head slowly to the right\",\n processing: \"Processing...\",\n camera_permission_denied: \"Camera permission denied\",\n unable_access_camera: \"Unable to access camera\",\n live_camera: \"LIVE CAMERA\",\n initializing: \"INITIALIZING\",\n processing_verification: \"Processing Verification...\",\n processing_subtitle: \"Validating your documents and biometrics\",\n minting_identity: \"Minting your Identity...\",\n minting_subtitle: \"Securing your decentralized identity on the Casper Network\",\n identity_minted: \"Identity Minted!\",\n minted_subtitle: \"Your CasperID has been successfully created\",\n verification_failed_subtitle: \"There was an issue with your verification\",\n try_again: \"Try Again\",\n credential_hash: \"Credential Hash\",\n identity_verified: \"Identity Verified\",\n identity_verified_desc: \"Your CasperID has been successfully authenticated on the Casper blockchain. You're ready to go.\",\n share_data_consent: \"Share Data Consent\",\n authorize_dapps: \"Authorize dApps to access your credentials\",\n return_to_app: \"Return to App\",\n verify_data_desc: \"Verify your extracted identity information. This data will be used to mint your CasperID.\",\n ocr_confidence: \"OCR Confidence\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n document_number: \"Document Number\",\n date_of_birth: \"Date of Birth\",\n nationality: \"Nationality\",\n enter_first_name: \"Enter first name\",\n enter_last_name: \"Enter last name\",\n enter_nationality: \"Enter nationality\",\n scanned_successfully: \"Scanned Successfully\",\n secured_by_casper: \"Secured by CasperID Protocol.\",\n confirm_mint: \"Confirm & Mint\",\n submitting: \"Submitting...\",\n retake_photo: \"Retake Photo\",\n auth_subtitle: \"Secure your Web3 identity with our premium authentication layer.\",\n extension_connect_msg: \"Click the CasperID extension icon in your browser to connect.\",\n extension_not_detected: \"CasperID extension not detected. Please install the extension or use OTP sign-in.\",\n connecting: \"Connecting...\",\n two_factor_auth: \"Two-Factor Auth\",\n security_notice: \"Your data is encrypted and never stored on central servers. Powered by Casper Network.\",\n e2e_encrypted: \"End-to-End Encrypted\",\n error_email_required: \"Please enter your email\",\n error_invalid_email: \"Please enter a valid email address\",\n error_passkey_registered: \"You have a passkey registered. Please use extension sign-in.\",\n error_send_code_failed: \"Failed to send verification code. Please try again.\",\n error_connection_failed: \"Unable to connect. Please check your internet connection.\",\n verify_code: \"Verification Code\",\n code_expired: \"Code expired\",\n invalid_code: \"Invalid code\",\n error_pin_incomplete: \"Please enter all 6 digits\",\n verify: \"Verify\",\n invalid_code_attempts: \"Invalid code. {attempts} attempts remaining.\",\n awaiting_calibration: \"Awaiting Calibration\",\n transaction_status: \"Transaction Status\",\n complete_percent: \"{percent}% Complete\",\n validating_docs: \"Validating documents...\",\n broadcasting_tx: \"Broadcasting to Casper Mainnet Node...\",\n tx_confirmed: \"Transaction confirmed on Casper Network\",\n scan_instruction: \"Scan {side} of your {docType}\",\n review_capture: \"Review your capture. Ensure all text is clearly visible.\",\n align_document: \"Align your document within the glowing frame. Ensure all four corners are visible.\",\n next_back_side: \"Next: Back Side\",\n confirm: \"Confirm\",\n capture: \"Capture\",\n verify_data_carefully: \"Please verify the extracted data carefully.\",\n enter_doc_number: \"Enter document number\",\n date_format: \"DD/MM/YYYY\",\n error_required_fields: \"Please fill in all required fields.\",\n front: \"front\",\n back: \"back\",\n requesting_access: \"Requesting Access\",\n privacy_note: \"Privacy Note\",\n privacy_desc: \"Only cryptographic proofs are shared. No private keys are ever exposed.\",\n approve_verify: \"Approve & Verify\",\n deny: \"Deny\",\n perm_identity: \"Verify Identity Status\",\n perm_profile: \"Read Public Profile\",\n perm_kyc: \"Share KYC Level\",\n full_name: \"FULL NAME\",\n id_number: \"ID NUMBER\",\n // Passkey Auth\n passkey_auth_subtitle: \"Use your passkey to sign in securely.\",\n signing_in_as: \"Signing in as\",\n use_passkey: \"Use Your Passkey\",\n authenticating: \"Authenticating...\",\n authentication_failed: \"Authentication Failed\",\n passkey_auth_hint: \"Touch ID, Face ID, or security key\",\n passkey_cancelled: \"Authentication was cancelled. Try again when ready.\",\n authenticate: \"Authenticate\",\n use_email_instead: \"Use email code instead\",\n biometric_secured: \"Biometric Secured\",\n webauthn_not_supported: \"Your browser doesn't support passkeys. Please use email verification.\",\n // Passkey Registration\n create_passkey: \"Create Your Passkey\",\n passkey_register_subtitle: \"Set up biometric authentication for secure, passwordless sign-in.\",\n passkey_benefits_title: \"Why use a passkey?\",\n passkey_benefit_1: \"No passwords to remember\",\n passkey_benefit_2: \"Phishing-resistant security\",\n passkey_benefit_3: \"Works across your devices\",\n register_passkey: \"Create Passkey\",\n creating_passkey: \"Creating passkey...\",\n passkey_created: \"Passkey created successfully!\",\n passkey_create_failed: \"Failed to create passkey\",\n // L1 Setup\n l1_setup_title: \"Setting Up Your Identity\",\n l1_setup_subtitle: \"Creating your secure wallet and decentralized identity.\",\n generating_wallet: \"Generating secure wallet...\",\n minting_did: \"Minting your DID...\",\n l1_complete: \"Identity setup complete!\",\n l1_failed: \"Setup failed. Please try again.\",\n },\n ES: {\n welcome_back: \"Bienvenido de nuevo\",\n enter_email: \"Ingrese su correo para recibir un código.\",\n email_address: \"Correo electrónico\",\n continue: \"Continuar\",\n sending_code: \"Enviando código...\",\n verify_email: \"Verificar correo\",\n enter_code: \"Ingrese el código de 6 dígitos enviado a\",\n verification_failed: \"Error de verificación\",\n verifying: \"Verificando...\",\n resend_code: \"Reenviar código\",\n resend_in: \"Reenviar en\",\n secure_sdk: \"SDK SEGURO\",\n permission_request: \"SOLICITUD DE PERMISO\",\n review_data: \"Revisar datos\",\n mint_identity: \"Mint Identidad\",\n face_scan: \"Escaneo facial\",\n document_scan: \"Escaneo de documentos\",\n verification_step: \"PASO DE VERIFICACIÓN\",\n kyc_required: \"KYC REQUERIDO\",\n security_upgrade_required: \"Actualización de Seguridad Requerida\",\n security_upgrade_desc: \"Su cuenta requiere una actualización de seguridad biométrica para esta acción.\",\n biometric_secure: \"BIOMÉTRICO SEGURO\",\n zero_knowledge: \"CONOCIMIENTO CERO\",\n start_upgrade: \"Iniciar actualización\",\n do_this_later: \"Lo haré más tarde\",\n sign_in_with_extension: \"Iniciar sesión con extensión\",\n sign_in_with_otp: \"Iniciar sesión con OTP\",\n extension_detected: \"Extensión detectada\",\n secure_wallet: \"Billetera segura\",\n fully_audited: \"TOTALMENTE AUDITADO\",\n non_custodial: \"SIN CUSTODIA\",\n verify_identity: \"Verifique su identidad\",\n choose_document: \"Elija un tipo de documento para comenzar.\",\n passport: \"Pasaporte\",\n drivers_license: \"Licencia de conducir\",\n national_id: \"DNI / Cédula\",\n passport_desc: \"Todos los países soportados\",\n drivers_license_desc: \"Tarjeta emitida por el gobierno\",\n national_id_desc: \"Documento nacional de identidad\",\n position_face: \"Coloque su cara en el marco\",\n blink_slowly: \"Parpadee lentamente\",\n turn_head_left: \"Gire la cabeza hacia la izquierda\",\n turn_head_right: \"Gire la cabeza hacia la derecha\",\n processing: \"Procesando...\",\n camera_permission_denied: \"Permiso de cámara denegado\",\n unable_access_camera: \"No se puede acceder a la cámara\",\n live_camera: \"CÁMARA EN VIVO\",\n initializing: \"INICIALIZANDO\",\n processing_verification: \"Procesando verificación...\",\n processing_subtitle: \"Validando sus documentos y biometría\",\n minting_identity: \"Minting identidad...\",\n minting_subtitle: \"Asegurando su identidad descentralizada en Casper Network\",\n identity_minted: \"¡Identidad Minted!\",\n minted_subtitle: \"Su CasperID ha sido creado con éxito\",\n verification_failed_subtitle: \"Hubo un problema con su verificación\",\n try_again: \"Intentar de nuevo\",\n credential_hash: \"Hash de credencial\",\n identity_verified: \"Identidad verificada\",\n identity_verified_desc: \"Su CasperID ha sido autenticado con éxito en la cadena de bloques Casper.\",\n share_data_consent: \"Consentimiento de datos\",\n authorize_dapps: \"Autorizar dApps para acceder a credenciales\",\n return_to_app: \"Volver a la aplicación\",\n verify_data_desc: \"Verifique su información de identidad. Estos datos se usarán para crear su CasperID.\",\n ocr_confidence: \"Confianza OCR\",\n first_name: \"Nombre\",\n last_name: \"Apellido\",\n document_number: \"Número de documento\",\n date_of_birth: \"Fecha de nacimiento\",\n nationality: \"Nacionalidad\",\n enter_first_name: \"Ingrese nombre\",\n enter_last_name: \"Ingrese apellido\",\n enter_nationality: \"Ingrese nacionalidad\",\n scanned_successfully: \"Escaneado con éxito\",\n secured_by_casper: \"Protegido por CasperID Protocol.\",\n confirm_mint: \"Confirmar y crear\",\n submitting: \"Enviando...\",\n retake_photo: \"Tomar otra foto\",\n auth_subtitle: \"Asegure su identidad Web3 con nuestra capa de autenticación premium.\",\n extension_connect_msg: \"Haga clic en el icono de la extensión CasperID en su navegador para conectarse.\",\n extension_not_detected: \"No se detectó la extensión CasperID. Instale la extensión o use el inicio de sesión OTP.\",\n connecting: \"Conectando...\",\n two_factor_auth: \"Autenticación de dos factores\",\n security_notice: \"Sus datos están encriptados y nunca se almacenan en servidores centrales. Desarrollado por Casper Network.\",\n e2e_encrypted: \"Cifrado de extremo a extremo\",\n error_email_required: \"Por favor ingrese su correo\",\n error_invalid_email: \"Por favor ingrese un correo válido\",\n error_passkey_registered: \"Tiene una clave de paso registrada. Utilice el inicio de sesión por extensión.\",\n error_send_code_failed: \"Error al enviar el código de verificación. Inténtelo de nuevo.\",\n error_connection_failed: \"No se puede conectar. Compruebe su conexión a internet.\",\n verify_code: \"Código de verificación\",\n code_expired: \"Código expirado\",\n invalid_code: \"Código inválido\",\n error_pin_incomplete: \"Por favor ingrese los 6 dígitos\",\n verify: \"Verificar\",\n invalid_code_attempts: \"Código inválido. {attempts} intentos restantes.\",\n awaiting_calibration: \"Esperando calibración\",\n transaction_status: \"Estado de la transacción\",\n complete_percent: \"{percent}% completado\",\n validating_docs: \"Validando documentos...\",\n broadcasting_tx: \"Transmitiendo al nodo principal de Casper...\",\n tx_confirmed: \"Transacción confirmada en Casper Network\",\n scan_instruction: \"Escanee el {side} de su {docType}\",\n review_capture: \"Revise su captura. Asegúrese de que todo el texto sea visible.\",\n align_document: \"Alinee su documento dentro del marco brillante. Asegúrese de que las cuatro esquinas sean visibles.\",\n next_back_side: \"Siguiente: Reverso\",\n confirm: \"Confirmar\",\n capture: \"Capturar\",\n verify_data_carefully: \"Verifique los datos extraídos cuidadosamente.\",\n enter_doc_number: \"Ingrese el número de documento\",\n date_format: \"DD/MM/AAAA\",\n error_required_fields: \"Por favor complete todos los campos obligatorios.\",\n front: \"frente\",\n back: \"reverso\",\n requesting_access: \"Solicitando acceso\",\n privacy_note: \"Nota de privacidad\",\n privacy_desc: \"Solo se comparten pruebas criptográficas. Nunca se exponen las claves privadas.\",\n approve_verify: \"Aprobar y Verificar\",\n deny: \"Denegar\",\n perm_identity: \"Verificar estado de identidad\",\n perm_profile: \"Leer perfil público\",\n perm_kyc: \"Compartir nivel de KYC\",\n full_name: \"NOMBRE COMPLETO\",\n id_number: \"NÚMERO DE IDENTIFICACIÓN\",\n // Passkey Auth\n passkey_auth_subtitle: \"Use su clave de paso para iniciar sesión de forma segura.\",\n signing_in_as: \"Iniciando sesión como\",\n use_passkey: \"Use su clave de paso\",\n authenticating: \"Autenticando...\",\n authentication_failed: \"Autenticación fallida\",\n passkey_auth_hint: \"Touch ID, Face ID o llave de seguridad\",\n passkey_cancelled: \"Autenticación cancelada. Intente de nuevo cuando esté listo.\",\n authenticate: \"Autenticar\",\n use_email_instead: \"Usar código de correo\",\n biometric_secured: \"Biométrico seguro\",\n webauthn_not_supported: \"Su navegador no admite claves de paso. Use verificación por correo.\",\n // Passkey Registration\n create_passkey: \"Crear su clave de paso\",\n passkey_register_subtitle: \"Configure autenticación biométrica para inicio de sesión sin contraseña.\",\n passkey_benefits_title: \"¿Por qué usar clave de paso?\",\n passkey_benefit_1: \"Sin contraseñas que recordar\",\n passkey_benefit_2: \"Seguridad resistente al phishing\",\n passkey_benefit_3: \"Funciona en todos sus dispositivos\",\n register_passkey: \"Crear clave de paso\",\n creating_passkey: \"Creando clave de paso...\",\n passkey_created: \"¡Clave de paso creada!\",\n passkey_create_failed: \"Error al crear clave de paso\",\n // L1 Setup\n l1_setup_title: \"Configurando su identidad\",\n l1_setup_subtitle: \"Creando su billetera segura e identidad descentralizada.\",\n generating_wallet: \"Generando billetera segura...\",\n minting_did: \"Minting su DID...\",\n l1_complete: \"¡Configuración de identidad completa!\",\n l1_failed: \"Configuración fallida. Intente de nuevo.\",\n },\n FR: {\n welcome_back: \"Bon retour\",\n enter_email: \"Entrez votre email pour un code.\",\n email_address: \"Adresse email\",\n continue: \"Continuer\",\n sending_code: \"Envoi du code...\",\n verify_email: \"Vérifier l'email\",\n enter_code: \"Entrez le code à 6 chiffres envoyé à\",\n verification_failed: \"Échec de vérification\",\n verifying: \"Vérification...\",\n resend_code: \"Renvoyer le code\",\n resend_in: \"Renvoyer dans\",\n secure_sdk: \"SDK SÉCURISÉ\",\n permission_request: \"DEMANDE DE PERMISSION\",\n review_data: \"Réviser les données\",\n mint_identity: \"Mint Identité\",\n face_scan: \"Scan du visage\",\n document_scan: \"Scan du document\",\n verification_step: \"ÉTAPE DE VÉRIFICATION\",\n kyc_required: \"KYC REQUIS\",\n security_upgrade_required: \"Mise à niveau de sécurité requise\",\n security_upgrade_desc: \"Votre compte nécessite une mise à niveau biométrique pour cette action.\",\n biometric_secure: \"BIOMÉTRIE SÉCURISÉE\",\n zero_knowledge: \"ZÉRO CONNAISSANCE\",\n start_upgrade: \"Démarrer la mise à jour\",\n do_this_later: \"Je ferai ça plus tard\",\n sign_in_with_extension: \"Connexion avec l'extension\",\n sign_in_with_otp: \"Connexion avec OTP\",\n extension_detected: \"Extension détectée\",\n secure_wallet: \"Portefeuille sécurisé\",\n fully_audited: \"ENTIÈREMENT AUDITÉ\",\n non_custodial: \"NON FONGIBLE\",\n verify_identity: \"Vérifiez votre identité\",\n choose_document: \"Choisissez un type de document.\",\n passport: \"Passeport\",\n drivers_license: \"Permis de conduire\",\n national_id: \"Carte d'identité\",\n passport_desc: \"Tous les pays supportés\",\n drivers_license_desc: \"Carte émise par le gouvernement\",\n national_id_desc: \"Document d'identité national\",\n position_face: \"Placez votre visage dans le cadre\",\n blink_slowly: \"Clignez des yeux lentement\",\n turn_head_left: \"Tournez la tête vers la gauche\",\n turn_head_right: \"Tournez la tête vers la droite\",\n processing: \"Traitement...\",\n camera_permission_denied: \"Permission caméra refusée\",\n unable_access_camera: \"Accès caméra impossible\",\n live_camera: \"CAMÉRA EN DIRECT\",\n initializing: \"INITIALISATION\",\n processing_verification: \"Traitement de la vérification...\",\n processing_subtitle: \"Validation de vos documents et biométrie\",\n minting_identity: \"Mint Identité en cours...\",\n minting_subtitle: \"Sécurisation de votre identité sur le réseau Casper\",\n identity_minted: \"Identité créée !\",\n minted_subtitle: \"Votre CasperID a été créé avec succès\",\n verification_failed_subtitle: \"Il y a eu un problème avec votre vérification\",\n try_again: \"Réessayer\",\n credential_hash: \"Hachage de créance\",\n identity_verified: \"Identité vérifiée\",\n identity_verified_desc: \"Votre CasperID a été authentifié avec succès sur la blockchain Casper.\",\n share_data_consent: \"Partage de données\",\n authorize_dapps: \"Autoriser dApps à accéder aux identifiants\",\n return_to_app: \"Retour à l'application\",\n verify_data_desc: \"Vérifiez vos informations d'identité. Ces données seront utilisées pour créer votre CasperID.\",\n ocr_confidence: \"Confiance OCR\",\n first_name: \"Prénom\",\n last_name: \"Nom\",\n document_number: \"Numéro de document\",\n date_of_birth: \"Date de naissance\",\n nationality: \"Nationalité\",\n enter_first_name: \"Entrez le prénom\",\n enter_last_name: \"Entrez le nom\",\n enter_nationality: \"Entrez la nationalité\",\n scanned_successfully: \"Scanné avec succès\",\n secured_by_casper: \"Sécurisé par CasperID Protocol.\",\n confirm_mint: \"Confirmer et Créer\",\n submitting: \"Soumission...\",\n retake_photo: \"Reprendre la photo\",\n auth_subtitle: \"Sécurisez votre identité Web3 avec notre couche d'authentification premium.\",\n extension_connect_msg: \"Cliquez sur l'icône de l'extension CasperID dans votre navigateur pour vous connecter.\",\n extension_not_detected: \"Extension CasperID non détectée. Veuillez installer l'extension ou utiliser la connexion OTP.\",\n connecting: \"Connexion...\",\n two_factor_auth: \"Authentification à deux facteurs\",\n security_notice: \"Vos données sont cryptées et ne sont jamais stockées sur des serveurs centraux. Propulsé par Casper Network.\",\n e2e_encrypted: \"Chiffré de bout en bout\",\n error_email_required: \"Veuillez entrer votre email\",\n error_invalid_email: \"Veuillez entrer une adresse email valide\",\n error_passkey_registered: \"Vous avez une clé de sécurité enregistrée. Veuillez utiliser la connexion par extension.\",\n error_send_code_failed: \"Échec de l'envoi du code de vérification. Veuillez réessayer.\",\n error_connection_failed: \"Impossible de se connecter. Veuillez vérifier votre connexion internet.\",\n verify_code: \"Code de vérification\",\n code_expired: \"Code expiré\",\n invalid_code: \"Code invalide\",\n error_pin_incomplete: \"Veuillez entrer les 6 chiffres\",\n verify: \"Vérifier\",\n invalid_code_attempts: \"Code invalide. {attempts} tentatives restantes.\",\n awaiting_calibration: \"En attente de calibrage\",\n transaction_status: \"Statut de la transaction\",\n complete_percent: \"{percent}% terminé\",\n validating_docs: \"Validation des documents...\",\n broadcasting_tx: \"Diffusion sur le nœud Casper Mainnet...\",\n tx_confirmed: \"Transaction confirmée sur le réseau Casper\",\n scan_instruction: \"Scannez le {side} de votre {docType}\",\n review_capture: \"Réviser votre capture. Assurez-vous que tout le texte est visible.\",\n align_document: \"Alignez votre document dans le cadre. Assurez-vous que les quatre coins sont visibles.\",\n next_back_side: \"Suivant: Verso\",\n confirm: \"Confirmer\",\n capture: \"Capturer\",\n verify_data_carefully: \"Veuillez vérifier soigneusement les données extraites.\",\n enter_doc_number: \"Entrez le numéro du document\",\n date_format: \"JJ/MM/AAAA\",\n error_required_fields: \"Veuillez remplir tous les champs obligatoires.\",\n front: \"recto\",\n back: \"verso\",\n requesting_access: \"Demande d'accès\",\n privacy_note: \"Note de confidentialité\",\n privacy_desc: \"Seules des preuves cryptographiques sont partagées. Aucune clé privée n'est jamais exposée.\",\n approve_verify: \"Approuver et Vérifier\",\n deny: \"Refuser\",\n perm_identity: \"Vérifier le statut d'identité\",\n perm_profile: \"Lire le profil public\",\n perm_kyc: \"Partager le niveau KYC\",\n full_name: \"NOM COMPLET\",\n id_number: \"NUMÉRO DE DOCUMENT\",\n // Passkey Auth\n passkey_auth_subtitle: \"Utilisez votre clé d'accès pour vous connecter en toute sécurité.\",\n signing_in_as: \"Connexion en tant que\",\n use_passkey: \"Utilisez votre clé d'accès\",\n authenticating: \"Authentification...\",\n authentication_failed: \"Échec de l'authentification\",\n passkey_auth_hint: \"Touch ID, Face ID ou clé de sécurité\",\n passkey_cancelled: \"Authentification annulée. Réessayez quand vous êtes prêt.\",\n authenticate: \"Authentifier\",\n use_email_instead: \"Utiliser un code par email\",\n biometric_secured: \"Sécurisé biométrique\",\n webauthn_not_supported: \"Votre navigateur ne prend pas en charge les clés d'accès. Utilisez la vérification par email.\",\n // Passkey Registration\n create_passkey: \"Créer votre clé d'accès\",\n passkey_register_subtitle: \"Configurez l'authentification biométrique pour une connexion sans mot de passe.\",\n passkey_benefits_title: \"Pourquoi utiliser une clé d'accès?\",\n passkey_benefit_1: \"Pas de mot de passe à retenir\",\n passkey_benefit_2: \"Sécurité résistante au phishing\",\n passkey_benefit_3: \"Fonctionne sur tous vos appareils\",\n register_passkey: \"Créer la clé d'accès\",\n creating_passkey: \"Création de la clé d'accès...\",\n passkey_created: \"Clé d'accès créée!\",\n passkey_create_failed: \"Échec de la création de la clé d'accès\",\n // L1 Setup\n l1_setup_title: \"Configuration de votre identité\",\n l1_setup_subtitle: \"Création de votre portefeuille sécurisé et identité décentralisée.\",\n generating_wallet: \"Génération du portefeuille sécurisé...\",\n minting_did: \"Création de votre DID...\",\n l1_complete: \"Configuration d'identité terminée!\",\n l1_failed: \"Échec de la configuration. Réessayez.\",\n },\n DE: {\n welcome_back: \"Willkommen zurück\",\n enter_email: \"E-Mail für Bestätigungscode eingeben.\",\n email_address: \"E-Mail-Adresse\",\n continue: \"Weiter\",\n sending_code: \"Code wird gesendet...\",\n verify_email: \"E-Mail verifizieren\",\n enter_code: \"6-stelligen Code eingeben, gesendet an\",\n verification_failed: \"Verifizierung fehlgeschlagen\",\n verifying: \"Verifizierung...\",\n resend_code: \"Code erneut senden\",\n resend_in: \"Erneut in\",\n secure_sdk: \"SICHERES SDK\",\n permission_request: \"BERECHTIGUNGSANFRAGE\",\n review_data: \"Daten überprüfen\",\n mint_identity: \"Identität prägen\",\n face_scan: \"Gesichtsscan\",\n document_scan: \"Dokumentenscan\",\n verification_step: \"VERIFIZIERUNGSSCHRITT\",\n kyc_required: \"KYC ERFORDERLICH\",\n security_upgrade_required: \"Sicherheits-Upgrade erforderlich\",\n security_upgrade_desc: \"Ihr Konto erfordert ein biometrisches Upgrade für diese Aktion.\",\n biometric_secure: \"BIOMETRISCH SICHER\",\n zero_knowledge: \"ZERO-KNOWLEDGE\",\n start_upgrade: \"Upgrade starten\",\n do_this_later: \"Später erledigen\",\n sign_in_with_extension: \"Mit Erweiterung anmelden\",\n sign_in_with_otp: \"Mit OTP anmelden\",\n extension_detected: \"Erweiterung erkannt\",\n secure_wallet: \"Sichere Wallet\",\n fully_audited: \"VOLLSTÄNDIG GEPRÜFT\",\n non_custodial: \"NON-CUSTODIAL\",\n verify_identity: \"Identität verifizieren\",\n choose_document: \"Dokumenttyp auswählen.\",\n passport: \"Reisepass\",\n drivers_license: \"Führerschein\",\n national_id: \"Personalausweis\",\n passport_desc: \"Alle Länder unterstützt\",\n drivers_license_desc: \"Staatlicher Ausweis\",\n national_id_desc: \"Nationaler Identitätsnachweis\",\n position_face: \"Gesicht im Rahmen positionieren\",\n blink_slowly: \"Langsam blinzeln\",\n turn_head_left: \"Kopf langsam nach links drehen\",\n turn_head_right: \"Kopf langsam nach rechts drehen\",\n processing: \"Verarbeitung...\",\n camera_permission_denied: \"Kamerazugriff verweigert\",\n unable_access_camera: \"Kamerazugriff nicht möglich\",\n live_camera: \"LIVE-KAMERA\",\n initializing: \"INITIALISIERUNG\",\n processing_verification: \"Verifizierung wird verarbeitet...\",\n processing_subtitle: \"Dokumente und Biometrie werden validiert\",\n minting_identity: \"Identität wird geprägt...\",\n minting_subtitle: \"Ihre dezentrale Identität wird im Casper-Netzwerk gesichert\",\n identity_minted: \"Identität geprägt!\",\n minted_subtitle: \"Ihre CasperID wurde erfolgreich erstellt\",\n verification_failed_subtitle: \"Es gab ein Problem mit Ihrer Verifizierung\",\n try_again: \"Erneut versuchen\",\n credential_hash: \"Anmeldedaten-Hash\",\n identity_verified: \"Identität verifiziert\",\n identity_verified_desc: \"Ihre CasperID wurde erfolgreich in der Casper-Blockchain authentifiziert.\",\n share_data_consent: \"Datenfreigabe\",\n authorize_dapps: \"dApps Zugriff auf Anmeldedaten erlauben\",\n return_to_app: \"Zurück zur App\",\n verify_data_desc: \"Überprüfen Sie Ihre Identitätsdaten. Diese werden zur Erstellung Ihrer CasperID verwendet.\",\n ocr_confidence: \"OCR-Vertrauen\",\n first_name: \"Vorname\",\n last_name: \"Nachname\",\n document_number: \"Ausweisnummer\",\n date_of_birth: \"Geburtsdatum\",\n nationality: \"Nationalität\",\n enter_first_name: \"Vorname eingeben\",\n enter_last_name: \"Nachname eingeben\",\n enter_nationality: \"Nationalität eingeben\",\n scanned_successfully: \"Erfolgreich gescannt\",\n secured_by_casper: \"Gesichert durch CasperID Protocol.\",\n confirm_mint: \"Bestätigen & Prägen\",\n submitting: \"Wird gesendet...\",\n retake_photo: \"Foto erneut aufnehmen\",\n auth_subtitle: \"Sichern Sie Ihre Web3-Identität mit unserer Premium-Authentifizierungsschicht.\",\n extension_connect_msg: \"Klicken Sie auf das CasperID-Erweiterungssymbol in Ihrem Browser, um eine Verbindung herzustellen.\",\n extension_not_detected: \"CasperID-Erweiterung nicht erkannt. Bitte installieren Sie die Erweiterung oder verwenden Sie die OTP-Anmeldung.\",\n connecting: \"Verbindung wird hergestellt...\",\n two_factor_auth: \"Zwei-Faktor-Authentifizierung\",\n security_notice: \"Ihre Daten sind verschlüsselt und werden niemals auf zentralen Servern gespeichert. Unterstützt von Casper Network.\",\n e2e_encrypted: \"Ende-zu-Ende verschlüsselt\",\n error_email_required: \"Bitte geben Sie Ihre E-Mail-Adresse ein\",\n error_invalid_email: \"Bitte geben Sie eine gültige E-Mail-Adresse ein\",\n error_passkey_registered: \"Sie haben einen Passkey registriert. Bitte verwenden Sie die Anmeldung über die Erweiterung.\",\n error_send_code_failed: \"Der Verifizierungscode konnte nicht gesendet werden. Bitte versuchen Sie es erneut.\",\n error_connection_failed: \"Verbindung nicht möglich. Bitte überprüfen Sie Ihre Internetverbindung.\",\n verify_code: \"Verifizierungscode\",\n code_expired: \"Code abgelaufen\",\n invalid_code: \"Ungültiger Code\",\n error_pin_incomplete: \"Bitte alle 6 Ziffern eingeben\",\n verify: \"Verifizieren\",\n invalid_code_attempts: \"Ungültiger Code. {attempts} Versuche übrig.\",\n error_verify_failed: \"Verifizierung nicht möglich. Bitte erneut versuchen.\",\n error_resend_failed: \"Code konnte nicht gesendet werden. Bitte erneut versuchen.\",\n sending: \"Senden...\",\n secure_face_scan_desc: \"Sicherer Gesichtsscan • Verschlüsselt\",\n analyzing_liveness: \"Lebendigkeitsprüfung\",\n calibration_complete: \"Kalibrierung abgeschlossen\",\n awaiting_calibration: \"Warten auf Kalibrierung\",\n transaction_status: \"Transaktionsstatus\",\n complete_percent: \"{percent}% abgeschlossen\",\n validating_docs: \"Dokumente werden validiert...\",\n broadcasting_tx: \"Übertragung an Casper Mainnet Node...\",\n tx_confirmed: \"Transaktion im Casper-Netzwerk bestätigt\",\n scan_instruction: \"Scannen Sie die {side} Ihres {docType}\",\n review_capture: \"Überprüfen Sie Ihre Aufnahme. Stellen Sie sicher, dass der Text lesbar ist.\",\n align_document: \"Richten Sie Ihr Dokument im Rahmen aus. Alle vier Ecken müssen sichtbar sein.\",\n next_back_side: \"Weiter: Rückseite\",\n confirm: \"Bestätigen\",\n capture: \"Aufnehmen\",\n verify_data_carefully: \"Bitte überprüfen Sie die extrahierten Daten sorgfältig.\",\n enter_doc_number: \"Ausweisnummer eingeben\",\n date_format: \"TT/MM/JJJJ\",\n error_required_fields: \"Bitte füllen Sie alle Pflichtfelder aus.\",\n front: \"Vorderseite\",\n back: \"Rückseite\",\n requesting_access: \"Zugriff anfordern\",\n privacy_note: \"Datenschutzhinweis\",\n privacy_desc: \"Es werden nur kryptografische Beweise geteilt. Private Schlüssel werden niemals offengelegt.\",\n approve_verify: \"Genehmigen & Verifizieren\",\n deny: \"Ablehnen\",\n perm_identity: \"Identitätsstatus überprüfen\",\n perm_profile: \"Öffentliches Profil lesen\",\n perm_kyc: \"KYC-Level teilen\",\n full_name: \"VOLLSTÄNDIGER NAME\",\n id_number: \"AUSWEISNUMMER\",\n // Passkey Auth\n passkey_auth_subtitle: \"Verwenden Sie Ihren Passkey für sichere Anmeldung.\",\n signing_in_as: \"Anmeldung als\",\n use_passkey: \"Passkey verwenden\",\n authenticating: \"Authentifizierung...\",\n authentication_failed: \"Authentifizierung fehlgeschlagen\",\n passkey_auth_hint: \"Touch ID, Face ID oder Sicherheitsschlüssel\",\n passkey_cancelled: \"Authentifizierung abgebrochen. Versuchen Sie es erneut.\",\n authenticate: \"Authentifizieren\",\n use_email_instead: \"E-Mail-Code verwenden\",\n biometric_secured: \"Biometrisch gesichert\",\n webauthn_not_supported: \"Ihr Browser unterstützt keine Passkeys. Verwenden Sie E-Mail-Verifizierung.\",\n // Passkey Registration\n create_passkey: \"Passkey erstellen\",\n passkey_register_subtitle: \"Richten Sie biometrische Authentifizierung für passwortlose Anmeldung ein.\",\n passkey_benefits_title: \"Warum einen Passkey verwenden?\",\n passkey_benefit_1: \"Keine Passwörter merken\",\n passkey_benefit_2: \"Phishing-resistente Sicherheit\",\n passkey_benefit_3: \"Funktioniert auf allen Geräten\",\n register_passkey: \"Passkey erstellen\",\n creating_passkey: \"Passkey wird erstellt...\",\n passkey_created: \"Passkey erstellt!\",\n passkey_create_failed: \"Passkey-Erstellung fehlgeschlagen\",\n // L1 Setup\n l1_setup_title: \"Identität einrichten\",\n l1_setup_subtitle: \"Sichere Wallet und dezentrale Identität werden erstellt.\",\n generating_wallet: \"Sichere Wallet wird generiert...\",\n minting_did: \"DID wird geprägt...\",\n l1_complete: \"Identitätseinrichtung abgeschlossen!\",\n l1_failed: \"Einrichtung fehlgeschlagen. Erneut versuchen.\",\n }\n};\n\nexport const t = (key: string, lang: string = 'EN'): string => {\n const language = lang.toUpperCase();\n const currentLang = translations[language] || translations.EN;\n return currentLang[key] || translations.EN[key] || key;\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { motion } from 'framer-motion';\nimport { Fingerprint, Puzzle, ChevronRight, Smartphone, ShieldCheck, RefreshCw, Loader2, AlertCircle } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface ExtensionUserData {\n wallet: string;\n cnsName?: string;\n email?: string;\n tier?: string;\n humanId?: string;\n}\n\ninterface AuthSelectionProps {\n onNext: (method: 'extension' | 'otp') => void;\n onExtensionSuccess?: (userData: ExtensionUserData) => void;\n onError?: (error: string) => void;\n language?: string;\n}\n\nconst AuthSelection: React.FC<AuthSelectionProps> = ({\n onNext,\n onExtensionSuccess,\n onError,\n language = 'EN'\n}) => {\n const [isCheckingExtension, setIsCheckingExtension] = useState(false);\n const [extensionInstalled, setExtensionInstalled] = useState<boolean | null>(null);\n const [error, setError] = useState('');\n\n // Check if extension is installed on mount\n useEffect(() => {\n checkExtensionInstalled();\n }, []);\n\n // Listen for extension login events\n useEffect(() => {\n const handleExtensionLogin = (event: CustomEvent<ExtensionUserData>) => {\n setIsCheckingExtension(false);\n if (event.detail && event.detail.wallet) {\n onExtensionSuccess?.(event.detail);\n }\n };\n\n window.addEventListener('casperid-login', handleExtensionLogin as EventListener);\n return () => {\n window.removeEventListener('casperid-login', handleExtensionLogin as EventListener);\n };\n }, [onExtensionSuccess]);\n\n const checkExtensionInstalled = useCallback(() => {\n // Check for extension anchor or localStorage data\n const anchor = document.getElementById('casperid-draggable-anchor');\n let storedUser: string | null = null;\n\n try {\n storedUser = localStorage.getItem('casperid_user');\n } catch {\n // localStorage may not be available in some contexts\n }\n\n if (anchor || storedUser) {\n setExtensionInstalled(true);\n return true;\n }\n\n // Also check if we can detect extension via a brief timeout\n // Extension injects its content script which adds the anchor\n setTimeout(() => {\n const anchorAfterDelay = document.getElementById('casperid-draggable-anchor');\n setExtensionInstalled(!!anchorAfterDelay);\n }, 500);\n\n return false;\n }, []);\n\n const isValidUserData = (data: unknown): data is ExtensionUserData => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'wallet' in data &&\n typeof (data as ExtensionUserData).wallet === 'string' &&\n (data as ExtensionUserData).wallet.length > 0\n );\n };\n\n const handleExtensionLogin = async () => {\n setIsCheckingExtension(true);\n setError('');\n\n // Check if already logged in via extension\n try {\n const storedUser = localStorage.getItem('casperid_user');\n if (storedUser) {\n const userData = JSON.parse(storedUser);\n if (isValidUserData(userData)) {\n setIsCheckingExtension(false);\n onExtensionSuccess?.(userData);\n return;\n }\n }\n } catch {\n // Invalid stored data or localStorage not available, continue with extension trigger\n }\n\n // Check if extension anchor exists\n const anchor = document.getElementById('casperid-draggable-anchor');\n\n if (anchor) {\n // Trigger click on the anchor to initiate login\n anchor.click();\n\n // Set a timeout to show error if no response\n setTimeout(() => {\n setIsCheckingExtension(false);\n // Check again if login succeeded\n try {\n const newStoredUser = localStorage.getItem('casperid_user');\n if (!newStoredUser) {\n setError(t('extension_connect_msg', language));\n }\n } catch {\n setError(t('extension_connect_msg', language));\n }\n }, 3000);\n } else {\n // Extension not detected\n setIsCheckingExtension(false);\n setError(t('extension_not_detected', language));\n onError?.('Extension not installed');\n }\n };\n\n const handleOTPLogin = () => {\n setError('');\n onNext('otp');\n };\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n className=\"flex-1 px-8 flex flex-col justify-center gap-8\"\n >\n <div className=\"text-center space-y-3\">\n <div className=\"relative w-24 h-24 mx-auto mb-6\">\n <div className=\"absolute inset-0 bg-brand-20 blur-2xl rounded-full\" />\n <div className=\"relative w-full h-full glass-container flex items-center justify-center rounded-2xl border border-brand-30\">\n <Fingerprint className=\"w-10 h-10 text-brand\" />\n </div>\n </div>\n <h1 className=\"text-2xl font-extrabold leading-tight tracking-tight text-main\">{t('welcome_back', language)}</h1>\n <p className=\"text-muted text-sm leading-relaxed\">\n {t('auth_subtitle', language)}\n </p>\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"flex items-start gap-3 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-2xl\">\n <AlertCircle className=\"w-5 h-5 text-red-500 shrink-0 mt-0.5\" />\n <p className=\"text-red-600 dark:text-red-400 text-sm font-medium\">{error}</p>\n </div>\n )}\n\n <div className=\"space-y-4\">\n <button\n onClick={handleExtensionLogin}\n disabled={isCheckingExtension}\n className=\"w-full group relative overflow-hidden flex items-center gap-4 bg-brand hover:bg-brand-90 text-white py-5 px-6 rounded-2xl font-bold transition-all transform active:scale-[0.98] disabled:opacity-70 disabled:cursor-not-allowed shadow-brand\"\n >\n <div className=\"bg-white/20 p-2 rounded-lg\">\n {isCheckingExtension ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Puzzle className=\"w-5 h-5\" />\n )}\n </div>\n <div className=\"flex flex-col items-start\">\n <span className=\"text-base\">\n {isCheckingExtension ? t('connecting', language) : t('sign_in_with_extension', language)}\n </span>\n <span className=\"text-[10px] uppercase tracking-widest text-white/70\">\n {extensionInstalled === true ? t('extension_detected', language) : t('secure_wallet', language)}\n </span>\n </div>\n <ChevronRight className=\"ml-auto w-4 h-4 opacity-50 group-hover:opacity-100 transition-opacity\" />\n </button>\n\n <button\n onClick={handleOTPLogin}\n disabled={isCheckingExtension}\n className=\"w-full group relative overflow-hidden flex items-center gap-4 dark:bg-white/5 bg-slate-100/50 hover:dark:bg-white/10 hover:bg-slate-200/80 border dark:border-white/10 border-slate-200 text-main py-5 px-6 rounded-2xl font-bold transition-all transform active:scale-[0.98] disabled:opacity-50\"\n >\n <div className=\"bg-brand-10 p-2 rounded-lg\">\n <Smartphone className=\"w-5 h-5 text-brand\" />\n </div>\n <div className=\"flex flex-col items-start\">\n <span className=\"text-base\">{t('sign_in_with_otp', language)}</span>\n <span className=\"text-[10px] uppercase tracking-widest text-brand font-bold\">{t('two_factor_auth', language)}</span>\n </div>\n <ChevronRight className=\"ml-auto w-4 h-4 opacity-50 group-hover:opacity-100 transition-opacity\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"glass-container p-4 rounded-2xl flex flex-col items-center gap-2 text-center border-slate-200/50\">\n <ShieldCheck className=\"w-5 h-5 text-brand\" />\n <span className=\"text-[10px] font-bold text-muted\">{t('fully_audited', language)}</span>\n </div>\n <div className=\"glass-container p-4 rounded-2xl flex flex-col items-center gap-2 text-center border-slate-200/50\">\n <RefreshCw className=\"w-5 h-5 text-brand\" />\n <span className=\"text-[10px] font-bold text-muted\">{t('non_custodial', language)}</span>\n </div>\n </div>\n </motion.div>\n );\n};\n\nexport default AuthSelection;\n","import React, { useState } from 'react';\nimport { motion } from 'framer-motion';\nimport { Mail, Verified, Lock, ArrowRight, Loader2 } from 'lucide-react';\nimport type { SendOTPResponse } from '../types';\nimport { t } from '../utils/i18n';\n\ninterface LoginProps {\n onNext: (email: string, verificationId: string) => void;\n onPasskeyUser?: (email: string) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst Login: React.FC<LoginProps> = ({\n onNext,\n onPasskeyUser,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n const [email, setEmail] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSubmit = async () => {\n if (!email.trim()) {\n setError(t('error_email_required', language));\n return;\n }\n\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setError(t('error_invalid_email', language));\n return;\n }\n\n setIsLoading(true);\n setError('');\n\n if (previewMode) {\n // Mock delay and success for preview\n setTimeout(() => {\n setIsLoading(false);\n onNext(email.trim().toLowerCase(), 'mock-v-id-123456789');\n }, 1000);\n return;\n }\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/auth/send-otp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email: email.trim().toLowerCase() }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Request failed with status ${response.status}`);\n }\n\n const data: SendOTPResponse = await response.json();\n\n if (data.success) {\n // Returning user with passkey - route to passkey auth\n if (data.userExists && data.hasPasskey) {\n if (onPasskeyUser) {\n onPasskeyUser(email.trim().toLowerCase());\n } else {\n // Fallback: show message if no handler provided\n setError(t('error_passkey_registered', language));\n }\n setIsLoading(false);\n return;\n }\n\n // New user or user without passkey - proceed to OTP\n if (data.verificationId) {\n onNext(email.trim().toLowerCase(), data.verificationId);\n } else {\n setError(t('error_send_code_failed', language));\n }\n } else {\n setError(data.error || t('error_send_code_failed', language));\n onError?.(data.error || t('error_send_code_failed', language));\n }\n } catch (err) {\n const errorMessage = t('error_connection_failed', language);\n setError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !isLoading) {\n handleSubmit();\n }\n };\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"mb-8\">\n <h2 className=\"text-3xl font-extrabold text-main tracking-tight leading-tight\">{t('welcome_back', language)}</h2>\n <p className=\"text-muted mt-3 text-sm leading-relaxed\">\n {t('enter_email', language)}\n </p>\n </div>\n\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-bold text-slate-500 uppercase tracking-widest ml-1\">\n {t('email_address', language)}\n </label>\n <div className=\"relative\">\n <input\n className={`w-full dark:bg-black/20 bg-slate-100/50 border ${error ? 'border-red-400 dark:border-red-500' : 'dark:border-white/10 border-slate-200'} rounded-2xl h-14 px-5 text-main placeholder:text-slate-400 focus:outline-none focus:ring-2 focus:ring-brand-30 transition-all font-medium`}\n placeholder=\"name@example.com\"\n type=\"email\"\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n if (error) setError('');\n }}\n onKeyDown={handleKeyDown}\n disabled={isLoading}\n autoComplete=\"email\"\n autoFocus\n />\n <div className=\"absolute right-4 top-1/2 -translate-y-1/2 flex items-center text-slate-400\">\n <Mail className=\"w-5 h-5\" />\n </div>\n </div>\n {error && (\n <p className=\"text-red-500 text-xs font-medium ml-1 mt-1\">{error}</p>\n )}\n </div>\n <button\n onClick={handleSubmit}\n disabled={isLoading}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl shadow-xl shadow-brand flex items-center justify-center gap-2 transition-transform active:scale-[0.98] disabled:opacity-70 disabled:cursor-not-allowed\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span>{t('sending_code', language)}</span>\n </>\n ) : (\n <>\n <span>{t('continue', language)}</span>\n <ArrowRight className=\"w-5 h-5\" />\n </>\n )}\n </button>\n </div>\n\n <div className=\"mt-auto pb-8\">\n <div className=\"p-4 dark:bg-white/5 bg-slate-100/50 rounded-2xl mb-6\">\n <div className=\"flex items-start gap-3\">\n <Verified className=\"text-[#6DE8EC] w-5 h-5 mt-0.5 shrink-0\" />\n <p className=\"text-[11px] text-muted leading-normal font-medium\">\n {t('security_notice', language)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-center gap-2 opacity-50\">\n <Lock className=\"text-muted w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-[0.2em] font-bold text-muted\">{t('e2e_encrypted', language)}</span>\n </div>\n </div>\n </motion.div>\n );\n};\n\nexport default Login;\n","/**\n * WebAuthn utilities for CasperID SDK\n * Handles base64url encoding/decoding and credential formatting\n */\n\nimport type {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON\n} from '../types';\n\n/**\n * Convert ArrayBuffer to base64url string\n * Used for encoding WebAuthn credential data for server transport\n */\nexport function arrayBufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n}\n\n/**\n * Convert base64url string to ArrayBuffer\n * Used for decoding server challenge data for WebAuthn API\n */\nexport function base64urlToArrayBuffer(base64url: string): ArrayBuffer {\n // Add padding if needed\n const padding = '='.repeat((4 - (base64url.length % 4)) % 4);\n const base64 = base64url\n .replace(/-/g, '+')\n .replace(/_/g, '/') + padding;\n\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Check if WebAuthn is supported in the current browser\n */\nexport function isWebAuthnSupported(): boolean {\n return !!(\n window.PublicKeyCredential &&\n typeof window.PublicKeyCredential === 'function'\n );\n}\n\n/**\n * Check if platform authenticator (Touch ID, Face ID, Windows Hello) is available\n */\nexport async function isPlatformAuthenticatorAvailable(): Promise<boolean> {\n if (!isWebAuthnSupported()) return false;\n try {\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n } catch {\n return false;\n }\n}\n\n/**\n * Detect device type for credential metadata\n */\nexport function detectDeviceType(): 'mobile' | 'tablet' | 'desktop' {\n const userAgent = navigator.userAgent.toLowerCase();\n\n if (/iphone|ipod|android.*mobile|windows phone|blackberry/i.test(userAgent)) {\n return 'mobile';\n }\n if (/ipad|android(?!.*mobile)|tablet/i.test(userAgent)) {\n return 'tablet';\n }\n return 'desktop';\n}\n\n/**\n * Get device info for credential metadata\n */\nexport function getDeviceInfo(): { platform: string; userAgent: string; deviceType: string } {\n return {\n platform: navigator.platform || 'unknown',\n userAgent: navigator.userAgent,\n deviceType: detectDeviceType()\n };\n}\n\n/**\n * Convert server registration options to WebAuthn API format\n */\nexport function prepareRegistrationOptions(\n serverOptions: PublicKeyCredentialCreationOptionsJSON\n): PublicKeyCredentialCreationOptions {\n return {\n ...serverOptions,\n challenge: base64urlToArrayBuffer(serverOptions.challenge),\n user: {\n ...serverOptions.user,\n id: base64urlToArrayBuffer(serverOptions.user.id)\n },\n excludeCredentials: serverOptions.excludeCredentials?.map(cred => ({\n ...cred,\n id: base64urlToArrayBuffer(cred.id)\n }))\n };\n}\n\n/**\n * Convert server authentication options to WebAuthn API format\n */\nexport function prepareAuthenticationOptions(\n serverOptions: PublicKeyCredentialRequestOptionsJSON\n): PublicKeyCredentialRequestOptions {\n return {\n ...serverOptions,\n challenge: base64urlToArrayBuffer(serverOptions.challenge),\n allowCredentials: serverOptions.allowCredentials?.map(cred => ({\n ...cred,\n id: base64urlToArrayBuffer(cred.id)\n }))\n };\n}\n\n/**\n * Format registration credential for server transport\n */\nexport function formatRegistrationCredential(\n credential: PublicKeyCredential\n): {\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n attestationObject: string;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n deviceInfo: { platform: string; userAgent: string; deviceType: string };\n} {\n const response = credential.response as AuthenticatorAttestationResponse;\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n attestationObject: arrayBufferToBase64url(response.attestationObject)\n },\n clientExtensionResults: credential.getClientExtensionResults(),\n deviceInfo: getDeviceInfo()\n };\n}\n\n/**\n * Format authentication credential for server transport\n */\nexport function formatAuthenticationCredential(\n credential: PublicKeyCredential\n): {\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle: string | null;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n} {\n const response = credential.response as AuthenticatorAssertionResponse;\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n signature: arrayBufferToBase64url(response.signature),\n userHandle: response.userHandle\n ? arrayBufferToBase64url(response.userHandle)\n : null\n },\n clientExtensionResults: credential.getClientExtensionResults()\n };\n}\n\n/**\n * Create a passkey (registration)\n */\nexport async function createPasskey(\n options: PublicKeyCredentialCreationOptionsJSON\n): Promise<{\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n attestationObject: string;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n deviceInfo: { platform: string; userAgent: string; deviceType: string };\n}> {\n if (!isWebAuthnSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const preparedOptions = prepareRegistrationOptions(options);\n\n const credential = await navigator.credentials.create({\n publicKey: preparedOptions\n }) as PublicKeyCredential | null;\n\n if (!credential) {\n throw new Error('Passkey creation was cancelled or failed');\n }\n\n return formatRegistrationCredential(credential);\n}\n\n/**\n * Authenticate with a passkey\n */\nexport async function authenticateWithPasskey(\n options: PublicKeyCredentialRequestOptionsJSON\n): Promise<{\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle: string | null;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n}> {\n if (!isWebAuthnSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const preparedOptions = prepareAuthenticationOptions(options);\n\n const credential = await navigator.credentials.get({\n publicKey: preparedOptions\n }) as PublicKeyCredential | null;\n\n if (!credential) {\n throw new Error('Passkey authentication was cancelled or failed');\n }\n\n return formatAuthenticationCredential(credential);\n}\n","import React, { useState, useEffect } from 'react';\nimport { motion } from 'framer-motion';\nimport { Fingerprint, Loader2, ShieldCheck, AlertCircle, RefreshCw } from 'lucide-react';\nimport { t } from '../utils/i18n';\nimport {\n isWebAuthnSupported,\n isPlatformAuthenticatorAvailable,\n authenticateWithPasskey\n} from '../utils/webauthn';\nimport type { PasskeyAuthInitResponse, PasskeyAuthCompleteResponse } from '../types';\n\ninterface PasskeyAuthProps {\n email: string;\n onSuccess: (sessionToken: string, user: PasskeyAuthCompleteResponse['user'], businessToken?: string) => void;\n onError?: (error: string) => void;\n onFallbackToOTP?: () => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst PasskeyAuth: React.FC<PasskeyAuthProps> = ({\n email,\n onSuccess,\n onError,\n onFallbackToOTP,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n const [isSupported, setIsSupported] = useState(true);\n const [autoTriggered, setAutoTriggered] = useState(false);\n\n // Check WebAuthn support on mount\n useEffect(() => {\n const checkSupport = async () => {\n const supported = isWebAuthnSupported();\n const platformAvailable = await isPlatformAuthenticatorAvailable();\n setIsSupported(supported && platformAvailable);\n\n if (!supported || !platformAvailable) {\n setError(t('webauthn_not_supported', language));\n }\n };\n checkSupport();\n }, [language]);\n\n // Auto-trigger passkey auth on mount (better UX)\n useEffect(() => {\n if (isSupported && !autoTriggered && !previewMode) {\n setAutoTriggered(true);\n // Small delay to let the UI render first\n const timer = setTimeout(() => {\n handleAuthenticate();\n }, 500);\n return () => clearTimeout(timer);\n }\n }, [isSupported, autoTriggered, previewMode]);\n\n const handleAuthenticate = async () => {\n if (isLoading) return;\n\n setIsLoading(true);\n setError('');\n\n if (previewMode) {\n // Mock success for preview\n setTimeout(() => {\n setIsLoading(false);\n onSuccess('mock-session-token', {\n user_id: 'mock-user-id',\n email: email,\n tier: 'layer_1'\n });\n }, 1500);\n return;\n }\n\n try {\n // Step 1: Get authentication options from server\n const initResponse = await fetch(`${apiBaseUrl}/api/passkey/auth/begin`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ email })\n });\n\n if (!initResponse.ok) {\n const errorData = await initResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to initialize authentication');\n }\n\n const initData: PasskeyAuthInitResponse = await initResponse.json();\n\n if (!initData.success || !initData.options) {\n throw new Error(initData.error || 'Invalid authentication options');\n }\n\n // Step 2: Trigger WebAuthn authentication\n const credential = await authenticateWithPasskey(initData.options);\n\n // Step 3: Complete authentication with server\n const completeResponse = await fetch(`${apiBaseUrl}/api/passkey/auth/finish`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email,\n credential\n })\n });\n\n if (!completeResponse.ok) {\n const errorData = await completeResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Authentication failed');\n }\n\n const completeData: PasskeyAuthCompleteResponse = await completeResponse.json();\n\n if (completeData.success && completeData.session_token) {\n onSuccess(completeData.session_token, completeData.user, completeData.business_token);\n } else {\n throw new Error(completeData.error || 'Authentication failed');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Authentication failed';\n\n // Handle user cancellation gracefully\n if (message.includes('cancelled') || message.includes('NotAllowedError')) {\n setError(t('passkey_cancelled', language));\n } else {\n setError(message);\n onError?.(message);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"mb-8\">\n <h2 className=\"text-3xl font-extrabold text-main tracking-tight leading-tight\">\n {t('welcome_back', language)}\n </h2>\n <p className=\"text-muted mt-3 text-sm leading-relaxed\">\n {t('passkey_auth_subtitle', language)}\n </p>\n </div>\n\n {/* Email display */}\n <div className=\"mb-6 p-4 dark:bg-white/5 bg-slate-100/50 rounded-2xl\">\n <p className=\"text-xs text-muted mb-1\">{t('signing_in_as', language)}</p>\n <p className=\"text-main font-semibold\">{email}</p>\n </div>\n\n {/* Passkey animation area */}\n <div className=\"flex-1 flex flex-col items-center justify-center py-8\">\n <motion.div\n animate={isLoading ? {\n scale: [1, 1.1, 1],\n opacity: [1, 0.7, 1]\n } : {}}\n transition={{\n duration: 1.5,\n repeat: isLoading ? Infinity : 0,\n ease: \"easeInOut\"\n }}\n className={`w-24 h-24 rounded-full flex items-center justify-center mb-6 ${\n isLoading\n ? 'bg-brand/20 border-2 border-brand'\n : error\n ? 'bg-red-500/10 border-2 border-red-400'\n : 'bg-brand/10 border-2 border-brand/30'\n }`}\n >\n {isLoading ? (\n <Loader2 className=\"w-10 h-10 text-brand animate-spin\" />\n ) : error ? (\n <AlertCircle className=\"w-10 h-10 text-red-400\" />\n ) : (\n <Fingerprint className=\"w-10 h-10 text-brand\" />\n )}\n </motion.div>\n\n <p className=\"text-main font-semibold text-center mb-2\">\n {isLoading\n ? t('authenticating', language)\n : error\n ? t('authentication_failed', language)\n : t('use_passkey', language)\n }\n </p>\n\n {error && (\n <p className=\"text-red-500 text-sm text-center mb-4 max-w-xs\">\n {error}\n </p>\n )}\n\n {!isLoading && (\n <p className=\"text-muted text-sm text-center max-w-xs\">\n {t('passkey_auth_hint', language)}\n </p>\n )}\n </div>\n\n {/* Action buttons */}\n <div className=\"space-y-3 pb-8\">\n {!isLoading && (\n <button\n onClick={handleAuthenticate}\n disabled={!isSupported}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl shadow-xl shadow-brand/30 flex items-center justify-center gap-2 transition-transform active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {error ? (\n <>\n <RefreshCw className=\"w-5 h-5\" />\n <span>{t('try_again', language)}</span>\n </>\n ) : (\n <>\n <Fingerprint className=\"w-5 h-5\" />\n <span>{t('authenticate', language)}</span>\n </>\n )}\n </button>\n )}\n\n {onFallbackToOTP && (\n <button\n onClick={onFallbackToOTP}\n disabled={isLoading}\n className=\"w-full h-12 bg-transparent border dark:border-white/10 border-slate-200 text-muted hover:text-main font-medium rounded-2xl flex items-center justify-center gap-2 transition-colors disabled:opacity-50\"\n >\n {t('use_email_instead', language)}\n </button>\n )}\n </div>\n\n {/* Security badge */}\n <div className=\"flex items-center justify-center gap-2 pb-4 opacity-50\">\n <ShieldCheck className=\"text-muted w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-[0.2em] font-bold text-muted\">\n {t('biometric_secured', language)}\n </span>\n </div>\n </motion.div>\n );\n};\n\nexport default PasskeyAuth;\n","import React, { useState, useEffect } from 'react';\nimport { motion } from 'framer-motion';\nimport { Fingerprint, Loader2, ShieldCheck, AlertCircle, CheckCircle2, Key, Smartphone, Lock } from 'lucide-react';\nimport { t } from '../utils/i18n';\nimport {\n isWebAuthnSupported,\n isPlatformAuthenticatorAvailable,\n createPasskey\n} from '../utils/webauthn';\nimport type { PasskeyRegisterInitResponse, PasskeyRegisterCompleteResponse } from '../types';\n\ninterface PasskeyRegisterProps {\n email: string;\n sessionToken: string;\n onSuccess: (user: PasskeyRegisterCompleteResponse['user'], businessToken?: string) => void;\n onError?: (error: string) => void;\n onSkip?: () => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst PasskeyRegister: React.FC<PasskeyRegisterProps> = ({\n email,\n sessionToken,\n onSuccess,\n onError,\n onSkip,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n const [isSupported, setIsSupported] = useState(true);\n const [isSuccess, setIsSuccess] = useState(false);\n\n // Check WebAuthn support on mount\n useEffect(() => {\n const checkSupport = async () => {\n const supported = isWebAuthnSupported();\n const platformAvailable = await isPlatformAuthenticatorAvailable();\n setIsSupported(supported && platformAvailable);\n\n if (!supported || !platformAvailable) {\n setError(t('webauthn_not_supported', language));\n }\n };\n checkSupport();\n }, [language]);\n\n const handleRegister = async () => {\n if (isLoading) return;\n\n setIsLoading(true);\n setError('');\n\n if (previewMode) {\n // Mock success for preview\n setTimeout(() => {\n setIsLoading(false);\n setIsSuccess(true);\n setTimeout(() => {\n onSuccess({\n user_id: 'mock-user-id',\n email: email,\n tier: 'layer_0'\n });\n }, 1000);\n }, 1500);\n return;\n }\n\n try {\n // Step 1: Get registration options from server\n const initResponse = await fetch(`${apiBaseUrl}/api/passkey/register/begin`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`\n },\n credentials: 'include',\n body: JSON.stringify({ email })\n });\n\n if (!initResponse.ok) {\n const errorData = await initResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to initialize registration');\n }\n\n const initData: PasskeyRegisterInitResponse = await initResponse.json();\n\n if (!initData.success || !initData.options) {\n throw new Error(initData.error || 'Invalid registration options');\n }\n\n // Step 2: Create passkey using WebAuthn\n const credential = await createPasskey(initData.options);\n\n // Step 3: Complete registration with server\n const completeResponse = await fetch(`${apiBaseUrl}/api/passkey/register/finish`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`\n },\n credentials: 'include',\n body: JSON.stringify({\n userId: initData.userId,\n credential,\n deviceInfo: {\n userAgent: navigator.userAgent\n }\n })\n });\n\n if (!completeResponse.ok) {\n const errorData = await completeResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Registration failed');\n }\n\n const completeData: PasskeyRegisterCompleteResponse = await completeResponse.json();\n\n if (completeData.success) {\n setIsSuccess(true);\n // Brief delay to show success state\n setTimeout(() => {\n onSuccess(completeData.user, completeData.business_token);\n }, 1000);\n } else {\n throw new Error(completeData.error || 'Registration failed');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Registration failed';\n\n // Handle user cancellation gracefully\n if (message.includes('cancelled') || message.includes('NotAllowedError')) {\n setError(t('passkey_cancelled', language));\n } else {\n setError(message);\n onError?.(message);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const benefits = [\n { icon: Key, text: t('passkey_benefit_1', language) },\n { icon: ShieldCheck, text: t('passkey_benefit_2', language) },\n { icon: Smartphone, text: t('passkey_benefit_3', language) }\n ];\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"mb-8\">\n <h2 className=\"text-3xl font-extrabold text-main tracking-tight leading-tight\">\n {t('create_passkey', language)}\n </h2>\n <p className=\"text-muted mt-3 text-sm leading-relaxed\">\n {t('passkey_register_subtitle', language)}\n </p>\n </div>\n\n {/* Email display */}\n <div className=\"mb-6 p-4 dark:bg-white/5 bg-slate-100/50 rounded-2xl\">\n <p className=\"text-xs text-muted mb-1\">{t('signing_in_as', language)}</p>\n <p className=\"text-main font-semibold\">{email}</p>\n </div>\n\n {/* Benefits list */}\n <div className=\"mb-8\">\n <p className=\"text-sm font-semibold text-main mb-4\">{t('passkey_benefits_title', language)}</p>\n <div className=\"space-y-3\">\n {benefits.map((benefit, index) => (\n <div key={index} className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-xl bg-brand/10 flex items-center justify-center\">\n <benefit.icon className=\"w-5 h-5 text-brand\" />\n </div>\n <span className=\"text-sm text-muted\">{benefit.text}</span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Status indicator */}\n {(isLoading || isSuccess || error) && (\n <div className=\"flex-1 flex flex-col items-center justify-center py-4\">\n <motion.div\n animate={isLoading ? {\n scale: [1, 1.1, 1],\n opacity: [1, 0.7, 1]\n } : {}}\n transition={{\n duration: 1.5,\n repeat: isLoading ? Infinity : 0,\n ease: \"easeInOut\"\n }}\n className={`w-20 h-20 rounded-full flex items-center justify-center mb-4 ${\n isSuccess\n ? 'bg-green-500/20 border-2 border-green-400'\n : isLoading\n ? 'bg-brand/20 border-2 border-brand'\n : 'bg-red-500/10 border-2 border-red-400'\n }`}\n >\n {isSuccess ? (\n <CheckCircle2 className=\"w-10 h-10 text-green-400\" />\n ) : isLoading ? (\n <Loader2 className=\"w-10 h-10 text-brand animate-spin\" />\n ) : (\n <AlertCircle className=\"w-10 h-10 text-red-400\" />\n )}\n </motion.div>\n\n <p className=\"text-main font-semibold text-center\">\n {isSuccess\n ? t('passkey_created', language)\n : isLoading\n ? t('creating_passkey', language)\n : t('passkey_create_failed', language)\n }\n </p>\n\n {error && (\n <p className=\"text-red-500 text-sm text-center mt-2 max-w-xs\">\n {error}\n </p>\n )}\n </div>\n )}\n\n {/* Action buttons */}\n <div className=\"mt-auto space-y-3 pb-8\">\n {!isSuccess && (\n <button\n onClick={handleRegister}\n disabled={!isSupported || isLoading}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl shadow-xl shadow-brand/30 flex items-center justify-center gap-2 transition-transform active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span>{t('creating_passkey', language)}</span>\n </>\n ) : (\n <>\n <Fingerprint className=\"w-5 h-5\" />\n <span>{t('register_passkey', language)}</span>\n </>\n )}\n </button>\n )}\n\n {onSkip && !isLoading && !isSuccess && (\n <button\n onClick={onSkip}\n className=\"w-full h-12 bg-transparent border dark:border-white/10 border-slate-200 text-muted hover:text-main font-medium rounded-2xl flex items-center justify-center transition-colors\"\n >\n {t('do_this_later', language)}\n </button>\n )}\n </div>\n\n {/* Security badge */}\n <div className=\"flex items-center justify-center gap-2 pb-4 opacity-50\">\n <Lock className=\"text-muted w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-[0.2em] font-bold text-muted\">\n {t('e2e_encrypted', language)}\n </span>\n </div>\n </motion.div>\n );\n};\n\nexport default PasskeyRegister;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { motion } from 'framer-motion';\nimport { Delete, ArrowRight, Loader2, RefreshCw } from 'lucide-react';\nimport type { VerifyOTPResponse } from '../types';\nimport { t } from '../utils/i18n';\n\ninterface UserAccountInfo {\n user_id: string;\n wallet?: string;\n tier?: string;\n did_address?: string;\n}\n\ninterface PinVerificationProps {\n email: string;\n verificationId: string;\n onNext: (sessionToken: string, userAccount?: UserAccountInfo | null, businessToken?: string) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst PinVerification: React.FC<PinVerificationProps> = ({\n email,\n verificationId,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey,\n previewMode = false,\n language = 'EN'\n}) => {\n const [pin, setPin] = useState<string[]>(['', '', '', '', '', '']);\n const [isVerifying, setIsVerifying] = useState(false);\n const [isResending, setIsResending] = useState(false);\n const [error, setError] = useState('');\n const [resendCooldown, setResendCooldown] = useState(0);\n const [currentVerificationId, setCurrentVerificationId] = useState(verificationId);\n\n // Cooldown timer for resend\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n // Auto-verify when all digits are entered\n useEffect(() => {\n if (pin.every(digit => digit !== '') && !isVerifying) {\n handleVerify();\n }\n }, [pin]);\n\n const handleDigitPress = useCallback((digit: string) => {\n setError('');\n setPin(prev => {\n const newPin = [...prev];\n const emptyIndex = newPin.findIndex(d => d === '');\n if (emptyIndex !== -1) {\n newPin[emptyIndex] = digit;\n }\n return newPin;\n });\n }, []);\n\n const handleDelete = useCallback(() => {\n setError('');\n setPin(prev => {\n const newPin = [...prev];\n // Find last filled digit\n for (let i = newPin.length - 1; i >= 0; i--) {\n if (newPin[i] !== '') {\n newPin[i] = '';\n break;\n }\n }\n return newPin;\n });\n }, []);\n\n // Keyboard input support\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isVerifying) return;\n\n // Handle number keys (both main keyboard and numpad)\n if (/^[0-9]$/.test(e.key)) {\n e.preventDefault();\n handleDigitPress(e.key);\n }\n // Handle backspace/delete\n else if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n handleDelete();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isVerifying, handleDigitPress, handleDelete]);\n\n const handleVerify = async () => {\n const otp = pin.join('');\n if (otp.length !== 6) {\n setError(t('error_pin_incomplete', language));\n return;\n }\n\n setIsVerifying(true);\n setError('');\n\n if (previewMode) {\n setTimeout(() => {\n setIsVerifying(false);\n onNext('mock-session-token', null);\n }, 1000);\n return;\n }\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/auth/verify-otp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-ID': apiKey || ''\n },\n body: JSON.stringify({\n verificationId: currentVerificationId,\n otp\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Verification failed with status ${response.status}`);\n }\n\n const data: VerifyOTPResponse = await response.json();\n\n if (data.success && data.sessionToken) {\n onNext(data.sessionToken, data.userAccount, data.business_token);\n } else {\n setError(data.error || t('invalid_code', language));\n if (data.attemptsLeft !== undefined) {\n setError(t('invalid_code_attempts', language).replace('{attempts}', data.attemptsLeft.toString()));\n }\n // Clear pin on error\n setPin(['', '', '', '', '', '']);\n onError?.(data.error || t('verification_failed', language));\n }\n } catch (err) {\n const errorMessage = t('error_verify_failed', language);\n setError(errorMessage);\n setPin(['', '', '', '', '', '']);\n onError?.(errorMessage);\n } finally {\n setIsVerifying(false);\n }\n };\n\n const handleResend = async () => {\n if (resendCooldown > 0 || isResending) return;\n\n setIsResending(true);\n setError('');\n\n if (previewMode) {\n setTimeout(() => {\n setIsResending(false);\n setResendCooldown(60);\n setPin(['', '', '', '', '', '']);\n }, 800);\n return;\n }\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/auth/resend-otp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ verificationId: currentVerificationId }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data.success) {\n setResendCooldown(60); // 60 second cooldown\n setPin(['', '', '', '', '', '']);\n // Note: verificationId stays the same for resend\n } else {\n setError(data.error || t('error_resend_failed', language));\n }\n } catch (err) {\n setError(t('error_resend_failed', language));\n } finally {\n setIsResending(false);\n }\n };\n\n // Mask email for display\n const maskedEmail = email.replace(/(.{2})(.*)(@.*)/, '$1***$3');\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 1.05 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"space-y-2 mb-8\">\n <h1 className=\"text-3xl font-bold tracking-tight text-main\">{t('verify_email', language)}</h1>\n <p className=\"text-muted text-sm font-medium\">\n {t('enter_code', language)} <span className=\"text-main font-semibold\">{maskedEmail}</span>\n </p>\n </div>\n\n {/* PIN Display */}\n <div className=\"flex justify-between gap-2 mb-6\">\n {pin.map((digit, i) => (\n <div\n key={i}\n className={`size-12 rounded-2xl dark:bg-black/20 bg-slate-100/50 flex items-center justify-center text-xl font-bold border transition-all ${digit\n ? 'text-brand dark:border-brand-30 border-brand-50'\n : 'text-muted dark:border-white/10 border-slate-200'\n } ${error ? 'border-red-400 dark:border-red-500' : ''}`}\n >\n {digit}\n {!digit && pin.findIndex(d => d === '') === i && (\n <div className=\"w-0.5 h-6 bg-brand animate-pulse\" />\n )}\n </div>\n ))}\n </div>\n\n {/* Error Message */}\n {error && (\n <p className=\"text-red-500 text-xs font-medium text-center mb-4\">{error}</p>\n )}\n\n {/* Number Pad */}\n <div className=\"grid grid-cols-3 gap-4 mb-8\">\n {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => (\n <button\n key={num}\n onClick={() => handleDigitPress(num.toString())}\n disabled={isVerifying}\n className=\"h-14 rounded-2xl dark:hover:bg-white/5 hover:bg-slate-100 flex items-center justify-center text-xl font-bold transition-colors text-main disabled:opacity-50\"\n >\n {num}\n </button>\n ))}\n <div className=\"h-14\" />\n <button\n onClick={() => handleDigitPress('0')}\n disabled={isVerifying}\n className=\"h-14 rounded-2xl dark:hover:bg-white/5 hover:bg-slate-100 flex items-center justify-center text-xl font-bold transition-colors text-main disabled:opacity-50\"\n >\n 0\n </button>\n <button\n onClick={handleDelete}\n disabled={isVerifying}\n className=\"h-14 rounded-2xl dark:hover:bg-white/5 hover:bg-slate-100 flex items-center justify-center transition-colors text-main disabled:opacity-50\"\n >\n <Delete className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Action Buttons */}\n <div className=\"mt-auto pb-8 space-y-4\">\n <button\n onClick={handleVerify}\n disabled={isVerifying || pin.some(d => d === '')}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl transition-all shadow-lg shadow-brand flex items-center justify-center gap-2 group disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isVerifying ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span>{t('verifying', language)}</span>\n </>\n ) : (\n <>\n <span>{t('verify', language)}</span>\n <ArrowRight className=\"w-5 h-5 group-hover:translate-x-1 transition-transform\" />\n </>\n )}\n </button>\n <button\n onClick={handleResend}\n disabled={resendCooldown > 0 || isResending}\n className=\"w-full h-14 dark:bg-white/5 hover:dark:bg-white/10 bg-slate-100 hover:bg-slate-200 text-muted font-bold rounded-2xl transition-all border dark:border-white/10 border-slate-200 flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isResending ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n <span>{t('sending', language)}</span>\n </>\n ) : resendCooldown > 0 ? (\n <span>{t('resend_code', language)} ({resendCooldown}s)</span>\n ) : (\n <>\n <RefreshCw className=\"w-4 h-4\" />\n <span>{t('resend_code', language)}</span>\n </>\n )}\n </button>\n </div>\n </motion.div>\n );\n};\n\nexport default PinVerification;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { Verified, RefreshCw } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface SecurityUpgradeProps {\n onNext: () => void;\n onSkip?: () => void;\n language?: string;\n}\n\nconst SecurityUpgrade: React.FC<SecurityUpgradeProps> = ({ onNext, onSkip, language = 'EN' }) => (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col\"\n >\n <div className=\"p-6 pb-2\">\n <div className=\"flex justify-between items-center mb-4\">\n <span className=\"text-xs font-semibold uppercase tracking-widest text-brand/80\">\n {t('verification_step', language)}\n </span>\n <span className=\"text-xs font-bold text-muted\">{t('kyc_required', language)}</span>\n </div>\n <div className=\"w-full bg-brand/10 h-1.5 rounded-full overflow-hidden\">\n <div\n className=\"bg-brand h-full rounded-full\"\n style={{ width: '40%' }}\n />\n </div>\n </div>\n\n <div className=\"flex-1 flex flex-col items-center justify-center px-8 text-center gap-8\">\n <div className=\"relative group\">\n <div className=\"absolute inset-0 bg-cyan-400/20 blur-3xl rounded-full scale-75 group-hover:scale-100 transition-transform duration-500\" />\n <div className=\"relative w-32 h-32 rounded-full bg-gradient-to-tr from-brand-20 to-brand-5 flex items-center justify-center border border-brand-30 shadow-inner\">\n <Verified className=\"w-16 h-16 text-brand\" />\n </div>\n <div className=\"absolute bottom-1 right-1 w-8 h-8 rounded-full dark:bg-[#171220] bg-white border-2 border-brand flex items-center justify-center\">\n <RefreshCw className=\"w-4 h-4 text-brand\" />\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <h1 className=\"text-2xl font-bold tracking-tight text-main leading-tight\">\n {t('security_upgrade_required', language)}\n </h1>\n <p className=\"text-muted text-base leading-relaxed font-medium\">\n {t('security_upgrade_desc', language)}\n </p>\n </div>\n\n <div className=\"flex flex-wrap justify-center gap-2\">\n <span className=\"px-3 py-1 bg-brand/10 rounded-xl text-[10px] font-bold text-brand uppercase tracking-tighter border border-brand-10\">\n {t('biometric_secure', language)}\n </span>\n <span className=\"px-3 py-1 bg-cyan-400/10 rounded-xl text-[10px] font-bold text-cyan-500 uppercase tracking-tighter border border-cyan-400/10\">\n {t('zero_knowledge', language)}\n </span>\n </div>\n </div>\n\n <div className=\"p-8 space-y-4\">\n <button\n onClick={onNext}\n className=\"w-full bg-brand hover:bg-brand/90 text-white rounded-2xl py-4 font-bold text-lg shadow-xl shadow-brand transition-all active:scale-[0.98]\"\n >\n {t('start_upgrade', language)}\n </button>\n {onSkip && (\n <button\n onClick={onSkip}\n className=\"w-full dark:text-slate-400 text-slate-500 text-sm font-bold dark:hover:text-slate-200 hover:text-slate-800 transition-colors\"\n >\n {t('do_this_later', language)}\n </button>\n )}\n </div>\n </motion.div>\n);\n\nexport default SecurityUpgrade;\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Lock, Camera, AlertCircle, Loader2 } from 'lucide-react';\nimport type { LivenessResponse } from '../types';\n\nimport { t } from '../utils/i18n';\n\ninterface FaceScanProps {\n requestId: string;\n onNext: (livenessVerified: boolean) => Promise<void>;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst instructions = [\n 'position_face',\n 'blink_slowly',\n 'turn_head_left',\n 'turn_head_right',\n 'processing',\n];\n\nconst FaceScan: React.FC<FaceScanProps> = ({\n requestId,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const framesRef = useRef<Blob[]>([]);\n\n const [step, setStep] = useState(0);\n const [cameraReady, setCameraReady] = useState(false);\n const [error, setError] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [cameraPermissionDenied, setCameraPermissionDenied] = useState(false);\n\n // Initialize camera\n useEffect(() => {\n const initCamera = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: 'user', width: 640, height: 480 }\n });\n streamRef.current = stream;\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.onloadedmetadata = () => {\n setCameraReady(true);\n };\n }\n } catch (err: any) {\n if (err.name === 'NotAllowedError') {\n setCameraPermissionDenied(true);\n setError(t('camera_permission_denied', language));\n } else {\n setError(t('unable_access_camera', language));\n }\n onError?.('Camera access failed');\n }\n };\n\n initCamera();\n\n return () => {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n };\n }, [onError]);\n\n // Capture frame from video\n const captureFrame = useCallback((): Blob | null => {\n if (!videoRef.current || !canvasRef.current) return null;\n\n const canvas = canvasRef.current;\n const video = videoRef.current;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) return null;\n\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n ctx.drawImage(video, 0, 0);\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob), 'image/jpeg', 0.8);\n }) as unknown as Blob;\n }, []);\n\n // Progress through instructions and capture frames\n useEffect(() => {\n if (!cameraReady || isProcessing) return;\n\n const captureAndAdvance = async () => {\n // Capture frame at each step\n const frame = await new Promise<Blob | null>((resolve) => {\n if (!videoRef.current || !canvasRef.current) {\n resolve(null);\n return;\n }\n const canvas = canvasRef.current;\n const video = videoRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n resolve(null);\n return;\n }\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n ctx.drawImage(video, 0, 0);\n canvas.toBlob((blob) => resolve(blob), 'image/jpeg', 0.8);\n });\n\n if (frame) {\n framesRef.current.push(frame);\n }\n\n if (step < instructions.length - 1) {\n setStep(prev => prev + 1);\n } else {\n // Last step - submit for verification\n submitLiveness();\n }\n };\n\n const timer = setTimeout(captureAndAdvance, 2500);\n return () => clearTimeout(timer);\n }, [step, cameraReady, isProcessing]);\n\n // Submit liveness check\n const submitLiveness = async () => {\n setIsProcessing(true);\n setStep(4); // \"Processing...\"\n\n if (previewMode) {\n setTimeout(() => {\n setIsProcessing(false);\n onNext(true);\n }, 2000);\n return;\n }\n\n try {\n const formData = new FormData();\n formData.append('requestId', requestId);\n\n // Add captured frames\n framesRef.current.forEach((frame, index) => {\n formData.append('imageFrames', frame, `frame_${index}.jpg`);\n });\n\n formData.append('metadata', JSON.stringify({\n capturedAt: new Date().toISOString(),\n frameCount: framesRef.current.length,\n instructions: instructions.slice(0, -1)\n }));\n\n const response = await fetch(`${apiBaseUrl}/api/v2/verification/liveness`, {\n method: 'POST',\n body: formData,\n credentials: 'include'\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Liveness check failed with status ${response.status}`);\n }\n\n const data: LivenessResponse = await response.json();\n\n if (data.success && data.liveness?.passed) {\n // Stop camera\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n onNext(true);\n } else {\n setError(data.error || 'Liveness check failed. Please try again.');\n // Reset for retry\n setStep(0);\n framesRef.current = [];\n setIsProcessing(false);\n }\n } catch (err) {\n setError('Verification failed. Please try again.');\n setStep(0);\n framesRef.current = [];\n setIsProcessing(false);\n onError?.('Liveness submission failed');\n }\n };\n\n // Retry handler\n const handleRetry = () => {\n setError('');\n setStep(0);\n framesRef.current = [];\n setIsProcessing(false);\n };\n\n if (cameraPermissionDenied) {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"flex-1 flex flex-col items-center justify-center px-8 text-center\"\n >\n <AlertCircle className=\"w-16 h-16 text-red-500 mb-6\" />\n <h2 className=\"text-xl font-bold text-main mb-3\">Camera Access Required</h2>\n <p className=\"text-muted text-sm mb-6\">\n Please enable camera access in your browser settings to continue with face verification.\n </p>\n <button\n onClick={() => window.location.reload()}\n className=\"px-6 py-3 bg-brand text-white rounded-2xl font-bold\"\n >\n Try Again\n </button>\n </motion.div >\n );\n }\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col relative dark:bg-[#050a0a] bg-slate-50 overflow-hidden\"\n >\n {/* Hidden canvas for frame capture */}\n <canvas ref={canvasRef} className=\"hidden\" />\n\n {/* Ambient glow */}\n <div className=\"absolute inset-0 z-0\">\n <div className=\"w-full h-full opacity-20 bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-[#6fe8ec]/30 via-transparent to-transparent\" />\n </div>\n\n {/* Top badge */}\n <div className=\"relative z-40 pt-12 pb-4 flex items-center justify-center\">\n <div className=\"flex items-center gap-2 px-4 py-1.5 dark:bg-black/40 bg-white/40 backdrop-blur-md rounded-xl border dark:border-white/5 border-black/5\">\n <div className={`w-2 h-2 rounded-full ${cameraReady ? 'bg-[#6fe8ec] shadow-[0_0_8px_#6fe8ec]' : 'bg-yellow-500 animate-pulse'}`} />\n <span className=\"text-[10px] text-muted uppercase tracking-[0.2em] font-bold\">\n {cameraReady ? t('live_camera', language) : t('initializing', language)}\n </span>\n </div>\n </div>\n\n {/* Scan area with video */}\n <div className=\"relative z-20 flex-1 flex items-center justify-center\">\n {/* Frosted mask with oval hole */}\n <div\n className=\"absolute inset-0 z-10 dark:bg-[#050a0a]/80 bg-white/80 backdrop-blur-[2px]\"\n style={{\n mask: 'radial-gradient(ellipse 100px 145px at center, transparent 99%, black 100%)',\n WebkitMask: 'radial-gradient(ellipse 100px 145px at center, transparent 99%, black 100%)',\n }}\n />\n\n <div className=\"relative z-30 flex items-center justify-center\">\n {/* Oval biometric frame with video */}\n <div className=\"w-[200px] h-[290px] flex-shrink-0 rounded-full border-[3px] border-[#6fe8ec] shadow-[0_0_40px_rgba(111,232,236,0.4),inset_0_0_20px_rgba(111,232,236,0.2)] relative overflow-hidden\">\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"absolute inset-0 w-full h-full object-cover scale-x-[-1]\"\n />\n <motion.div\n animate={{ opacity: [0.4, 1, 0.4] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute inset-0 rounded-full border-[1px] border-white/30\"\n />\n <motion.div\n animate={{ top: ['-10%', '110%'] }}\n transition={{ duration: 3, repeat: Infinity, ease: 'easeInOut' }}\n className=\"absolute left-0 w-full h-[3px] bg-gradient-to-r from-transparent via-[#6fe8ec] to-transparent shadow-[0_0_20px_#6fe8ec] z-10\"\n />\n </div>\n\n {/* Corner brackets */}\n <div className=\"absolute w-[280px] h-[380px] pointer-events-none flex items-center justify-center\">\n <div className=\"absolute top-0 left-0 w-10 h-10 border-t-2 border-l-2 border-[#6fe8ec]/30 rounded-tl-2xl\" />\n <div className=\"absolute top-0 right-0 w-10 h-10 border-t-2 border-r-2 border-[#6fe8ec]/30 rounded-tr-2xl\" />\n <div className=\"absolute bottom-0 left-0 w-10 h-10 border-b-2 border-l-2 border-[#6fe8ec]/30 rounded-bl-2xl\" />\n <div className=\"absolute bottom-0 right-0 w-10 h-10 border-b-2 border-r-2 border-[#6fe8ec]/30 rounded-br-2xl\" />\n </div>\n </div>\n </div>\n\n {/* Instruction card */}\n <footer className=\"relative z-40 p-8 flex flex-col items-center gap-6\">\n {error ? (\n <div className=\"dark:bg-red-900/30 bg-red-50 backdrop-blur-2xl border border-red-500/30 w-full p-6 rounded-[2.5rem] text-center\">\n <p className=\"text-red-500 font-bold text-lg mb-4\">{error}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-2 bg-red-500 text-white rounded-xl font-bold\"\n >\n Try Again\n </button>\n </div>\n ) : (\n <div className=\"dark:bg-[#0a1515]/95 bg-white/90 backdrop-blur-2xl border dark:border-white/10 border-black/5 w-full p-6 rounded-2xl text-center shadow-2xl\">\n <AnimatePresence mode=\"wait\">\n <motion.p\n key={step}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className=\"text-[#6fe8ec] font-bold text-2xl tracking-tight mb-2\"\n >\n {isProcessing ? (\n <span className=\"flex items-center justify-center gap-3\">\n <Loader2 className=\"w-6 h-6 animate-spin\" />\n Verifying...\n </span>\n ) : (\n t(instructions[step], language)\n )}\n </motion.p>\n </AnimatePresence>\n <div className=\"flex items-center justify-center gap-2 text-muted text-[10px] font-bold uppercase tracking-widest\">\n <Lock className=\"w-3 h-3\" />\n {t('secure_face_scan_desc', language)}\n </div>\n </div>\n )}\n\n {/* Progress dots */}\n <div className=\"flex gap-2 w-full max-w-[140px]\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`h-1.5 flex-1 rounded-full transition-all duration-700 ${i <= Math.floor((step / (instructions.length - 1)) * 2)\n ? 'bg-[#6fe8ec] shadow-[0_0_15px_#6fe8ec]'\n : 'dark:bg-slate-800 bg-slate-200'\n }`}\n />\n ))}\n </div>\n\n <div className=\"px-6 py-2.5 dark:bg-black/60 bg-white/60 backdrop-blur-md rounded-xl border dark:border-white/5 border-black/5 flex items-center gap-3\">\n <div\n className={`w-2 h-2 rounded-full ${isProcessing\n ? 'bg-yellow-400 animate-pulse'\n : step === instructions.length - 1\n ? 'bg-emerald-400 shadow-[0_0_10px_#34d399]'\n : 'bg-[#6fe8ec] animate-pulse'\n }`}\n />\n <span className=\"text-[10px] dark:text-slate-400 text-slate-600 uppercase tracking-[0.25em] font-black\">\n {isProcessing ? t('analyzing_liveness', language) : step === instructions.length - 1 ? t('calibration_complete', language) : t('awaiting_calibration', language)}\n </span>\n </div>\n </footer>\n </motion.div>\n );\n};\n\nexport default FaceScan;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { Globe, CreditCard, Smartphone, ShieldCheck, ChevronRight } from 'lucide-react';\nimport type { DocumentType } from '../types';\nimport { t } from '../utils/i18n';\n\ninterface VerifyIdentityChoiceProps {\n onNext: (documentType: DocumentType) => void;\n language?: string;\n}\n\nconst docs: { id: DocumentType; title: string; desc: string; Icon: React.FC<any> }[] = [\n { id: 'passport', title: 'Passport', desc: 'All countries supported', Icon: Globe },\n { id: 'drivers_license', title: 'Driver License', desc: 'Government issued card', Icon: CreditCard },\n { id: 'national_id', title: 'ID Card', desc: 'National identity document', Icon: Smartphone },\n];\n\nconst VerifyIdentityChoice: React.FC<VerifyIdentityChoiceProps> = ({ onNext, language = 'EN' }) => (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 px-6 pt-4 flex flex-col\"\n >\n <h3 className=\"text-2xl font-bold mb-2 text-main\">{t('verify_identity', language)}</h3>\n <p className=\"text-muted text-sm mb-8 leading-relaxed\">\n {t('choose_document', language)}\n </p>\n\n <div className=\"space-y-4 overflow-y-auto pr-1 pb-6\">\n {docs.map(({ id, title, desc, Icon }) => (\n <button\n key={id}\n onClick={() => onNext(id)}\n className=\"w-full group cursor-pointer dark:bg-white/5 bg-slate-100/50 border dark:border-white/10 border-slate-200 rounded-2xl p-5 flex items-center gap-4 hover:dark:bg-brand/15 hover:bg-brand/5 hover:dark:border-brand-40 hover:border-brand-30 transition-all transform hover:-translate-y-1\"\n >\n <div className=\"w-14 h-14 rounded-xl dark:bg-slate-800/50 bg-white flex items-center justify-center text-brand group-hover:bg-brand/20 transition-colors border dark:border-transparent border-slate-100\">\n <Icon className=\"w-8 h-8\" />\n </div>\n <div className=\"flex-1 text-left\">\n <h4 className=\"font-bold text-base text-main\">{t(id, language)}</h4>\n <p className=\"text-xs text-muted font-medium\">{t(`${id}_desc`, language)}</p>\n </div>\n <ChevronRight className=\"text-brand w-5 h-5\" />\n </button>\n ))}\n\n <div className=\"mt-8 relative h-32 w-full rounded-2xl overflow-hidden dark:bg-white/5 bg-slate-100/30 flex items-center justify-center border border-dashed dark:border-brand-30 border-brand-40\">\n <div className=\"absolute inset-0 opacity-10 bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-brand via-transparent to-transparent\" />\n <div className=\"text-center z-10\">\n <ShieldCheck className=\"text-brand/40 w-10 h-10 mx-auto mb-1\" />\n <p className=\"text-[10px] text-muted uppercase tracking-tighter font-bold\">Encrypted E2E</p>\n </div>\n </div>\n </div>\n </motion.div>\n);\n\nexport default VerifyIdentityChoice;\n","import React, { useRef, useState, useEffect } from 'react';\nimport { motion } from 'framer-motion';\nimport { Camera, HelpCircle, Flashlight, Loader2, AlertCircle, RotateCcw } from 'lucide-react';\nimport type { DocumentType, DocumentUploadResponse, ExtractedDocumentData } from '../types';\n\nimport { t } from '../utils/i18n';\n\ninterface DocumentScanProps {\n requestId: string;\n documentType: DocumentType;\n onNext: (extractedData: ExtractedDocumentData, docUploadId: string) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst getDocumentTypeLabels = (language: string) => ({\n passport: t('passport', language),\n drivers_license: t('drivers_license', language),\n national_id: t('national_id', language)\n});\n\nconst DocumentScan: React.FC<DocumentScanProps> = ({\n requestId,\n documentType,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const streamRef = useRef<MediaStream | null>(null);\n\n const [cameraReady, setCameraReady] = useState(false);\n const [capturedImage, setCapturedImage] = useState<Blob | null>(null);\n const [capturedImageUrl, setCapturedImageUrl] = useState<string | null>(null);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState('');\n const [scanSide, setScanSide] = useState<'front' | 'back'>('front');\n const [frontImage, setFrontImage] = useState<Blob | null>(null);\n\n // Initialize camera\n useEffect(() => {\n const initCamera = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n facingMode: 'environment', // Use back camera for documents\n width: { ideal: 1280 },\n height: { ideal: 720 }\n }\n });\n streamRef.current = stream;\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.onloadedmetadata = () => {\n setCameraReady(true);\n };\n }\n } catch (err: any) {\n // Fallback to front camera\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: 'user', width: { ideal: 1280 }, height: { ideal: 720 } }\n });\n streamRef.current = stream;\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.onloadedmetadata = () => {\n setCameraReady(true);\n };\n }\n } catch (fallbackErr) {\n setError(t('unable_access_camera', language));\n onError?.('Camera access failed');\n }\n }\n };\n\n initCamera();\n\n return () => {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n if (capturedImageUrl) {\n URL.revokeObjectURL(capturedImageUrl);\n }\n };\n }, [onError]);\n\n // Capture photo\n const handleCapture = async () => {\n if (!videoRef.current || !canvasRef.current) return;\n\n const canvas = canvasRef.current;\n const video = videoRef.current;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) return;\n\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n ctx.drawImage(video, 0, 0);\n\n canvas.toBlob((blob) => {\n if (blob) {\n setCapturedImage(blob);\n setCapturedImageUrl(URL.createObjectURL(blob));\n }\n }, 'image/jpeg', 0.9);\n };\n\n // Retake photo\n const handleRetake = () => {\n if (capturedImageUrl) {\n URL.revokeObjectURL(capturedImageUrl);\n }\n setCapturedImage(null);\n setCapturedImageUrl(null);\n setError('');\n };\n\n // Confirm and proceed\n const handleConfirm = async () => {\n setIsUploading(true);\n\n if (previewMode) {\n setTimeout(() => {\n setIsUploading(false);\n onNext({\n first_name: 'JOHN',\n last_name: 'DOE',\n date_of_birth: '01 JAN 1990',\n nationality: 'Nigerian'\n }, 'mock-upload-id-789');\n }, 2000);\n return;\n }\n\n if (!capturedImage) {\n setIsUploading(false); // Ensure loading state is reset if no image\n return;\n }\n\n if (scanSide === 'front' && documentType !== 'passport') {\n // For non-passport documents, need back side too\n setFrontImage(capturedImage);\n setCapturedImage(null);\n setCapturedImageUrl(null);\n setScanSide('back');\n setIsUploading(false); // Reset loading state after setting side\n return;\n }\n\n // Upload document(s)\n setIsUploading(true);\n setError('');\n\n try {\n const formData = new FormData();\n formData.append('document_type', documentType);\n\n if (frontImage) {\n formData.append('front_image', frontImage, 'front.jpg');\n formData.append('back_image', capturedImage, 'back.jpg');\n } else {\n formData.append('front_image', capturedImage, 'document.jpg');\n }\n\n const response = await fetch(`${apiBaseUrl}/api/v2/verification/layer3/documents/upload`, {\n method: 'POST',\n body: formData,\n credentials: 'include',\n headers: {\n 'X-Request-Id': requestId\n }\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Document upload failed with status ${response.status}`);\n }\n\n const data: DocumentUploadResponse = await response.json();\n\n if (data.success && data.extracted_data) {\n // Stop camera\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n onNext(data.extracted_data, data.upload_id || '');\n } else {\n setError(data.error || 'Failed to process document. Please try again.');\n setIsUploading(false);\n }\n } catch (err) {\n setError('Upload failed. Please try again.');\n setIsUploading(false);\n onError?.('Document upload failed');\n }\n };\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col relative\"\n >\n {/* Hidden canvas for capture */}\n <canvas ref={canvasRef} className=\"hidden\" />\n\n {/* Simulated dark camera background */}\n <div className=\"absolute inset-0 z-0\">\n <div className=\"w-full h-full bg-slate-800 flex items-center justify-center\">\n <div className=\"w-full h-full opacity-30 bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-[#6DE8EC]/20 via-transparent to-transparent\" />\n </div>\n <div className=\"absolute inset-0 bg-black/30 backdrop-blur-[2px]\" />\n </div>\n\n {/* Top label */}\n <div className=\"relative z-10 p-6 flex flex-col items-center\">\n <div className=\"text-center px-4 py-2 dark:bg-black/40 bg-white/40 backdrop-blur-xl rounded-full border dark:border-white/10 border-black/5\">\n <h3 className=\"text-main text-sm font-medium tracking-wide uppercase\">\n {t('scan_instruction', language)\n .replace('{side}', t(scanSide, language))\n .replace('{docType}', getDocumentTypeLabels(language)[documentType])}\n </h3>\n </div>\n </div>\n\n {/* ID frame with video or captured image */}\n <div className=\"relative z-10 flex-1 flex items-center justify-center px-6\">\n <div className=\"w-full aspect-[1.58/1] relative\">\n {/* Video or captured image */}\n {capturedImageUrl ? (\n <img\n src={capturedImageUrl}\n alt=\"Captured document\"\n className=\"absolute inset-0 w-full h-full object-cover rounded-2xl\"\n />\n ) : (\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"absolute inset-0 w-full h-full object-cover rounded-2xl\"\n />\n )}\n\n {/* Frame overlay */}\n <div className=\"absolute inset-0 border border-[#6DE8EC] rounded-2xl shadow-[0_0_20px_rgba(109,232,236,0.3),inset_0_0_15px_rgba(109,232,236,0.2)]\" />\n <div className=\"absolute top-0 left-0 w-8 h-8 border-t-4 border-l-4 border-[#6DE8EC] rounded-tl-2xl\" />\n <div className=\"absolute top-0 right-0 w-8 h-8 border-t-4 border-r-4 border-[#6DE8EC] rounded-tr-2xl\" />\n <div className=\"absolute bottom-0 left-0 w-8 h-8 border-b-4 border-l-4 border-[#6DE8EC] rounded-bl-2xl\" />\n <div className=\"absolute bottom-0 right-0 w-8 h-8 border-b-4 border-r-4 border-[#6DE8EC] rounded-br-2xl\" />\n\n {/* Scanning line (only when video is active) */}\n {!capturedImageUrl && cameraReady && (\n <motion.div\n animate={{ top: ['0%', '100%', '0%'] }}\n transition={{ duration: 4, repeat: Infinity, ease: 'linear' }}\n className=\"absolute left-0 w-full h-[2px] bg-gradient-to-r from-transparent via-[#6DE8EC] to-transparent opacity-50\"\n />\n )}\n\n {/* Loading overlay */}\n {!cameraReady && !capturedImageUrl && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 rounded-2xl\">\n <Loader2 className=\"w-8 h-8 text-[#6DE8EC] animate-spin\" />\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"relative z-10 mx-6 mb-4 p-4 bg-red-500/20 border border-red-500/30 rounded-xl flex items-center gap-3\">\n <AlertCircle className=\"w-5 h-5 text-red-500 shrink-0\" />\n <p className=\"text-red-400 text-sm font-medium\">{error}</p>\n </div>\n )}\n\n {/* Bottom controls */}\n <div className=\"relative z-10 p-8 dark:bg-black/60 bg-white/60 backdrop-blur-2xl border-t dark:border-white/10 border-black/5 rounded-t-3xl\">\n <p className=\"text-muted text-xs text-center mb-6 font-medium\">\n {capturedImageUrl\n ? t('review_capture', language)\n : t('align_document', language)}\n </p>\n\n <div className=\"flex items-center justify-between gap-4\">\n {capturedImageUrl ? (\n <>\n <button\n onClick={handleRetake}\n disabled={isUploading}\n className=\"w-12 h-12 rounded-xl dark:bg-white/5 bg-black/5 flex items-center justify-center text-muted disabled:opacity-50\"\n >\n <RotateCcw className=\"w-6 h-6\" />\n </button>\n <button\n onClick={handleConfirm}\n disabled={isUploading}\n className=\"flex-1 bg-brand hover:bg-brand/90 text-white h-14 rounded-2xl flex items-center justify-center gap-2 font-bold text-lg transition-all active:scale-95 shadow-[0_0_25px_rgba(130,66,240,0.5)] disabled:opacity-70\"\n >\n {isUploading ? (\n <>\n <Loader2 className=\"w-6 h-6 animate-spin\" />\n <span>{t('processing', language)}</span>\n </>\n ) : (\n <span>{scanSide === 'front' && documentType !== 'passport' ? t('next_back_side', language) : t('confirm', language)}</span>\n )}\n </button>\n <div className=\"w-12 h-12\" /> {/* Spacer for alignment */}\n </>\n ) : (\n <>\n <button className=\"w-12 h-12 rounded-xl dark:bg-white/5 bg-black/5 flex items-center justify-center text-muted\">\n <Flashlight className=\"w-6 h-6\" />\n </button>\n <button\n onClick={handleCapture}\n disabled={!cameraReady}\n className=\"flex-1 bg-brand hover:bg-brand/90 text-white h-14 rounded-2xl flex items-center justify-center gap-2 font-bold text-lg transition-all active:scale-95 shadow-[0_0_25px_rgba(130,66,240,0.5)] disabled:opacity-50\"\n >\n <Camera className=\"w-6 h-6\" />\n <span>{t('capture', language)}</span>\n </button>\n <button className=\"w-12 h-12 rounded-xl dark:bg-white/5 bg-black/5 flex items-center justify-center text-muted\">\n <HelpCircle className=\"w-6 h-6\" />\n </button>\n </>\n )}\n </div>\n <div className=\"w-32 h-1.5 bg-slate-600/30 rounded-full mx-auto mt-8\" />\n </div>\n </motion.div>\n );\n};\n\nexport default DocumentScan;\n","import React, { useState } from 'react';\nimport { motion } from 'framer-motion';\nimport { User, CreditCard, Calendar, Globe, CheckCircle2, Sparkles, AlertCircle, Users } from 'lucide-react';\nimport type { ExtractedDocumentData, DocumentType, Layer3SubmitResponse } from '../types';\n\nimport { t } from '../utils/i18n';\n\ninterface ReviewDataProps {\n requestId: string;\n documentType: DocumentType;\n extractedData: ExtractedDocumentData;\n uploadId: string;\n onNext: (confirmedData: ExtractedDocumentData) => void;\n onRetake?: () => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst getDocumentTypeLabels = (language: string) => ({\n passport: t('passport', language),\n drivers_license: t('drivers_license', language),\n national_id: t('national_id', language)\n});\n\nconst ReviewData: React.FC<ReviewDataProps> = ({\n requestId,\n documentType,\n extractedData,\n uploadId,\n onNext,\n onRetake,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n // Editable fields state - initialize with extracted data\n const [formData, setFormData] = useState({\n firstName: extractedData.first_name || '',\n lastName: extractedData.last_name || '',\n documentNumber: extractedData.document_number || '',\n dateOfBirth: extractedData.date_of_birth || '',\n nationality: extractedData.nationality || '',\n gender: extractedData.gender || ''\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState('');\n\n const handleInputChange = (field: keyof typeof formData, value: string) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n };\n\n const handleConfirm = async () => {\n // Validate required fields\n if (!formData.firstName || !formData.lastName || !formData.documentNumber) {\n setError(t('error_required_fields', language));\n return;\n }\n\n setIsSubmitting(true);\n setError('');\n\n if (previewMode) {\n setTimeout(() => {\n setIsSubmitting(false);\n onNext({\n first_name: formData.firstName,\n last_name: formData.lastName,\n document_number: formData.documentNumber,\n date_of_birth: formData.dateOfBirth,\n nationality: formData.nationality,\n gender: formData.gender,\n document_type: documentType\n });\n }, 1500);\n return;\n }\n\n try {\n // Submit confirmed data to the backend using /layer3/submit endpoint\n const response = await fetch(`${apiBaseUrl}/api/v2/verification/layer3/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({\n upload_id: uploadId,\n liveness_verified: true,\n document_data: {\n first_name: formData.firstName,\n last_name: formData.lastName,\n document_number: formData.documentNumber,\n date_of_birth: formData.dateOfBirth,\n nationality: formData.nationality,\n gender: formData.gender,\n document_type: documentType\n }\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Data submission failed with status ${response.status}`);\n }\n\n const data: Layer3SubmitResponse = await response.json();\n\n if (data.success) {\n // Pass confirmed data to parent\n onNext({\n first_name: formData.firstName,\n last_name: formData.lastName,\n document_number: formData.documentNumber,\n date_of_birth: formData.dateOfBirth,\n nationality: formData.nationality,\n gender: formData.gender,\n document_type: documentType\n });\n } else {\n setError(data.error || 'Failed to submit data. Please try again.');\n setIsSubmitting(false);\n }\n } catch (err) {\n setError('Failed to submit data. Please try again.');\n setIsSubmitting(false);\n onError?.('Data submission failed');\n }\n };\n\n const confidence = extractedData.confidence || 0;\n const confidencePercent = Math.round(confidence * 100);\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n className=\"flex-1 overflow-y-auto px-6 pb-6\"\n >\n {/* Progress bar */}\n <div className=\"flex gap-1 mb-6\">\n {[1, 2, 3, 0].map((fill, i) => (\n <div\n key={i}\n className={`h-1 flex-1 rounded-xl ${fill ? 'bg-brand' : 'bg-brand/20'}`}\n />\n ))}\n </div>\n\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-main mb-2\">{t('review_data', language)}</h1>\n <p className=\"text-muted text-sm leading-relaxed\">\n {t('verify_data_desc', language)}\n </p>\n </div>\n\n {/* Confidence indicator */}\n {confidence > 0 && (\n <div className=\"mb-6 p-3 rounded-xl dark:bg-white/5 bg-black/5 border dark:border-white/10 border-black/5\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-semibold text-muted\">{t('ocr_confidence', language)}</span>\n <span className={`text-xs font-bold ${confidencePercent >= 80 ? 'text-green-500' : confidencePercent >= 60 ? 'text-yellow-500' : 'text-red-500'}`}>\n {confidencePercent}%\n </span>\n </div>\n <div className=\"w-full h-1.5 dark:bg-white/10 bg-black/10 rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${confidencePercent >= 80 ? 'bg-green-500' : confidencePercent >= 60 ? 'bg-yellow-500' : 'bg-red-500'}`}\n style={{ width: `${confidencePercent}%` }}\n />\n </div>\n {confidencePercent < 80 && (\n <p className=\"text-[10px] text-yellow-500 mt-2\">\n {t('verify_data_carefully', language)}\n </p>\n )}\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <div className=\"mb-4 p-3 bg-red-500/20 border border-red-500/30 rounded-xl flex items-center gap-2\">\n <AlertCircle className=\"w-4 h-4 text-red-500 shrink-0\" />\n <p className=\"text-red-400 text-xs font-medium\">{error}</p>\n </div>\n )}\n\n <div className=\"space-y-5\">\n {/* First Name */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('full_name', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <User className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <div className=\"flex flex-col w-full\">\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-slate-300\"\n type=\"text\"\n value={`${formData.firstName} ${formData.lastName}`}\n onChange={(e) => {\n const parts = e.target.value.split(' ');\n handleInputChange('firstName', parts[0] || '');\n handleInputChange('lastName', parts.slice(1).join(' ') || '');\n }}\n placeholder={t('enter_first_name', language)}\n />\n </div>\n </div>\n </div>\n\n {/* Document Number */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('id_number', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <CreditCard className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-slate-300\"\n type=\"text\"\n value={formData.documentNumber}\n onChange={(e) => handleInputChange('documentNumber', e.target.value)}\n placeholder={t('enter_doc_number', language)}\n />\n </div>\n </div>\n\n {/* Date of Birth */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('date_of_birth', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <Calendar className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-slate-300\"\n type=\"text\"\n value={formData.dateOfBirth}\n onChange={(e) => handleInputChange('dateOfBirth', e.target.value)}\n placeholder={t('date_format', language)}\n />\n </div>\n </div>\n\n {/* Nationality */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('nationality', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <Globe className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-slate-300\"\n type=\"text\"\n value={formData.nationality}\n onChange={(e) => handleInputChange('nationality', e.target.value)}\n placeholder={t('enter_nationality', language)}\n />\n </div>\n </div>\n\n {/* Document scan thumbnail */}\n <div className=\"mt-8 relative h-32 w-full rounded-2xl overflow-hidden border border-brand-20 group\">\n <div className=\"absolute inset-0 bg-gradient-to-tr from-brand-20 to-cyan-500/10 blur-sm\" />\n <div className=\"absolute inset-0 bg-brand/10 flex flex-col items-center justify-center p-4\">\n <div className=\"flex items-center gap-3\">\n <CheckCircle2 className=\"text-brand w-5 h-5\" />\n <span className=\"text-xs font-bold dark:text-slate-200 text-slate-700\">\n {t('scanned_successfully', language)}\n </span>\n </div>\n {onRetake && (\n <button\n onClick={onRetake}\n className=\"mt-2 text-[10px] text-brand underline font-medium\"\n type=\"button\"\n >\n {t('retake_photo', language)}\n </button>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"mt-8\">\n <button\n onClick={handleConfirm}\n disabled={isSubmitting}\n className=\"w-full bg-brand hover:bg-brand/90 text-white font-bold py-4 rounded-2xl shadow-lg shadow-brand flex items-center justify-center gap-2 transition-transform active:scale-95 disabled:opacity-70\"\n >\n {isSubmitting ? (\n <>\n <div className=\"w-5 h-5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\n <span>{t('submitting', language)}</span>\n </>\n ) : (\n <>\n <span>{t('confirm_mint', language)}</span>\n <Sparkles className=\"w-5 h-5\" />\n </>\n )}\n </button>\n <p className=\"text-center text-[10px] mt-4 text-slate-500\">\n {t('secured_by_casper', language)}\n </p>\n </div>\n </motion.div>\n );\n};\n\nexport default ReviewData;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { motion } from 'framer-motion';\nimport { Shield, Network, AlertCircle, CheckCircle2, Wallet, Fingerprint } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ntype VerificationTier = 'layer_1' | 'layer_2' | 'layer_3';\n\ninterface MintingIdentityProps {\n tier: VerificationTier;\n sessionToken?: string;\n requestId?: string; // Only needed for L2/L3 submission\n onNext: (result?: { wallet?: string; didAddress?: string; credentialHash?: string }) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n previewMode?: boolean;\n language?: string;\n}\n\ntype MintingStatus = 'processing' | 'minting' | 'completed' | 'failed';\n\n// Tier-specific status messages\nconst getStatusMessages = (tier: VerificationTier, language: string) => {\n if (tier === 'layer_1') {\n return {\n processing: {\n title: t('generating_wallet', language),\n subtitle: t('wallet_subtitle', language)\n },\n minting: {\n title: t('minting_did', language),\n subtitle: t('did_subtitle', language)\n },\n completed: {\n title: t('identity_created', language),\n subtitle: t('identity_created_subtitle', language)\n },\n failed: {\n title: t('setup_failed', language),\n subtitle: t('setup_failed_subtitle', language)\n }\n };\n }\n\n // L2/L3 messages\n return {\n processing: {\n title: tier === 'layer_2' ? t('processing_liveness', language) : t('processing_documents', language),\n subtitle: t('processing_subtitle', language)\n },\n minting: {\n title: t('minting_identity', language),\n subtitle: t('minting_subtitle', language)\n },\n completed: {\n title: t('verification_submitted', language),\n subtitle: t('verification_submitted_subtitle', language)\n },\n failed: {\n title: t('verification_failed', language),\n subtitle: t('verification_failed_subtitle', language)\n }\n };\n};\n\nconst MintingIdentity: React.FC<MintingIdentityProps> = ({\n tier,\n sessionToken,\n requestId,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n previewMode = false,\n language = 'EN'\n}) => {\n const [status, setStatus] = useState<MintingStatus>('processing');\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState('');\n const [wallet, setWallet] = useState<string | null>(null);\n const [didAddress, setDidAddress] = useState<string | null>(null);\n const [credentialHash, setCredentialHash] = useState<string | null>(null);\n const [humanId, setHumanId] = useState<string | null>(null);\n\n // Prevent double execution in React StrictMode\n const hasStartedRef = useRef(false);\n\n const statusMessages = getStatusMessages(tier, language);\n const currentMessage = statusMessages[status];\n\n // Main setup effect\n useEffect(() => {\n if (hasStartedRef.current) return;\n hasStartedRef.current = true;\n\n if (previewMode) {\n runPreviewMode();\n } else {\n runSetup();\n }\n }, []);\n\n // Preview mode simulation\n const runPreviewMode = async () => {\n setStatus('processing');\n setProgress(20);\n await sleep(1000);\n setProgress(50);\n await sleep(1000);\n setStatus('minting');\n setProgress(70);\n await sleep(1000);\n setProgress(100);\n setStatus('completed');\n\n if (tier === 'layer_1') {\n setWallet('account-hash-abc123...');\n setHumanId('casper-user-1234');\n setDidAddress('did:casper:abc123...');\n } else {\n setCredentialHash('mock-credential-hash-xyz');\n }\n\n await sleep(1500);\n onNext({\n wallet: 'account-hash-abc123...',\n didAddress: 'did:casper:abc123...',\n credentialHash: 'mock-credential-hash-xyz'\n });\n };\n\n // Real setup based on tier\n const runSetup = async () => {\n try {\n if (tier === 'layer_1') {\n await runL1Setup();\n } else {\n await runL2L3Setup();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Setup failed';\n setError(message);\n setStatus('failed');\n onError?.(message);\n }\n };\n\n // L1 Setup: Wallet + DID creation (synchronous)\n const runL1Setup = async () => {\n // Step 1: Generate wallet\n setStatus('processing');\n setProgress(10);\n\n const walletResponse = await fetch(`${apiBaseUrl}/api/passkey/wallet/generate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`\n },\n credentials: 'include'\n });\n\n if (!walletResponse.ok) {\n const errorData = await walletResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to generate wallet');\n }\n\n const walletData = await walletResponse.json();\n if (!walletData.success || !walletData.walletInfo?.walletAddress) {\n throw new Error(walletData.error || 'Wallet generation failed');\n }\n\n setWallet(walletData.walletInfo.walletAddress);\n if (walletData.walletInfo.humanId) {\n setHumanId(walletData.walletInfo.humanId);\n }\n setProgress(50);\n\n // Step 2: Mint DID\n setStatus('minting');\n setProgress(60);\n\n const didResponse = await fetch(`${apiBaseUrl}/api/passkey/did/mint`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`\n },\n credentials: 'include'\n });\n\n if (!didResponse.ok) {\n const errorData = await didResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to mint DID');\n }\n\n const didData = await didResponse.json();\n if (!didData.success) {\n throw new Error(didData.error || 'DID minting failed');\n }\n\n setDidAddress(didData.did_address);\n setCredentialHash(didData.transaction_hash);\n setProgress(100);\n setStatus('completed');\n\n // Auto-proceed after showing success\n await sleep(1500);\n onNext({\n wallet: walletData.walletInfo.walletAddress,\n didAddress: didData.did_address,\n credentialHash: didData.transaction_hash\n });\n };\n\n // L2/L3 Setup: Submit verification (no polling)\n const runL2L3Setup = async () => {\n setStatus('processing');\n setProgress(30);\n\n // For L2/L3, we just confirm the submission was successful\n // The actual verification happens in background, user tier upgrades when ready\n await sleep(500);\n setProgress(60);\n\n setStatus('minting');\n setProgress(80);\n\n await sleep(500);\n setProgress(100);\n setStatus('completed');\n\n // Auto-proceed after showing success\n await sleep(1500);\n onNext({ credentialHash: requestId });\n };\n\n const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n const handleRetry = () => {\n setStatus('processing');\n setProgress(0);\n setError('');\n hasStartedRef.current = false;\n\n if (previewMode) {\n runPreviewMode();\n } else {\n runSetup();\n }\n };\n\n // Get tier-specific icon\n const getTierIcon = () => {\n if (tier === 'layer_1') {\n return status === 'minting' ? <Fingerprint className=\"text-brand w-4 h-4\" /> : <Wallet className=\"text-brand w-4 h-4\" />;\n }\n return <Shield className=\"text-brand w-4 h-4\" />;\n };\n\n // Get status label for transaction status\n const getStatusLabel = () => {\n if (tier === 'layer_1') {\n if (status === 'processing') return t('creating_wallet', language);\n if (status === 'minting') return t('minting_did_chain', language);\n if (status === 'completed') return t('identity_live', language);\n } else {\n if (status === 'processing') return t('validating_docs', language);\n if (status === 'minting') return t('submitting_verification', language);\n if (status === 'completed') return t('verification_queued', language);\n }\n return '';\n };\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col items-center justify-center px-8 text-center\"\n >\n {/* Rotating card animation */}\n <div className=\"relative w-64 h-64 flex items-center justify-center mb-12\">\n <div className=\"absolute inset-0 rounded-full border-4 border-dashed border-brand-20 animate-[spin_10s_linear_infinite]\" />\n <div className=\"absolute inset-4 rounded-full border-2 border-[#6DE8EC]/20 animate-[spin_6s_linear_infinite_reverse]\" />\n\n <motion.div\n animate={status !== 'failed' ? { rotateY: [0, 180, 360], y: [-10, 10, -10] } : {}}\n transition={{ duration: 6, repeat: Infinity, ease: 'easeInOut' }}\n className={`relative w-40 h-56 backdrop-blur-xl border rounded-2xl flex flex-col p-4 ${status === 'completed'\n ? 'bg-green-500/10 border-green-500/30 shadow-[0_0_50px_-12px_rgba(34,197,94,0.5)]'\n : status === 'failed'\n ? 'bg-red-500/10 border-red-500/30 shadow-[0_0_50px_-12px_rgba(239,68,68,0.5)]'\n : 'bg-brand/10 border-brand-30 shadow-[0_0_50px_-12px_rgba(114,43,238,0.5)]'\n }`}\n >\n <div className=\"flex justify-between items-start mb-6\">\n <div className={`w-8 h-8 rounded flex items-center justify-center ${status === 'completed'\n ? 'bg-green-500/30'\n : status === 'failed'\n ? 'bg-red-500/30'\n : 'bg-brand/30'\n }`}>\n {status === 'completed' ? (\n <CheckCircle2 className=\"text-green-500 w-4 h-4\" />\n ) : status === 'failed' ? (\n <AlertCircle className=\"text-red-500 w-4 h-4\" />\n ) : (\n getTierIcon()\n )}\n </div>\n <div className={`w-6 h-1 rounded-full ${status === 'completed'\n ? 'bg-green-500/40'\n : status === 'failed'\n ? 'bg-red-500/40'\n : 'bg-brand/40'\n }`} />\n </div>\n <div className=\"space-y-3 mb-auto\">\n <div className={`h-2 w-3/4 rounded-full ${status === 'completed'\n ? 'bg-green-500/20'\n : status === 'failed'\n ? 'bg-red-500/20'\n : 'bg-brand/20'\n }`} />\n <div className={`h-2 w-1/2 rounded-full ${status === 'completed'\n ? 'bg-green-500/20'\n : status === 'failed'\n ? 'bg-red-500/20'\n : 'bg-brand/20'\n }`} />\n </div>\n <div className=\"flex items-center gap-2 mt-4\">\n <div className={`size-6 rounded-full overflow-hidden border border-white/10 ${status === 'completed'\n ? 'bg-gradient-to-tr from-green-500 to-[#6DE8EC]'\n : status === 'failed'\n ? 'bg-gradient-to-tr from-red-500 to-orange-500'\n : 'bg-gradient-to-tr from-brand to-[#6DE8EC]'\n }`} />\n <div className=\"flex flex-col items-start max-w-[80px]\">\n {humanId ? (\n <motion.span \n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"text-[10px] font-bold text-white/90 truncate w-full text-left\"\n >\n {humanId}\n </motion.span>\n ) : (\n <div className=\"h-1.5 w-12 bg-white/20 rounded-full mb-1\" />\n )}\n <div className=\"h-1 w-8 bg-white/10 rounded-full\" />\n </div>\n </div>\n {status !== 'failed' && status !== 'completed' && (\n <motion.div\n animate={{ top: ['0%', '100%', '0%'] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute inset-0 bg-gradient-to-b from-transparent via-brand-10 to-transparent h-1/2 w-full\"\n />\n )}\n </motion.div>\n </div>\n\n <div className=\"space-y-4\">\n <h2 className={`text-2xl font-bold bg-clip-text ${status === 'completed'\n ? 'text-green-500'\n : status === 'failed'\n ? 'text-red-500'\n : 'dark:bg-gradient-to-r dark:from-slate-100 dark:to-slate-400 bg-slate-900 dark:text-transparent text-slate-900'\n }`}>\n {currentMessage.title}\n </h2>\n <p className=\"dark:text-slate-400 text-slate-500 text-sm leading-relaxed max-w-[280px] mx-auto\">\n {currentMessage.subtitle}\n </p>\n </div>\n\n {/* Error with retry button */}\n {status === 'failed' && (\n <div className=\"mt-6 space-y-3\">\n <p className=\"text-red-500 text-sm\">{error}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-3 bg-brand text-white rounded-2xl font-bold\"\n >\n {t('try_again', language)}\n </button>\n </div>\n )}\n\n {/* Wallet/DID display for L1 */}\n {tier === 'layer_1' && wallet && status === 'completed' && (\n <div className=\"mt-6 p-3 dark:bg-white/5 bg-black/5 rounded-xl border dark:border-white/10 border-black/5\">\n <p className=\"text-[10px] text-muted mb-1\">{t('your_wallet', language)}</p>\n <p className=\"text-xs font-mono text-main break-all\">\n {wallet.slice(0, 20)}...{wallet.slice(-10)}\n </p>\n </div>\n )}\n\n {/* Credential hash display for L2/L3 */}\n {tier !== 'layer_1' && credentialHash && status === 'completed' && (\n <div className=\"mt-6 p-3 dark:bg-white/5 bg-black/5 rounded-xl border dark:border-white/10 border-black/5\">\n <p className=\"text-[10px] text-muted mb-1\">{t('verification_id', language)}</p>\n <p className=\"text-xs font-mono text-main break-all\">\n {credentialHash.slice(0, 20)}...\n </p>\n </div>\n )}\n\n {/* Transaction status (only show when not failed) */}\n {status !== 'failed' && (\n <div className=\"w-full mt-12 p-6 dark:bg-brand/5 bg-brand/5 border-t dark:border-white/5 border-black/5\">\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-xs font-medium text-brand uppercase tracking-widest\">\n {tier === 'layer_1' ? t('setup_status', language) : t('transaction_status', language)}\n </span>\n <span className={`text-xs font-bold ${status === 'completed' ? 'text-green-500' : 'text-[#6DE8EC]'\n }`}>\n {t('complete_percent', language).replace('{percent}', progress.toString())}\n </span>\n </div>\n <div className=\"w-full h-1.5 dark:bg-brand/10 bg-brand/10 rounded-full overflow-hidden mb-4\">\n <motion.div\n initial={{ width: '0%' }}\n animate={{ width: `${progress}%` }}\n transition={{ duration: 0.5 }}\n className={`h-full rounded-full ${status === 'completed'\n ? 'bg-gradient-to-r from-green-500 to-[#6DE8EC]'\n : 'bg-gradient-to-r from-brand to-[#6DE8EC]'\n } shadow-[0_0_10px_rgba(114,43,238,0.5)]`}\n />\n </div>\n <div className=\"flex items-center gap-3 px-3 py-2 dark:bg-brand/10 bg-brand/10 rounded-xl border dark:border-brand-10 border-brand-5\">\n <Network className={`w-4 h-4 ${status === 'completed' ? 'text-green-500' : 'text-brand'\n }`} />\n <p className=\"text-[10px] dark:text-slate-300 text-slate-600 font-medium\">\n {getStatusLabel()}\n </p>\n </div>\n </div>\n )}\n </motion.div>\n );\n};\n\nexport default MintingIdentity;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { CheckCircle2, ArrowRight } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface IdentityVerifiedProps {\n onNext: () => void;\n}\n\nconst IdentityVerified: React.FC<IdentityVerifiedProps & { language?: string }> = ({ onNext, language = 'EN' }) => (\n <motion.div\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 1.1 }}\n className=\"flex-1 flex flex-col items-center justify-center px-8 text-center\"\n >\n {/* Success icon with glow */}\n <div className=\"relative mb-10 group\">\n <div className=\"absolute inset-0 bg-[#6fe8ec]/30 rounded-3xl blur-3xl group-hover:blur-2xl transition-all\" />\n <div className=\"relative w-32 h-32 rounded-2xl bg-[#6fe8ec] flex items-center justify-center shadow-[0_0_40px_rgba(111,232,236,0.4)] border-4 dark:border-white border-slate-100\">\n <CheckCircle2 className=\"text-slate-900 w-16 h-16\" />\n </div>\n </div>\n\n <h1 className=\"text-main text-3xl font-bold leading-tight mb-3\">{t('identity_verified', language)}</h1>\n <p className=\"text-muted text-base leading-relaxed mb-12\">\n {t('identity_verified_desc', language)}\n </p>\n\n {/* Data consent toggle */}\n <div className=\"w-full dark:bg-white/5 bg-black/5 rounded-2xl p-5 mb-8 flex items-center justify-between text-left\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-main font-bold text-sm\">{t('share_data_consent', language)}</span>\n <p className=\"text-muted text-xs leading-normal\">{t('authorize_dapps', language)}</p>\n </div>\n <div className=\"w-11 h-6 bg-brand rounded-full relative p-1 cursor-pointer\">\n <div className=\"absolute right-1 top-1 size-4 bg-white rounded-full\" />\n </div>\n </div>\n\n <button\n onClick={onNext}\n className=\"w-full bg-[#6fe8ec] hover:brightness-105 active:scale-[0.98] transition-all text-slate-900 font-bold py-4 rounded-2xl shadow-lg shadow-[#6fe8ec]/20 flex items-center justify-center gap-2\"\n >\n {t('return_to_app', language)}\n <ArrowRight className=\"w-5 h-5\" />\n </button>\n </motion.div>\n);\n\nexport default IdentityVerified;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { ShieldCheck, CheckCircle2, Verified } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface PermissionsRequestProps {\n appName?: string;\n appLogo?: string;\n onApprove: () => void;\n onDeny: () => void;\n language?: string;\n}\n\nconst permissions = [\n 'perm_identity',\n 'perm_profile',\n 'perm_kyc',\n];\n\nconst PermissionsRequest: React.FC<PermissionsRequestProps> = ({\n appName = 'This App',\n appLogo,\n onApprove,\n onDeny,\n language = 'EN',\n}) => (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n className=\"flex-1 px-8 pt-8 flex flex-col items-center\"\n >\n <div className=\"flex flex-col items-center gap-4 mb-10\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 rounded-full shadow-[0_0_20px_rgba(134,81,225,0.3)] animate-pulse\" />\n <div className=\"relative w-24 h-24 rounded-full border-2 border-brand-40 p-1 dark:bg-black/50 bg-white\">\n {appLogo ? (\n <div className=\"w-full h-full rounded-full overflow-hidden\">\n <img src={appLogo} alt={appName} className=\"w-full h-full object-cover\" />\n </div>\n ) : (\n <div className=\"w-full h-full rounded-full bg-gradient-to-br from-emerald-500 to-teal-700 flex items-center justify-center text-white font-bold text-2xl\">\n {appName.slice(0, 2).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight text-main\">{appName}</h1>\n <p className=\"text-brand/70 text-sm font-medium mt-1 uppercase tracking-wider\">{t('requesting_access', language)}</p>\n </div>\n </div>\n\n <div className=\"w-full space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-widest text-slate-500 mb-4 px-1\">\n {t('permission_request', language)}\n </h3>\n {permissions.map((perm) => (\n <div\n key={perm}\n className=\"flex items-center gap-4 p-4 rounded-2xl dark:bg-white/5 bg-black/5 transition-all\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-cyan-400/10 text-cyan-400 shrink-0\">\n <CheckCircle2 className=\"w-5 h-5\" />\n </div>\n <p className=\"text-sm font-medium text-main\">{t(perm, language)}</p>\n </div>\n ))}\n </div>\n\n <div className=\"mt-8 flex gap-3 p-4 rounded-2xl dark:bg-brand/5 bg-brand/5\">\n <ShieldCheck className=\"text-brand w-5 h-5 shrink-0\" />\n <p className=\"text-xs leading-relaxed text-muted\">\n <span className=\"font-bold text-main\">{t('privacy_note', language)}:</span> {t('privacy_desc', language)}\n </p>\n </div>\n\n <footer className=\"mt-auto w-full pb-8 flex flex-col gap-3\">\n <button\n onClick={onApprove}\n className=\"w-full py-4 rounded-2xl bg-brand hover:bg-brand-90 text-white font-bold text-base shadow-xl shadow-brand transition-all flex items-center justify-center gap-2\"\n >\n {t('approve_verify', language)}\n <Verified className=\"w-5 h-5\" />\n </button>\n <button\n onClick={onDeny}\n className=\"w-full py-3 rounded-2xl bg-transparent dark:hover:bg-white/5 hover:bg-black/5 dark:text-slate-400 text-slate-500 font-semibold text-sm transition-all\"\n >\n {t('deny', language)}\n </button>\n </footer>\n </motion.div>\n);\n\nexport default PermissionsRequest;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\n\nimport GlassContainer from './shared/GlassContainer';\nimport Header from './shared/Header';\nimport Footer from './shared/Footer';\n\nimport AuthSelection from './screens/AuthSelection';\nimport Login from './screens/Login';\nimport PasskeyAuth from './screens/PasskeyAuth';\nimport PasskeyRegister from './screens/PasskeyRegister';\nimport PinVerification from './screens/PinVerification';\nimport SecurityUpgrade from './screens/SecurityUpgrade';\nimport FaceScan from './screens/FaceScan';\nimport VerifyIdentityChoice from './screens/VerifyIdentityChoice';\nimport DocumentScan from './screens/DocumentScan';\nimport ReviewData from './screens/ReviewData';\nimport MintingIdentity from './screens/MintingIdentity';\nimport IdentityVerified from './screens/IdentityVerified';\nimport PermissionsRequest from './screens/PermissionsRequest';\n\nimport type {\n CasperIDModalProps,\n Screen,\n SDKMode,\n OTPState,\n KYCState,\n DocumentType,\n ExtractedDocumentData,\n StartVerificationResponse,\n AuthState,\n PasskeyAuthCompleteResponse,\n PasskeyRegisterCompleteResponse,\n AppMetadata,\n AppMetadataResponse,\n CasperIDTheme\n} from './types';\n\n// Resolve 'system' mode to actual light/dark\nfunction resolveMode(mode: SDKMode = 'light'): 'light' | 'dark' {\n if (mode === 'system') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return mode;\n}\n\nconst FOOTER_SCREENS: Screen[] = ['AuthSelection', 'Login', 'PasskeyAuth', 'PinVerification', 'PasskeyRegister'];\n\n// Default API base URL\nconst DEFAULT_API_BASE_URL = 'https://apis.casperid.com';\n\n// Initial KYC state\nconst initialKYCState: KYCState = {\n requestId: '',\n verificationTier: 'layer_3'\n};\n\nexport const CasperIDModal: React.FC<CasperIDModalProps> = ({\n isOpen,\n apiKey,\n theme = {},\n requiredTier,\n onSuccess,\n onClose,\n onError,\n mode = 'login',\n previewMode = false,\n initialScreen,\n apiBaseUrl,\n termsUrl = '#',\n privacyUrl = '#',\n logoUrl,\n language = 'EN',\n layout,\n}) => {\n const [cloudTheme, setCloudTheme] = useState<CasperIDTheme>({});\n // Track loading state for cloud theme - prevents flash of default colors\n const [isLoadingCloudTheme, setIsLoadingCloudTheme] = useState(!previewMode && !!apiKey);\n\n const {\n primaryColor: propPrimaryColor,\n borderRadius: propBorderRadius,\n fontFamily: propFontFamily,\n mode: themeMode = 'light',\n layout: propLayout,\n } = theme;\n\n // Merge cloud theme with props (props take precedence)\n const primaryColor = propPrimaryColor || cloudTheme.primaryColor || '#8651e1';\n const borderRadius = propBorderRadius || cloudTheme.borderRadius || '12';\n const fontFamily = propFontFamily || cloudTheme.fontFamily || 'Inter';\n const finalLayout = layout || propLayout || cloudTheme.layout || 'auto';\n\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>(resolveMode(themeMode));\n const [screen, setScreen] = useState<Screen>(\n initialScreen ?? (mode === 'verify' ? 'SecurityUpgrade' : 'AuthSelection')\n );\n\n // OTP flow state\n const [otpState, setOtpState] = useState<OTPState>({ email: '', verificationId: '' });\n const [sessionToken, setSessionToken] = useState<string | null>(null);\n\n // Auth state - tracks user status through the flow\n const [authState, setAuthState] = useState<AuthState>({\n email: '',\n userExists: false,\n hasPasskey: false,\n userAccount: null\n });\n\n // KYC flow state\n const [kycState, setKycState] = useState<KYCState>(initialKYCState);\n const [uploadId, setUploadId] = useState<string>('');\n const [credentialHash, setCredentialHash] = useState<string>('');\n const [appMetadata, setAppMetadata] = useState<AppMetadata | null>(null);\n\n // API base URL - use custom URL if provided, otherwise default\n const finalApiBaseUrl = apiBaseUrl || DEFAULT_API_BASE_URL;\n\n // Normalize border radius to always have 'px' suffix\n const normalizedRadius = borderRadius.toString().endsWith('px')\n ? borderRadius.toString()\n : `${borderRadius}px`;\n\n // Normalize font family\n const normalizedFont = fontFamily.includes(' ')\n ? `\"${fontFamily}\", sans-serif`\n : `${fontFamily}, sans-serif`;\n\n // Generate a unique ID for scoped styles\n const modalId = React.useId().replace(/:/g, '');\n\n // Apply CSS variables + theme class to the modal root\n const cssVars = {\n '--casperid-primary': primaryColor,\n '--casperid-radius': normalizedRadius,\n '--casperid-font': normalizedFont,\n } as React.CSSProperties;\n\n // Generate a unique key for the style element to force re-application when theme changes\n const styleKey = `${modalId}-${primaryColor}-${normalizedRadius}-${normalizedFont}`;\n\n // Generate scoped CSS for proper variable inheritance with !important to override :root defaults\n const scopedStyles = `\n #casperid-modal-${modalId},\n #casperid-modal-${modalId} * {\n --casperid-primary: ${primaryColor} !important;\n --casperid-radius: ${normalizedRadius} !important;\n --casperid-font: ${normalizedFont} !important;\n }\n `;\n\n // Sync system theme\n useEffect(() => {\n if (themeMode === 'system') {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setResolvedTheme(e.matches ? 'dark' : 'light');\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n } else {\n setResolvedTheme(resolveMode(themeMode));\n }\n }, [themeMode]);\n\n // Sync screen in previewMode when initialScreen prop changes\n useEffect(() => {\n if (previewMode && initialScreen) {\n setScreen(initialScreen);\n }\n }, [previewMode, initialScreen]);\n\n // Reset to first screen when opened (for real usage)\n useEffect(() => {\n if (isOpen && !previewMode) {\n setScreen(initialScreen ?? (mode === 'verify' ? 'SecurityUpgrade' : 'AuthSelection'));\n setOtpState({ email: '', verificationId: '' });\n setSessionToken(null);\n setAuthState({ email: '', userExists: false, hasPasskey: false, userAccount: null });\n setKycState(initialKYCState);\n setUploadId('');\n setCredentialHash('');\n }\n }, [isOpen, mode, previewMode, initialScreen]);\n\n // Fetch App Metadata on mount\n useEffect(() => {\n if (!apiKey || previewMode) {\n setIsLoadingCloudTheme(false);\n return;\n }\n\n const fetchAppMetadata = async () => {\n try {\n const response = await fetch(`${finalApiBaseUrl}/api/business/app-metadata/${apiKey}`);\n if (response.ok) {\n const data: AppMetadataResponse = await response.json();\n if (data.success && data.app) {\n setAppMetadata(data.app);\n // Apply brand theme from cloud\n if (data.app.theme) {\n setCloudTheme({\n primaryColor: data.app.theme.primaryColor,\n borderRadius: data.app.theme.borderRadius,\n fontFamily: data.app.theme.fontFamily,\n layout: data.app.theme.layout\n });\n }\n }\n }\n } catch (err) {\n console.warn('[CasperID] Failed to fetch app metadata:', err);\n } finally {\n setIsLoadingCloudTheme(false);\n }\n };\n\n fetchAppMetadata();\n }, [apiKey, finalApiBaseUrl, previewMode]);\n\n const toggleTheme = () =>\n setResolvedTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n\n const go = useCallback((next: Screen) => setScreen(next), []);\n\n // Start KYC verification flow\n const startVerification = useCallback(async (tier: 'layer_2' | 'layer_3') => {\n try {\n // Use the correct endpoint for each layer\n const endpoint = tier === 'layer_2'\n ? `${apiBaseUrl}/api/v2/verification/layer2/start`\n : `${apiBaseUrl}/api/v2/verification/layer3/start`;\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey\n },\n credentials: 'include',\n body: JSON.stringify({\n purpose: 'sdk_verification',\n ...(tier === 'layer_3' ? { verificationMethod: 'document' } : {})\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Request failed with status ${response.status}`);\n }\n\n const data: StartVerificationResponse = await response.json();\n\n if (data.success && data.verification) {\n setKycState(prev => ({\n ...prev,\n requestId: data.verification!.requestId,\n verificationTier: tier\n }));\n return data.verification.requestId;\n } else {\n throw new Error(data.error || 'Failed to start verification');\n }\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to start verification'));\n return null;\n }\n }, [apiBaseUrl, apiKey, onError]);\n\n // Handle successful OTP verification - new user needs passkey registration\n const handleOTPSuccess = useCallback((token: string, userAccount?: AuthState['userAccount'], businessToken?: string) => {\n setSessionToken(token);\n setAuthState(prev => ({\n ...prev,\n sessionToken: token,\n businessToken: businessToken,\n userAccount: userAccount || null\n }));\n\n // Check if user already has L1 setup (wallet + DID)\n if (userAccount?.wallet && userAccount?.did_address) {\n // User has L1, check if they need passkey registration\n if (!authState.hasPasskey) {\n go('PasskeyRegister');\n } else {\n // Has passkey and L1, check tier requirements\n proceedBasedOnTier(userAccount.tier);\n }\n } else {\n // New user - needs passkey registration then L1 setup\n go('PasskeyRegister');\n }\n }, [go, authState.hasPasskey]);\n\n // Handle passkey user detected (returning user with passkey)\n const handlePasskeyUser = useCallback((email: string) => {\n setAuthState(prev => ({ ...prev, email, hasPasskey: true, userExists: true }));\n go('PasskeyAuth');\n }, [go]);\n\n // Handle successful passkey authentication (returning user)\n const handlePasskeyAuthSuccess = useCallback((token: string, user?: PasskeyAuthCompleteResponse['user'], businessToken?: string) => {\n setSessionToken(token);\n setAuthState(prev => ({\n ...prev,\n sessionToken: token,\n businessToken: businessToken,\n userAccount: user ? {\n user_id: user.user_id,\n wallet: user.wallet,\n tier: user.tier,\n did_address: user.did_address\n } : null\n }));\n\n // Returning user - check tier requirements\n proceedBasedOnTier(user?.tier);\n }, []);\n\n // Handle successful passkey registration (new user)\n const handlePasskeyRegisterSuccess = useCallback((user?: PasskeyRegisterCompleteResponse['user'], businessToken?: string) => {\n setAuthState(prev => ({\n ...prev,\n hasPasskey: true,\n businessToken: businessToken,\n userAccount: user ? {\n user_id: user.user_id,\n tier: user.tier\n } : prev.userAccount\n }));\n\n // After passkey registration, proceed to MintingIdentity for L1 setup\n go('MintingIdentity');\n }, [go]);\n\n // Determine next step based on user's tier and required tier\n const proceedBasedOnTier = useCallback((currentTier?: string) => {\n const tier = currentTier || 'layer_0';\n\n // If no specific tier required, or user meets requirement, go to success\n if (!requiredTier) {\n go('IdentityVerified');\n return;\n }\n\n // Map requiredTier to layer format\n const requiredLayer = requiredTier === 'L1' ? 'layer_1' :\n requiredTier === 'L2' ? 'layer_2' :\n requiredTier === 'L3' ? 'layer_3' : 'layer_1';\n\n // Check if user already meets the requirement\n const tierOrder = ['layer_0', 'layer_1', 'layer_2', 'layer_3'];\n const currentIndex = tierOrder.indexOf(tier);\n const requiredIndex = tierOrder.indexOf(requiredLayer);\n\n if (currentIndex >= requiredIndex) {\n // User meets requirement\n go('IdentityVerified');\n } else if (requiredIndex >= 2) {\n // Need L2 or L3 - start with SecurityUpgrade prompt\n go('SecurityUpgrade');\n } else {\n // Just need L1, which should be done by now\n go('IdentityVerified');\n }\n }, [requiredTier, go]);\n\n // Handle MintingIdentity completion (wallet + DID created for L1, or verification submitted for L2/L3)\n const handleMintingSuccess = useCallback(async (result?: { wallet?: string; didAddress?: string; credentialHash?: string }) => {\n if (result?.wallet) {\n setAuthState(prev => ({\n ...prev,\n userAccount: {\n ...prev.userAccount,\n user_id: prev.userAccount?.user_id || '',\n wallet: result.wallet,\n did_address: result.didAddress,\n tier: 'layer_1'\n }\n }));\n }\n\n if (result?.credentialHash) {\n setCredentialHash(result.credentialHash);\n }\n\n // REFRESH TOKEN: Get a fresh token that includes the new verified wallet and humanId\n if (sessionToken && !previewMode) {\n try {\n const response = await fetch(`${finalApiBaseUrl}/api/casperid/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token: sessionToken, apiKey })\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.token) {\n console.log('[CasperID SDK] Token refreshed after verification');\n setSessionToken(data.token);\n setAuthState(prev => ({\n ...prev,\n sessionToken: data.token,\n businessToken: data.business_token || prev.businessToken\n }));\n }\n }\n } catch (err) {\n console.warn('[CasperID SDK] Failed to refresh token after verification:', err);\n }\n }\n\n // Check tier requirements after minting\n const currentTier = result?.wallet ? 'layer_1' : (authState.userAccount?.tier || 'layer_1');\n proceedBasedOnTier(currentTier);\n }, [authState.userAccount?.tier, proceedBasedOnTier, sessionToken, finalApiBaseUrl, previewMode]);\n\n // Handle extension login success\n const handleExtensionSuccess = useCallback((userData: any) => {\n // Extension auth is complete - use token from extension if provided\n const token = userData?.sessionToken || userData?.token;\n const bToken = userData?.business_token || userData?.businessToken;\n\n if (token) {\n setSessionToken(token);\n }\n\n if (bToken) {\n setAuthState(prev => ({ ...prev, businessToken: bToken }));\n }\n\n // Skip to appropriate screen based on user's tier\n go('SecurityUpgrade');\n }, [go]);\n\n // Handle SecurityUpgrade start\n const handleSecurityUpgradeNext = useCallback(async () => {\n // Start Layer 2 verification (face scan)\n const requestId = await startVerification('layer_2');\n if (requestId) {\n go('FaceScan');\n }\n }, [startVerification, go]);\n\n // Handle FaceScan completion\n const handleFaceScanNext = useCallback(async (livenessVerified: boolean) => {\n setKycState(prev => ({ ...prev, livenessVerified }));\n\n // Check if we need Layer 3 (document verification)\n if (requiredTier === 'L3') {\n // Start Layer 3 verification\n const requestId = await startVerification('layer_3');\n if (requestId) {\n go('VerifyIdentityChoice');\n }\n } else {\n // Layer 2 complete, go to minting\n go('MintingIdentity');\n }\n }, [requiredTier, startVerification, go]);\n\n // Handle document type selection\n const handleDocumentTypeSelected = useCallback((documentType: DocumentType) => {\n setKycState(prev => ({ ...prev, documentType }));\n go('DocumentScan');\n }, [go]);\n\n // Handle document scan completion\n const handleDocumentScanNext = useCallback((extractedData: ExtractedDocumentData, docUploadId: string) => {\n setKycState(prev => ({ ...prev, extractedData }));\n setUploadId(docUploadId);\n go('ReviewData');\n }, [go]);\n\n // Handle review data confirmation\n const handleReviewDataNext = useCallback((confirmedData: ExtractedDocumentData) => {\n setKycState(prev => ({ ...prev, extractedData: confirmedData }));\n go('MintingIdentity');\n }, [go]);\n\n // Handle document retake\n const handleDocumentRetake = useCallback(() => {\n setKycState(prev => ({ ...prev, extractedData: undefined }));\n setUploadId('');\n go('DocumentScan');\n }, [go]);\n\n\n // Handle final success (after permissions approved)\n const handleSuccess = useCallback(() => {\n if (!sessionToken) {\n onError?.(new Error('No valid session token available'));\n return;\n }\n onSuccess?.(sessionToken, {\n businessToken: authState.businessToken\n });\n onClose?.();\n }, [sessionToken, authState.businessToken, onSuccess, onClose, onError]);\n\n // Handle errors\n const handleError = useCallback((error: string) => {\n onError?.(new Error(error));\n }, [onError]);\n\n // Login screen handlers\n const handleLoginNext = useCallback((email: string, verificationId: string) => {\n setOtpState({ email, verificationId });\n setAuthState(prev => ({ ...prev, email }));\n go('PinVerification');\n }, [go]);\n\n if (!isOpen && !previewMode) return null;\n\n // Show loading state while fetching cloud theme (prevents flash of default colors)\n if (isLoadingCloudTheme && !previewMode) {\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\"\n style={{ backgroundColor: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(6px)' }}\n >\n <div className=\"w-12 h-12 border-3 border-white/20 border-t-white/80 rounded-full animate-spin\" />\n </div>\n );\n }\n\n // Render screen content\n const renderScreen = () => {\n switch (screen) {\n case 'AuthSelection':\n return (\n <AuthSelection\n onNext={(method) => go(method === 'otp' ? 'Login' : 'SecurityUpgrade')}\n onExtensionSuccess={handleExtensionSuccess}\n onError={handleError}\n language={language}\n />\n );\n case 'Login':\n return (\n <Login\n onNext={handleLoginNext}\n onPasskeyUser={handlePasskeyUser}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'PasskeyAuth':\n return (\n <PasskeyAuth\n email={authState.email}\n onSuccess={handlePasskeyAuthSuccess}\n onError={handleError}\n onFallbackToOTP={() => go('Login')}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'PasskeyRegister':\n return (\n <PasskeyRegister\n email={authState.email || otpState.email}\n sessionToken={sessionToken || ''}\n onSuccess={handlePasskeyRegisterSuccess}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'PinVerification':\n return (\n <PinVerification\n email={otpState.email}\n verificationId={otpState.verificationId}\n onNext={handleOTPSuccess}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'SecurityUpgrade':\n return (\n <SecurityUpgrade\n onNext={handleSecurityUpgradeNext}\n onSkip={() => go('IdentityVerified')}\n language={language}\n />\n );\n case 'FaceScan':\n return (\n <FaceScan\n requestId={kycState.requestId}\n onNext={handleFaceScanNext}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'VerifyIdentityChoice':\n return (\n <VerifyIdentityChoice\n onNext={handleDocumentTypeSelected}\n language={language}\n />\n );\n case 'DocumentScan':\n return (\n <DocumentScan\n requestId={kycState.requestId}\n documentType={kycState.documentType || 'passport'}\n onNext={handleDocumentScanNext}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'ReviewData':\n return (\n <ReviewData\n requestId={kycState.requestId}\n documentType={kycState.documentType || 'passport'}\n extractedData={kycState.extractedData || {}}\n uploadId={uploadId}\n onNext={handleReviewDataNext}\n onRetake={handleDocumentRetake}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'MintingIdentity':\n // Determine the tier based on current state\n const mintingTier = kycState.requestId ? kycState.verificationTier : 'layer_1';\n return (\n <MintingIdentity\n tier={mintingTier}\n sessionToken={sessionToken || ''}\n requestId={kycState.requestId}\n onNext={handleMintingSuccess}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'IdentityVerified':\n return <IdentityVerified onNext={() => go('PermissionsRequest')} language={language} />;\n case 'PermissionsRequest':\n return (\n <PermissionsRequest\n onApprove={handleSuccess}\n onDeny={() => onClose?.()}\n language={language}\n appName={appMetadata?.name}\n appLogo={logoUrl || appMetadata?.logo_url}\n />\n );\n default:\n return null;\n }\n };\n\n // In previewMode, render the card directly (no fixed overlay)\n if (previewMode) {\n return (\n <>\n <style key={styleKey}>{scopedStyles}</style>\n <div id={`casperid-modal-${modalId}`} style={cssVars} className={`relative ${resolvedTheme}`}>\n <GlassContainer className=\"backdrop-blur-3xl\" theme={resolvedTheme}>\n <Header\n onClose={onClose}\n showClose={screen !== 'AuthSelection'}\n subtitle={screen === 'PermissionsRequest' ? 'PERMISSION REQUEST' : 'SECURE SDK'}\n theme={resolvedTheme}\n toggleTheme={toggleTheme}\n />\n <div className=\"flex-1 flex flex-col relative overflow-hidden\">\n <AnimatePresence mode=\"wait\">\n <motion.div key={screen} className=\"flex-1 flex flex-col\">\n {renderScreen()}\n </motion.div>\n </AnimatePresence>\n </div>\n {FOOTER_SCREENS.includes(screen) && (\n <Footer>\n <p className=\"text-[11px] text-slate-500 font-medium\">\n By connecting, you agree to our{' '}\n <a className=\"text-brand hover:underline ml-1\" href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">Terms of Service</a>\n {' '}&{' '}\n <a className=\"text-brand hover:underline ml-1\" href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a>\n </p>\n </Footer>\n )}\n </GlassContainer>\n </div>\n </>\n );\n }\n\n return (\n <>\n <style key={styleKey}>{scopedStyles}</style>\n {/* Overlay backdrop — sits on top of the host app */}\n <div\n className={`fixed inset-0 z-[9999] flex items-center justify-center ${finalLayout === 'fullscreen' ? 'p-0' : 'p-4'}`}\n style={{ backgroundColor: finalLayout === 'fullscreen' ? 'transparent' : 'rgba(0,0,0,0.6)', backdropFilter: finalLayout === 'fullscreen' ? 'none' : 'blur(6px)' }}\n onClick={(e) => e.target === e.currentTarget && onClose?.()}\n >\n {/* Ambient glows — inside the overlay, behind the card */}\n {finalLayout !== 'fullscreen' && (\n <div className=\"absolute inset-0 pointer-events-none overflow-hidden\">\n <div\n className=\"absolute top-[-10%] left-[-10%] w-[60%] h-[40%] rounded-full blur-[120px]\"\n style={{ backgroundColor: `${primaryColor}1a` }}\n />\n <div className=\"absolute bottom-[-5%] right-[-5%] w-[50%] h-[30%] bg-[#6DE8EC]/5 blur-[100px] rounded-full\" />\n </div>\n )}\n\n {/* The glass modal card */}\n <motion.div\n id={`casperid-modal-${modalId}`}\n initial={finalLayout === 'fullscreen' ? { opacity: 0 } : { opacity: 0, scale: 0.95, y: 20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={finalLayout === 'fullscreen' ? { opacity: 0 } : { opacity: 0, scale: 0.95, y: 20 }}\n transition={{ type: 'spring', damping: 28, stiffness: 300 }}\n style={cssVars}\n className={`relative selection:bg-brand/30 ${resolvedTheme} ${finalLayout === 'fullscreen' ? 'w-full h-full' : ''}`}\n >\n <GlassContainer className={`backdrop-blur-3xl ${finalLayout === 'fullscreen' ? 'w-full h-full rounded-none' : ''}`} theme={resolvedTheme}>\n <Header\n onClose={onClose}\n showClose={screen !== 'AuthSelection'}\n subtitle={screen === 'PermissionsRequest' ? 'PERMISSION REQUEST' : 'SECURE SDK'}\n theme={resolvedTheme}\n toggleTheme={toggleTheme}\n />\n\n <div className=\"flex-1 flex flex-col relative overflow-hidden\">\n <AnimatePresence mode=\"wait\">\n <motion.div key={screen} className=\"flex-1 flex flex-col\">\n {renderScreen()}\n </motion.div>\n </AnimatePresence>\n </div>\n\n {/* Footer with ToS links, shown on early screens */}\n {FOOTER_SCREENS.includes(screen) && (\n <Footer>\n <p className=\"text-[11px] text-slate-500 font-medium\">\n By connecting, you agree to our{' '}\n <a className=\"text-brand hover:underline ml-1\" href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Terms of Service\n </a>{' '}\n &{' '}\n <a className=\"text-brand hover:underline ml-1\" href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Privacy Policy\n </a>\n </p>\n </Footer>\n )}\n </GlassContainer>\n </motion.div>\n </div>\n </>\n );\n};\n\nexport default CasperIDModal;\n","/**\n * Fetch wrapper with timeout support\n * @param url - The URL to fetch\n * @param options - Fetch options\n * @param timeout - Timeout in milliseconds (default: 30000)\n * @returns Promise<Response>\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeout: number = 30000\n): Promise<Response> {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal\n });\n return response;\n } finally {\n clearTimeout(id);\n }\n}\n\n/**\n * Error class for API errors with status code\n */\nexport class ApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n }\n}\n\n/**\n * Helper to handle API response and throw on error\n */\nexport async function handleApiResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new ApiError(\n errorData.error || errorData.message || `Request failed with status ${response.status}`,\n response.status\n );\n }\n return response.json();\n}\n"],"names":["GlassContainer","children","className","theme","jsx","toKebabCase","string","mergeClasses","classes","index","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","ArrowRight","BadgeCheck","Calendar","Camera","ChevronRight","CircleAlert","CircleCheck","CircleHelp","CreditCard","Delete","Fingerprint","Flashlight","Globe","Key","LoaderCircle","Lock","Mail","Moon","Network","Puzzle","RefreshCw","RotateCcw","ShieldCheck","Shield","Smartphone","Sparkles","Sun","User","Wallet","X","Header","onClose","title","subtitle","showClose","toggleTheme","logoUrl","jsxs","Footer","translations","key","lang","language","AuthSelection","onNext","onExtensionSuccess","onError","isCheckingExtension","setIsCheckingExtension","useState","extensionInstalled","setExtensionInstalled","error","setError","useEffect","checkExtensionInstalled","handleExtensionLogin","event","useCallback","anchor","storedUser","anchorAfterDelay","isValidUserData","data","userData","handleOTPLogin","motion","AlertCircle","Loader2","Login","onPasskeyUser","apiBaseUrl","previewMode","email","setEmail","isLoading","setIsLoading","handleSubmit","response","errorData","errorMessage","handleKeyDown","e","Fragment","Verified","arrayBufferToBase64url","buffer","bytes","binary","i","base64urlToArrayBuffer","base64url","padding","base64","binaryString","isWebAuthnSupported","isPlatformAuthenticatorAvailable","detectDeviceType","userAgent","getDeviceInfo","prepareRegistrationOptions","serverOptions","_a","cred","prepareAuthenticationOptions","formatRegistrationCredential","credential","formatAuthenticationCredential","createPasskey","options","preparedOptions","authenticateWithPasskey","PasskeyAuth","onSuccess","onFallbackToOTP","isSupported","setIsSupported","autoTriggered","setAutoTriggered","supported","platformAvailable","timer","handleAuthenticate","initResponse","initData","completeResponse","completeData","err","message","PasskeyRegister","sessionToken","onSkip","isSuccess","setIsSuccess","handleRegister","benefits","benefit","CheckCircle2","PinVerification","verificationId","apiKey","pin","setPin","isVerifying","setIsVerifying","isResending","setIsResending","resendCooldown","setResendCooldown","currentVerificationId","setCurrentVerificationId","digit","handleVerify","handleDigitPress","prev","newPin","emptyIndex","d","handleDelete","otp","handleResend","maskedEmail","num","SecurityUpgrade","instructions","FaceScan","requestId","videoRef","useRef","canvasRef","streamRef","framesRef","step","setStep","cameraReady","setCameraReady","isProcessing","setIsProcessing","cameraPermissionDenied","setCameraPermissionDenied","stream","track","canvas","video","ctx","resolve","blob","frame","submitLiveness","formData","handleRetry","AnimatePresence","docs","VerifyIdentityChoice","id","desc","getDocumentTypeLabels","DocumentScan","documentType","capturedImage","setCapturedImage","capturedImageUrl","setCapturedImageUrl","isUploading","setIsUploading","scanSide","setScanSide","frontImage","setFrontImage","handleCapture","handleRetake","handleConfirm","HelpCircle","ReviewData","extractedData","uploadId","onRetake","setFormData","isSubmitting","setIsSubmitting","handleInputChange","field","value","confidence","confidencePercent","fill","parts","getStatusMessages","tier","MintingIdentity","status","setStatus","progress","setProgress","wallet","setWallet","didAddress","setDidAddress","credentialHash","setCredentialHash","humanId","setHumanId","hasStartedRef","currentMessage","runPreviewMode","runSetup","sleep","runL1Setup","runL2L3Setup","walletResponse","walletData","didResponse","didData","ms","getTierIcon","getStatusLabel","IdentityVerified","permissions","PermissionsRequest","appName","appLogo","onApprove","onDeny","perm","resolveMode","mode","FOOTER_SCREENS","DEFAULT_API_BASE_URL","initialKYCState","CasperIDModal","isOpen","requiredTier","initialScreen","termsUrl","privacyUrl","layout","cloudTheme","setCloudTheme","isLoadingCloudTheme","setIsLoadingCloudTheme","propPrimaryColor","propBorderRadius","propFontFamily","themeMode","propLayout","primaryColor","borderRadius","fontFamily","finalLayout","resolvedTheme","setResolvedTheme","screen","setScreen","otpState","setOtpState","setSessionToken","authState","setAuthState","kycState","setKycState","setUploadId","appMetadata","setAppMetadata","finalApiBaseUrl","normalizedRadius","normalizedFont","modalId","React","cssVars","styleKey","scopedStyles","mq","handler","go","next","startVerification","endpoint","handleOTPSuccess","token","userAccount","businessToken","proceedBasedOnTier","handlePasskeyUser","handlePasskeyAuthSuccess","user","handlePasskeyRegisterSuccess","currentTier","requiredLayer","tierOrder","currentIndex","requiredIndex","handleMintingSuccess","result","handleExtensionSuccess","bToken","handleSecurityUpgradeNext","handleFaceScanNext","livenessVerified","handleDocumentTypeSelected","handleDocumentScanNext","docUploadId","handleReviewDataNext","confirmedData","handleDocumentRetake","handleSuccess","handleError","handleLoginNext","renderScreen","method","mintingTier","fetchWithTimeout","url","timeout","controller","ApiError","handleApiResponse"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]}
|